Spaces:
Runtime error
Runtime error
Commit ·
cfc9601
0
Parent(s):
Initial commit: usb version
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- next/.gitignore +43 -0
- next/Edupath_Final_Database.csv +0 -0
- next/International_Education_Costs.csv +908 -0
- next/QS World University Rankings 2025.csv +0 -0
- next/README.md +36 -0
- next/components.json +22 -0
- next/eslint.config.mjs +18 -0
- next/fetch_real_fees.py +153 -0
- next/fill_database.py +104 -0
- next/fill_tuition.py +117 -0
- next/global.d.ts +1 -0
- next/merge_data.py +199 -0
- next/next.config.ts +8 -0
- next/package-lock.json +0 -0
- next/package.json +52 -0
- next/postcss.config.mjs +7 -0
- next/prisma/schema.prisma +120 -0
- next/public/file.svg +1 -0
- next/public/globe.svg +1 -0
- next/public/next.svg +1 -0
- next/public/vercel.svg +1 -0
- next/public/window.svg +1 -0
- next/scripts/import_universities.ts +71 -0
- next/scripts/upsert_us_fees.ts +86 -0
- next/src/app/about-us/page.tsx +186 -0
- next/src/app/api/auth/login/route.ts +34 -0
- next/src/app/api/auth/register/route.ts +44 -0
- next/src/app/api/universities/route.ts +45 -0
- next/src/app/blogs/page.tsx +166 -0
- next/src/app/contact-us/page.tsx +239 -0
- next/src/app/dashboard/compare/page.tsx +178 -0
- next/src/app/dashboard/layout.tsx +27 -0
- next/src/app/dashboard/page.tsx +98 -0
- next/src/app/dashboard/roadmap/page.tsx +482 -0
- next/src/app/dashboard/university/[id]/page.tsx +214 -0
- next/src/app/dashboard/university/page.tsx +151 -0
- next/src/app/favicon.ico +0 -0
- next/src/app/features/page.tsx +237 -0
- next/src/app/globals.css +127 -0
- next/src/app/layout.tsx +55 -0
- next/src/app/login/page.tsx +118 -0
- next/src/app/page.tsx +194 -0
- next/src/app/register/page.tsx +154 -0
- next/src/components/CountryFilter.tsx +42 -0
- next/src/components/UniversityCard.tsx +83 -0
- next/src/components/dashboard-sidebar.tsx +83 -0
- next/src/components/footer.tsx +86 -0
- next/src/components/navbar.tsx +91 -0
- next/src/components/ui/avatar.tsx +53 -0
- next/src/components/ui/badge.tsx +46 -0
next/.gitignore
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
| 2 |
+
|
| 3 |
+
# dependencies
|
| 4 |
+
/node_modules
|
| 5 |
+
/.pnp
|
| 6 |
+
.pnp.*
|
| 7 |
+
.yarn/*
|
| 8 |
+
!.yarn/patches
|
| 9 |
+
!.yarn/plugins
|
| 10 |
+
!.yarn/releases
|
| 11 |
+
!.yarn/versions
|
| 12 |
+
|
| 13 |
+
# testing
|
| 14 |
+
/coverage
|
| 15 |
+
|
| 16 |
+
# next.js
|
| 17 |
+
/.next/
|
| 18 |
+
/out/
|
| 19 |
+
|
| 20 |
+
# production
|
| 21 |
+
/build
|
| 22 |
+
|
| 23 |
+
# misc
|
| 24 |
+
.DS_Store
|
| 25 |
+
*.pem
|
| 26 |
+
|
| 27 |
+
# debug
|
| 28 |
+
npm-debug.log*
|
| 29 |
+
yarn-debug.log*
|
| 30 |
+
yarn-error.log*
|
| 31 |
+
.pnpm-debug.log*
|
| 32 |
+
|
| 33 |
+
# env files (can opt-in for committing if needed)
|
| 34 |
+
.env*
|
| 35 |
+
|
| 36 |
+
# vercel
|
| 37 |
+
.vercel
|
| 38 |
+
|
| 39 |
+
# typescript
|
| 40 |
+
*.tsbuildinfo
|
| 41 |
+
next-env.d.ts
|
| 42 |
+
|
| 43 |
+
/src/generated/prisma
|
next/Edupath_Final_Database.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
next/International_Education_Costs.csv
ADDED
|
@@ -0,0 +1,908 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
Country,City,University,Program,Level,Duration_Years,Tuition_USD,Living_Cost_Index,Rent_USD,Visa_Fee_USD,Insurance_USD,Exchange_Rate
|
| 2 |
+
USA,Cambridge,Harvard University,Computer Science,Master,2,55400,83.5,2200,160,1500,1.00
|
| 3 |
+
UK,London,Imperial College London,Data Science,Master,1,41200,75.8,1800,485,800,0.79
|
| 4 |
+
Canada,Toronto,University of Toronto,Business Analytics,Master,2,38500,72.5,1600,235,900,1.35
|
| 5 |
+
Australia,Melbourne,University of Melbourne,Engineering,Master,2,42000,71.2,1400,450,650,1.52
|
| 6 |
+
Germany,Munich,Technical University of Munich,Mechanical Engineering,Master,2,500,70.5,1100,75,550,0.92
|
| 7 |
+
Japan,Tokyo,University of Tokyo,Information Science,Master,2,8900,76.4,1300,220,750,145.8
|
| 8 |
+
Netherlands,Amsterdam,University of Amsterdam,Artificial Intelligence,Master,1,15800,73.2,1500,180,720,0.92
|
| 9 |
+
Singapore,Singapore,National University of Singapore,Finance,Master,1.5,35000,81.1,1900,90,800,1.34
|
| 10 |
+
France,Paris,Sorbonne University,International Relations,Master,2,4500,74.6,1400,99,650,0.92
|
| 11 |
+
Switzerland,Zurich,ETH Zurich,Physics,Master,2,1460,91.5,2100,88,1200,0.89
|
| 12 |
+
Sweden,Stockholm,KTH Royal Institute,Sustainable Technology,Master,2,0,71.8,1200,110,400,10.45
|
| 13 |
+
Denmark,Copenhagen,University of Copenhagen,Bioinformatics,Master,2,0,73.4,1300,120,450,6.92
|
| 14 |
+
China,Beijing,Tsinghua University,Computer Engineering,Master,2.5,8900,52.3,800,140,400,7.18
|
| 15 |
+
South Korea,Seoul,Seoul National University,Digital Media,Master,2,7200,68.7,900,130,500,1320.5
|
| 16 |
+
Ireland,Dublin,Trinity College Dublin,Data Analytics,Master,1,28900,72.9,1600,150,650,0.92
|
| 17 |
+
South Korea,Busan,Pusan National University,Business,Bachelor,4,5900,62.4,700,130,500,1320.5
|
| 18 |
+
New Zealand,Auckland,University of Auckland,Marine Biology,Bachelor,3,28500,69.8,1200,245,600,1.64
|
| 19 |
+
Austria,Vienna,University of Vienna,Social Sciences,Bachelor,3,1500,67.4,950,160,500,0.92
|
| 20 |
+
Belgium,Brussels,KU Leuven,Biomedical Sciences,Bachelor,3,3500,68.9,1000,180,550,0.92
|
| 21 |
+
USA,Ann Arbor,University of Michigan,Aerospace Engineering,Bachelor,4,52300,72.5,1800,160,1500,1.00
|
| 22 |
+
USA,Atlanta,Georgia Tech,Industrial Engineering,Bachelor,4,43800,71.5,1700,160,1500,1.00
|
| 23 |
+
USA,Austin,UT Austin,Chemical Engineering,Bachelor,4,40900,72.4,1600,160,1500,1.00
|
| 24 |
+
UK,Bristol,University of Bristol,Mathematics,Bachelor,3,31200,69.8,1100,485,800,0.79
|
| 25 |
+
Canada,Ottawa,University of Ottawa,Political Science,Bachelor,4,28900,68.5,1300,235,900,1.35
|
| 26 |
+
Hong Kong,Hong Kong,HKUST,Finance,Bachelor,4,22000,78.6,1500,120,600,7.82
|
| 27 |
+
Portugal,Lisbon,University of Lisbon,Architecture,Bachelor,3,3500,58.4,800,120,450,0.92
|
| 28 |
+
Israel,Tel Aviv,Tel Aviv University,Computer Science,Bachelor,3,12000,76.2,1200,150,800,3.72
|
| 29 |
+
Taiwan,Taipei,National Taiwan University,Electronics Engineering,Bachelor,4,5200,62.8,700,140,450,31.2
|
| 30 |
+
Czech Republic,Prague,Charles University,Medicine,Bachelor,3,9800,54.6,650,100,400,22.5
|
| 31 |
+
USA,Stanford,Stanford University,Computer Science,PhD,5,54200,89.5,2300,160,1500,1.00
|
| 32 |
+
USA,Boston,MIT,Electrical Engineering,PhD,5,53800,83.2,2200,160,1500,1.00
|
| 33 |
+
UK,Oxford,University of Oxford,Biomedical Sciences,PhD,4,29800,74.5,1600,485,800,0.79
|
| 34 |
+
UK,Cambridge,University of Cambridge,Physics,PhD,4,31200,75.2,1700,485,800,0.79
|
| 35 |
+
Germany,Heidelberg,Heidelberg University,Molecular Biology,PhD,3,500,68.4,900,75,550,0.92
|
| 36 |
+
Switzerland,Basel,ETH Basel,Pharmaceutical Sciences,PhD,4,1500,88.6,1800,88,1200,0.89
|
| 37 |
+
Netherlands,Delft,TU Delft,Robotics,PhD,4,4800,71.8,1200,180,720,0.92
|
| 38 |
+
Singapore,Singapore,NTU Singapore,Data Science,PhD,4,8900,81.5,1600,90,800,1.34
|
| 39 |
+
Canada,Waterloo,University of Waterloo,Quantum Computing,PhD,4,21500,69.8,1300,235,900,1.35
|
| 40 |
+
Australia,Canberra,Australian National University,Climate Science,PhD,4,29800,70.2,1400,450,650,1.52
|
| 41 |
+
Sweden,Lund,Lund University,Neuroscience,PhD,4,0,69.5,1000,110,400,10.45
|
| 42 |
+
USA,San Diego,UC San Diego,Computer Science,Bachelor,4,44200,79.5,1900,160,1500,1.00
|
| 43 |
+
USA,Seattle,University of Washington,Computer Science,Master,2,38900,83.4,2000,160,1500,1.00
|
| 44 |
+
Canada,Edmonton,University of Alberta,Computer Science,PhD,4,22800,67.8,1200,235,900,1.35
|
| 45 |
+
UK,Glasgow,University of Glasgow,Computer Science,Master,1,33500,67.5,1100,485,800,0.79
|
| 46 |
+
India,Bangalore,Indian Institute of Science,Computer Science,Master,2,2500,45.6,500,200,300,83.2
|
| 47 |
+
Denmark,Aalborg,Aalborg University,Computer Science,Bachelor,3,0,69.8,900,120,450,6.92
|
| 48 |
+
Poland,Warsaw,University of Warsaw,Computer Science,Master,2,3800,51.2,650,80,350,4.02
|
| 49 |
+
Ireland,Galway,NUI Galway,Computer Science,Bachelor,4,25800,68.5,1100,150,650,0.92
|
| 50 |
+
South Korea,Daejeon,KAIST,Computer Science,PhD,4,6900,65.4,700,130,500,1320.5
|
| 51 |
+
Malaysia,Kuala Lumpur,University of Malaya,Computer Science,Bachelor,4,4800,48.2,500,110,300,4.72
|
| 52 |
+
USA,Berkeley,UC Berkeley,Computer Science,Bachelor,4,44900,84.2,2100,160,1500,1.00
|
| 53 |
+
UK,Manchester,University of Manchester,Economics,Bachelor,3,32000,68.4,1200,485,800,0.79
|
| 54 |
+
Canada,Vancouver,University of British Columbia,Psychology,Bachelor,4,31200,71.2,1700,235,900,1.35
|
| 55 |
+
Australia,Sydney,University of Sydney,Business,Bachelor,3,35000,72.8,1600,450,650,1.52
|
| 56 |
+
Germany,Berlin,Free University of Berlin,International Business,Bachelor,3,0,65.2,900,75,550,0.92
|
| 57 |
+
Spain,Barcelona,University of Barcelona,Architecture,Bachelor,4,2800,62.4,950,160,500,0.92
|
| 58 |
+
Italy,Milan,Politecnico di Milano,Design,Bachelor,3,4200,63.8,1100,120,650,0.92
|
| 59 |
+
Netherlands,Rotterdam,Erasmus University,Economics,Bachelor,3,11200,71.5,1300,180,720,0.92
|
| 60 |
+
Finland,Helsinki,University of Helsinki,Computer Science,Bachelor,3,0,70.2,1100,120,400,0.92
|
| 61 |
+
Norway,Oslo,University of Oslo,Environmental Science,Bachelor,3,0,75.6,1400,135,450,10.45
|
| 62 |
+
Japan,Osaka,Osaka University,Engineering,Bachelor,4,6800,71.2,900,220,750,145.8
|
| 63 |
+
Japan,Kyoto,Kyoto University,Computer Science,Master,2,8500,71.8,900,220,750,145.8
|
| 64 |
+
Japan,Nagoya,Nagoya University,Information Science,Bachelor,4,7800,68.5,750,220,750,145.8
|
| 65 |
+
Japan,Sendai,Tohoku University,Software Engineering,Master,2,8200,65.4,650,220,750,145.8
|
| 66 |
+
Japan,Fukuoka,Kyushu University,Computer Engineering,Bachelor,4,7500,64.8,600,220,750,145.8
|
| 67 |
+
Japan,Sapporo,Hokkaido University,Data Science,Master,2,8100,63.5,550,220,750,145.8
|
| 68 |
+
Japan,Tokyo,Tokyo Institute of Technology,Artificial Intelligence,PhD,3,8900,76.4,1100,220,750,145.8
|
| 69 |
+
Japan,Tsukuba,University of Tsukuba,Information Systems,Bachelor,4,7200,64.2,600,220,750,145.8
|
| 70 |
+
Japan,Kobe,Kobe University,Computer Science,Master,2,7900,67.8,700,220,750,145.8
|
| 71 |
+
Japan,Kanazawa,Kanazawa University,Software Engineering,Bachelor,4,7100,62.5,500,220,750,145.8
|
| 72 |
+
Japan,Hiroshima,Hiroshima University,Information Technology,Master,2,7600,63.8,550,220,750,145.8
|
| 73 |
+
Australia,Adelaide,University of Adelaide,Computer Science,Bachelor,3,32800,68.5,1100,450,650,1.52
|
| 74 |
+
Australia,Perth,University of Western Australia,Software Engineering,Master,2,34500,69.8,1200,450,650,1.52
|
| 75 |
+
Australia,Gold Coast,Griffith University,Information Technology,Bachelor,3,31200,67.5,1100,450,650,1.52
|
| 76 |
+
Australia,Hobart,University of Tasmania,Data Science,Master,2,30800,65.4,950,450,650,1.52
|
| 77 |
+
Australia,Newcastle,University of Newcastle,Computer Engineering,Bachelor,4,31500,66.8,1000,450,650,1.52
|
| 78 |
+
Australia,Wollongong,University of Wollongong,Artificial Intelligence,Master,2,32900,67.2,1050,450,650,1.52
|
| 79 |
+
Australia,Darwin,Charles Darwin University,Information Systems,Bachelor,3,29800,64.5,900,450,650,1.52
|
| 80 |
+
Australia,Townsville,James Cook University,Data Analytics,Master,2,31200,65.8,950,450,650,1.52
|
| 81 |
+
Australia,Sunshine Coast,USC,Software Development,Bachelor,3,29500,66.2,1000,450,650,1.52
|
| 82 |
+
Australia,Armidale,University of New England,Computing Science,Master,2,30500,64.8,850,450,650,1.52
|
| 83 |
+
Germany,Dresden,TU Dresden,Computer Science,Master,2,500,65.8,750,75,550,0.92
|
| 84 |
+
Germany,Stuttgart,University of Stuttgart,Software Engineering,Bachelor,3,450,68.5,850,75,550,0.92
|
| 85 |
+
Germany,Hamburg,TU Hamburg,Data Engineering,Master,2,500,71.2,950,75,550,0.92
|
| 86 |
+
Germany,Aachen,RWTH Aachen,Computer Engineering,Bachelor,3,500,66.4,700,75,550,0.92
|
| 87 |
+
Germany,Karlsruhe,KIT,Artificial Intelligence,Master,2,500,67.8,800,75,550,0.92
|
| 88 |
+
Germany,Darmstadt,TU Darmstadt,Information Systems,Bachelor,3,450,66.9,750,75,550,0.92
|
| 89 |
+
Germany,Braunschweig,TU Braunschweig,Software Systems,Master,2,500,64.5,650,75,550,0.92
|
| 90 |
+
Germany,Jena,University of Jena,Data Science,Bachelor,3,450,63.8,600,75,550,0.92
|
| 91 |
+
Germany,Hannover,Leibniz University,Digital Engineering,Master,2,500,66.2,750,75,550,0.92
|
| 92 |
+
Germany,Freiburg,University of Freiburg,Robotics & AI,Master,2,500,67.5,800,75,550,0.92
|
| 93 |
+
USA,Philadelphia,University of Pennsylvania,Computer Science,Master,2,51900,76.8,1900,160,1500,1.00
|
| 94 |
+
USA,Chicago,University of Chicago,Data Analytics,Master,2,52400,78.9,2000,160,1500,1.00
|
| 95 |
+
USA,Baltimore,Johns Hopkins,Artificial Intelligence,PhD,5,53600,72.5,1700,160,1500,1.00
|
| 96 |
+
USA,Nashville,Vanderbilt University,Computer Engineering,Bachelor,4,50800,71.2,1600,160,1500,1.00
|
| 97 |
+
USA,Durham,Duke University,Software Engineering,Master,2,51500,70.8,1500,160,1500,1.00
|
| 98 |
+
USA,Madison,University of Wisconsin,Computer Science,PhD,5,38200,69.5,1400,160,1500,1.00
|
| 99 |
+
USA,Tempe,Arizona State University,Information Technology,Bachelor,4,41200,70.2,1300,160,1500,1.00
|
| 100 |
+
USA,Boulder,University of Colorado,Data Science,Master,2,39800,71.5,1600,160,1500,1.00
|
| 101 |
+
USA,Minneapolis,University of Minnesota,Computer Science,Bachelor,4,42500,72.8,1500,160,1500,1.00
|
| 102 |
+
USA,Davis,UC Davis,Computer Engineering,Master,2,42800,73.5,1700,160,1500,1.00
|
| 103 |
+
UK,London,University College London,Computer Science,Master,1,39200,76.2,1900,485,800,0.79
|
| 104 |
+
UK,Leeds,University of Leeds,Software Engineering,Bachelor,3,28500,65.8,950,485,800,0.79
|
| 105 |
+
UK,Warwick,University of Warwick,Data Science,Master,1,36800,67.2,1000,485,800,0.79
|
| 106 |
+
UK,Sheffield,University of Sheffield,Artificial Intelligence,PhD,3,27900,64.5,850,485,800,0.79
|
| 107 |
+
UK,Birmingham,University of Birmingham,Computer Engineering,Bachelor,3,29500,66.8,950,485,800,0.79
|
| 108 |
+
UK,Southampton,University of Southampton,Cybersecurity,Master,1,32400,65.9,900,485,800,0.79
|
| 109 |
+
UK,Nottingham,University of Nottingham,Computer Science,Bachelor,3,28900,64.8,850,485,800,0.79
|
| 110 |
+
UK,Cardiff,Cardiff University,Software Development,Master,1,31200,64.2,800,485,800,0.79
|
| 111 |
+
UK,Belfast,Queen's University Belfast,Computing Systems,Bachelor,3,27500,63.5,750,485,800,0.79
|
| 112 |
+
UK,Newcastle,Newcastle University,Data Analytics,Master,1,30800,64.6,800,485,800,0.79
|
| 113 |
+
Canada,Hamilton,McMaster University,Software Engineering,Bachelor,4,32500,68.5,1200,235,900,1.35
|
| 114 |
+
Canada,London ON,Western University,Computer Science,Master,2,29800,65.8,1100,235,900,1.35
|
| 115 |
+
Canada,Halifax,Dalhousie University,Data Science,Master,2,28500,64.5,1200,235,900,1.35
|
| 116 |
+
Canada,Victoria,University of Victoria,Computer Engineering,Bachelor,4,27900,69.2,1300,235,900,1.35
|
| 117 |
+
Canada,Quebec City,Laval University,Artificial Intelligence,Master,2,21500,63.8,900,235,900,1.35
|
| 118 |
+
Canada,Winnipeg,University of Manitoba,Computer Science,Bachelor,4,26800,62.5,950,235,900,1.35
|
| 119 |
+
Canada,Regina,University of Regina,Software Systems,Bachelor,4,25500,61.8,900,235,900,1.35
|
| 120 |
+
Canada,St. John's,Memorial University,Computer Science,Master,2,19800,63.2,950,235,900,1.35
|
| 121 |
+
Canada,Saskatoon,University of Saskatchewan,Data Analytics,Master,2,24500,62.8,1000,235,900,1.35
|
| 122 |
+
Canada,Sherbrooke,Université de Sherbrooke,Computer Engineering,PhD,4,20500,61.5,850,235,900,1.35
|
| 123 |
+
USA,Pittsburgh,Carnegie Mellon,Computer Science,Master,2,51200,72.4,1800,160,1500,1.00
|
| 124 |
+
USA,Urbana-Champaign,UIUC,Computer Science,PhD,5,45800,68.5,1400,160,1500,1.00
|
| 125 |
+
Canada,Calgary,University of Calgary,Software Engineering,Bachelor,4,26500,69.2,1300,235,900,1.35
|
| 126 |
+
Brazil,Sao Paulo,University of Sao Paulo,Computer Science,Master,2,0,48.5,600,160,400,4.95
|
| 127 |
+
Turkey,Istanbul,Bogazici University,Computer Engineering,Bachelor,4,1800,42.8,450,100,300,30.5
|
| 128 |
+
Russia,Moscow,Moscow State University,Applied Mathematics,Master,2,3900,51.2,700,120,350,92.8
|
| 129 |
+
Mexico,Mexico City,UNAM,Computer Engineering,Bachelor,4,800,44.6,500,160,400,17.2
|
| 130 |
+
Greece,Athens,National Technical University,Software Engineering,Master,2,2500,54.8,550,120,400,0.92
|
| 131 |
+
Thailand,Bangkok,Chulalongkorn University,Computer Science,Bachelor,4,3800,46.5,450,140,300,35.2
|
| 132 |
+
UAE,Dubai,American University in Dubai,Computer Science,Bachelor,4,29500,72.4,1200,270,800,3.67
|
| 133 |
+
USA,New York,Columbia University,Data Science,Master,2,52800,100.0,2500,160,1500,1.00
|
| 134 |
+
USA,Ithaca,Cornell University,Computer Science,PhD,5,49800,70.5,1600,160,1500,1.00
|
| 135 |
+
China,Shenzhen,SUSTech,Artificial Intelligence,Master,2,8200,58.4,800,140,400,7.18
|
| 136 |
+
South Africa,Cape Town,University of Cape Town,Computer Science,Bachelor,3,5900,49.2,600,140,400,18.72
|
| 137 |
+
Egypt,Cairo,American University in Cairo,Computer Engineering,Bachelor,4,19800,38.4,450,130,350,30.90
|
| 138 |
+
Argentina,Buenos Aires,University of Buenos Aires,Software Engineering,Bachelor,5,0,42.6,400,150,300,821.5
|
| 139 |
+
Indonesia,Jakarta,University of Indonesia,Information Systems,Bachelor,4,4200,45.8,500,130,300,15640
|
| 140 |
+
Saudi Arabia,Riyadh,King Saud University,Computer Science,Master,2,7800,52.4,800,250,600,3.75
|
| 141 |
+
Nigeria,Lagos,University of Lagos,Computer Engineering,Bachelor,4,2500,40.2,400,180,300,860.2
|
| 142 |
+
Vietnam,Ho Chi Minh City,HCMUT,Software Engineering,Bachelor,4,3200,43.6,450,120,250,24450
|
| 143 |
+
Netherlands,Eindhoven,TU Eindhoven,Computer Science,Master,2,15600,69.8,950,180,720,0.92
|
| 144 |
+
Netherlands,Enschede,University of Twente,Artificial Intelligence,Bachelor,3,11200,65.4,750,180,720,0.92
|
| 145 |
+
Netherlands,Groningen,University of Groningen,Computing Science,Master,2,14800,66.8,800,180,720,0.92
|
| 146 |
+
Netherlands,Maastricht,Maastricht University,Data Science,Bachelor,3,11500,67.2,850,180,720,0.92
|
| 147 |
+
Netherlands,Nijmegen,Radboud University,Software Science,Master,2,14500,66.5,800,180,720,0.92
|
| 148 |
+
Netherlands,Tilburg,Tilburg University,Information Systems,Bachelor,3,11300,65.8,750,180,720,0.92
|
| 149 |
+
Netherlands,Utrecht,Utrecht University,Game Technology,Master,2,15200,70.2,1000,180,720,0.92
|
| 150 |
+
Netherlands,Leiden,Leiden University,Computer Engineering,Bachelor,3,11400,69.5,950,180,720,0.92
|
| 151 |
+
Netherlands,Wageningen,Wageningen University,Bioinformatics,Master,2,14900,65.2,750,180,720,0.92
|
| 152 |
+
Netherlands,Amsterdam,VU Amsterdam,Business Analytics,Master,2,15400,73.5,1100,180,720,0.92
|
| 153 |
+
Singapore,Singapore,Nanyang Technological University,Computer Science,Bachelor,4,32500,81.1,1500,90,800,1.34
|
| 154 |
+
Singapore,Singapore,Singapore Management University,Information Systems,Bachelor,4,31800,81.1,1500,90,800,1.34
|
| 155 |
+
Singapore,Singapore,SUTD,Computer Science & Design,Bachelor,4,31200,81.1,1500,90,800,1.34
|
| 156 |
+
Singapore,Singapore,SIT,Software Engineering,Bachelor,4,29800,81.1,1500,90,800,1.34
|
| 157 |
+
Singapore,Singapore,NUS,Artificial Intelligence,Master,2,35600,81.1,1500,90,800,1.34
|
| 158 |
+
Singapore,Singapore,NTU,Data Science & AI,Master,2,34900,81.1,1500,90,800,1.34
|
| 159 |
+
Singapore,Singapore,SUTD,Technology & Innovation,Master,2,33800,81.1,1500,90,800,1.34
|
| 160 |
+
Singapore,Singapore,SMU,Computing & Innovation,Master,2,34200,81.1,1500,90,800,1.34
|
| 161 |
+
Singapore,Singapore,NUS,Computer Engineering,PhD,4,38500,81.1,1500,90,800,1.34
|
| 162 |
+
Singapore,Singapore,NTU,Digital Systems & AI,PhD,4,37900,81.1,1500,90,800,1.34
|
| 163 |
+
France,Paris,École Polytechnique,Computer Science,Master,2,15600,74.6,1500,99,650,0.92
|
| 164 |
+
France,Toulouse,INSA Toulouse,Software Engineering,Bachelor,3,4200,65.8,750,99,650,0.92
|
| 165 |
+
France,Lyon,École Normale Supérieure Lyon,Data Science,Master,2,4800,68.5,850,99,650,0.92
|
| 166 |
+
France,Grenoble,Grenoble INP,Artificial Intelligence,Master,2,4500,66.4,800,99,650,0.92
|
| 167 |
+
France,Nice,Université Nice Sophia Antipolis,Computer Engineering,Bachelor,3,3900,69.2,900,99,650,0.92
|
| 168 |
+
France,Bordeaux,University of Bordeaux,Information Systems,Master,2,4200,67.8,850,99,650,0.92
|
| 169 |
+
France,Lille,Université de Lille,Software Development,Bachelor,3,3800,65.5,750,99,650,0.92
|
| 170 |
+
France,Rennes,INSA Rennes,Cybersecurity,Master,2,4500,64.8,700,99,650,0.92
|
| 171 |
+
France,Strasbourg,University of Strasbourg,Digital Systems,Bachelor,3,3900,66.2,800,99,650,0.92
|
| 172 |
+
France,Montpellier,University of Montpellier,Data Engineering,Master,2,4100,65.9,750,99,650,0.92
|
| 173 |
+
Switzerland,Lausanne,EPFL,Computer Science,Master,2,1460,89.8,1900,88,1200,0.89
|
| 174 |
+
Switzerland,Geneva,University of Geneva,Data Science,Bachelor,3,1380,90.5,2000,88,1200,0.89
|
| 175 |
+
Switzerland,Bern,University of Bern,Software Engineering,Master,2,1420,85.4,1700,88,1200,0.89
|
| 176 |
+
Switzerland,St. Gallen,University of St. Gallen,Business Informatics,Bachelor,3,1440,86.2,1600,88,1200,0.89
|
| 177 |
+
Switzerland,Lugano,USI,Artificial Intelligence,Master,2,1460,84.5,1500,88,1200,0.89
|
| 178 |
+
Switzerland,Fribourg,University of Fribourg,Computer Engineering,Bachelor,3,1380,83.8,1400,88,1200,0.89
|
| 179 |
+
Switzerland,Neuchatel,University of Neuchatel,Information Systems,Master,2,1420,84.2,1500,88,1200,0.89
|
| 180 |
+
Switzerland,Basel,University of Basel,Computational Science,Master,2,1440,87.5,1800,88,1200,0.89
|
| 181 |
+
Switzerland,Lucerne,University of Lucerne,Digital Innovation,Bachelor,3,1380,85.8,1600,88,1200,0.89
|
| 182 |
+
Switzerland,Winterthur,ZHAW,Data Engineering,Master,2,1460,86.4,1700,88,1200,0.89
|
| 183 |
+
Denmark,Copenhagen,University of Copenhagen,Computer Science,Master,2,8800,83.2,1500,110,600,0.15
|
| 184 |
+
Denmark,Aarhus,Aarhus University,Data Science,Master,2,8600,77.4,1200,110,600,0.15
|
| 185 |
+
Denmark,Aalborg,Aalborg University,Software Engineering,Master,2,8400,75.1,1000,110,600,0.15
|
| 186 |
+
China,Beijing,Tsinghua University,Computer Science,Master,3,8900,51.2,800,140,400,7.15
|
| 187 |
+
China,Beijing,Peking University,Data Science,Master,3,8500,51.2,750,140,400,7.15
|
| 188 |
+
China,Shanghai,Fudan University,Software Engineering,Master,2.5,7800,48.9,700,140,400,7.15
|
| 189 |
+
China,Shanghai,Shanghai Jiao Tong University,Artificial Intelligence,Master,2.5,8200,48.9,720,140,400,7.15
|
| 190 |
+
China,Hangzhou,Zhejiang University,Computer Engineering,Master,3,7500,45.3,550,140,400,7.15
|
| 191 |
+
China,Nanjing,Nanjing University,Information Technology,Master,3,7200,44.1,500,140,400,7.15
|
| 192 |
+
China,Guangzhou,Sun Yat-sen University,Computer Science,Master,3,6900,43.8,480,140,400,7.15
|
| 193 |
+
China,Wuhan,Wuhan University,Software Engineering,Master,3,6500,41.2,450,140,400,7.15
|
| 194 |
+
China,Xi'an,Xi'an Jiaotong University,Data Science,Master,3,6300,40.5,420,140,400,7.15
|
| 195 |
+
China,Chengdu,Sichuan University,Computer Engineering,Master,3,6100,39.8,400,140,400,7.15
|
| 196 |
+
South Korea,Seoul,Seoul National University,Computer Science,Master,2,7200,85.1,950,90,800,1300
|
| 197 |
+
South Korea,Seoul,Korea University,Artificial Intelligence,Master,2,7000,85.1,920,90,800,1300
|
| 198 |
+
South Korea,Seoul,Yonsei University,Data Science,Master,2,6900,85.1,900,90,800,1300
|
| 199 |
+
South Korea,Seoul,Hanyang University,Software Engineering,Master,2,6500,85.1,850,90,800,1300
|
| 200 |
+
South Korea,Seoul,Sungkyunkwan University,Computer Engineering,Master,2,6400,85.1,840,90,800,1300
|
| 201 |
+
South Korea,Daejeon,KAIST,Robotics Engineering,Master,2,6800,75.4,700,90,800,1300
|
| 202 |
+
South Korea,Daejeon,Chungnam National University,Information Systems,Master,2,5900,75.4,650,90,800,1300
|
| 203 |
+
South Korea,Busan,Pusan National University,Computer Science,Master,2,5800,73.2,600,90,800,1300
|
| 204 |
+
South Korea,Busan,Dong-A University,Software Engineering,Master,2,5600,73.2,580,90,800,1300
|
| 205 |
+
South Korea,Daegu,Kyungpook National University,Data Analytics,Master,2,5500,71.8,550,90,800,1300
|
| 206 |
+
South Korea,Daegu,Yeungnam University,Computer Engineering,Master,2,5400,71.8,530,90,800,1300
|
| 207 |
+
South Korea,Gwangju,Chonnam National University,Information Technology,Master,2,5300,70.5,520,90,800,1300
|
| 208 |
+
South Korea,Gwangju,Chosun University,Computer Science,Master,2,5200,70.5,500,90,800,1300
|
| 209 |
+
South Korea,Ulsan,Ulsan National Institute of Science and Technology,AI Engineering,Master,2,6100,72.3,580,90,800,1300
|
| 210 |
+
South Korea,Ulsan,University of Ulsan,Software Systems,Master,2,5100,72.3,550,90,800,1300
|
| 211 |
+
South Korea,Pohang,POSTECH,Computer Engineering,Master,2,6300,71.2,570,90,800,1300
|
| 212 |
+
South Korea,Incheon,Incheon National University,Data Science,Master,2,5000,76.4,600,90,800,1300
|
| 213 |
+
South Korea,Suwon,Sungkyunkwan University (Suwon),Computer Systems,Master,2,5900,77.8,650,90,800,1300
|
| 214 |
+
South Korea,Daejeon,Hanbat National University,Information Security,Master,2,4900,75.4,540,90,800,1300
|
| 215 |
+
South Korea,Cheongju,Chungbuk National University,Computer Networks,Master,2,4800,70.1,520,90,800,1300
|
| 216 |
+
USA,Stanford,Stanford University,Computer Science,Bachelor,4,57000,95.2,2400,160,1500,1.00
|
| 217 |
+
USA,Cambridge,MIT,Computer Science,Bachelor,4,55800,83.5,2300,160,1500,1.00
|
| 218 |
+
USA,New Haven,Yale University,Computer Science,Bachelor,4,54500,79.8,2100,160,1500,1.00
|
| 219 |
+
USA,Princeton,Princeton University,Computer Science,Bachelor,4,54000,81.2,2000,160,1500,1.00
|
| 220 |
+
USA,Philadelphia,University of Pennsylvania,Computer Science,Bachelor,4,53500,82.4,1900,160,1500,1.00
|
| 221 |
+
USA,Los Angeles,UCLA,Computer Science,Bachelor,4,43000,88.7,2200,160,1500,1.00
|
| 222 |
+
USA,Berkeley,UC Berkeley,Computer Science,Bachelor,4,43500,91.5,2300,160,1500,1.00
|
| 223 |
+
USA,Ann Arbor,University of Michigan,Computer Science,Bachelor,4,52000,75.4,1700,160,1500,1.00
|
| 224 |
+
USA,Austin,University of Texas Austin,Computer Science,Bachelor,4,40500,72.8,1800,160,1500,1.00
|
| 225 |
+
USA,Seattle,University of Washington,Computer Science,Bachelor,4,39800,85.6,2000,160,1500,1.00
|
| 226 |
+
USA,Madison,University of Wisconsin-Madison,Computer Science,Bachelor,4,37500,71.2,1600,160,1500,1.00
|
| 227 |
+
USA,Urbana,University of Illinois Urbana-Champaign,Computer Science,Bachelor,4,36800,70.5,1500,160,1500,1.00
|
| 228 |
+
USA,Atlanta,Georgia Tech,Computer Science,Bachelor,4,33500,76.8,1700,160,1500,1.00
|
| 229 |
+
USA,Columbus,Ohio State University,Computer Science,Bachelor,4,32800,71.4,1400,160,1500,1.00
|
| 230 |
+
USA,West Lafayette,Purdue University,Computer Science,Bachelor,4,31500,68.9,1300,160,1500,1.00
|
| 231 |
+
USA,Gainesville,University of Florida,Computer Science,Bachelor,4,28500,70.2,1400,160,1500,1.00
|
| 232 |
+
USA,Tempe,Arizona State University,Computer Science,Bachelor,4,28000,72.5,1500,160,1500,1.00
|
| 233 |
+
USA,Raleigh,NC State University,Computer Science,Bachelor,4,27500,71.8,1400,160,1500,1.00
|
| 234 |
+
USA,College Station,Texas A&M University,Computer Science,Bachelor,4,27000,69.5,1300,160,1500,1.00
|
| 235 |
+
USA,Corvallis,Oregon State University,Computer Science,Bachelor,4,26500,70.1,1300,160,1500,1.00
|
| 236 |
+
UK,Cambridge,University of Cambridge,Computer Science,Bachelor,3,38500,78.5,1800,490,800,0.79
|
| 237 |
+
UK,Oxford,University of Oxford,Computer Science,Bachelor,3,37900,77.8,1850,490,800,0.79
|
| 238 |
+
UK,London,Imperial College London,Computer Science,Bachelor,3,37500,83.2,2200,490,800,0.79
|
| 239 |
+
UK,London,University College London,Computer Science,Bachelor,3,36800,83.2,2100,490,800,0.79
|
| 240 |
+
UK,London,King's College London,Computer Science,Bachelor,3,35500,83.2,2000,490,800,0.79
|
| 241 |
+
UK,Edinburgh,University of Edinburgh,Computer Science,Bachelor,4,32500,75.4,1600,490,800,0.79
|
| 242 |
+
UK,Manchester,University of Manchester,Computer Science,Bachelor,3,31800,72.1,1400,490,800,0.79
|
| 243 |
+
UK,Bristol,University of Bristol,Computer Science,Bachelor,3,31500,74.8,1500,490,800,0.79
|
| 244 |
+
UK,Warwick,University of Warwick,Computer Science,Bachelor,3,31200,71.5,1300,490,800,0.79
|
| 245 |
+
UK,Glasgow,University of Glasgow,Computer Science,Bachelor,4,30800,73.2,1400,490,800,0.79
|
| 246 |
+
UK,Birmingham,University of Birmingham,Computer Science,Bachelor,3,30500,71.8,1300,490,800,0.79
|
| 247 |
+
UK,Leeds,University of Leeds,Computer Science,Bachelor,3,30200,71.2,1250,490,800,0.79
|
| 248 |
+
UK,Sheffield,University of Sheffield,Computer Science,Bachelor,3,29800,70.5,1200,490,800,0.79
|
| 249 |
+
UK,Nottingham,University of Nottingham,Computer Science,Bachelor,3,29500,70.8,1150,490,800,0.79
|
| 250 |
+
UK,Southampton,University of Southampton,Computer Science,Bachelor,3,29200,72.4,1300,490,800,0.79
|
| 251 |
+
UK,Durham,Durham University,Computer Science,Bachelor,3,28900,71.6,1250,490,800,0.79
|
| 252 |
+
UK,Liverpool,University of Liverpool,Computer Science,Bachelor,3,28600,70.2,1100,490,800,0.79
|
| 253 |
+
UK,Cardiff,Cardiff University,Computer Science,Bachelor,3,28300,69.8,1050,490,800,0.79
|
| 254 |
+
UK,Newcastle,Newcastle University,Computer Science,Bachelor,3,28000,70.1,1100,490,800,0.79
|
| 255 |
+
UK,Aberdeen,University of Aberdeen,Computer Science,Bachelor,4,27700,69.5,1000,490,800,0.79
|
| 256 |
+
UK,Leicester,University of Leicester,Computer Science,Bachelor,3,27400,68.9,950,490,800,0.79
|
| 257 |
+
UK,Reading,University of Reading,Computer Science,Bachelor,3,27100,71.2,1150,490,800,0.79
|
| 258 |
+
UK,Sussex,University of Sussex,Computer Science,Bachelor,3,26800,72.5,1200,490,800,0.79
|
| 259 |
+
UK,Essex,University of Essex,Computer Science,Bachelor,3,26500,69.8,1000,490,800,0.79
|
| 260 |
+
UK,Bath,University of Bath,Computer Science,Bachelor,3,26200,73.4,1250,490,800,0.79
|
| 261 |
+
UK,Surrey,University of Surrey,Computer Science,Bachelor,3,25900,71.8,1150,490,800,0.79
|
| 262 |
+
UK,Exeter,University of Exeter,Computer Science,Bachelor,3,25600,72.1,1200,490,800,0.79
|
| 263 |
+
UK,Kent,University of Kent,Computer Science,Bachelor,3,25300,70.5,1100,490,800,0.79
|
| 264 |
+
UK,Dundee,University of Dundee,Computer Science,Bachelor,4,25000,68.9,950,490,800,0.79
|
| 265 |
+
UK,Strathclyde,University of Strathclyde,Computer Science,Bachelor,4,24700,69.2,1000,490,800,0.79
|
| 266 |
+
UK,Heriot-Watt,Heriot-Watt University,Computer Science,Bachelor,4,24400,69.5,1050,490,800,0.79
|
| 267 |
+
UK,Loughborough,Loughborough University,Computer Science,Bachelor,3,24100,68.5,900,490,800,0.79
|
| 268 |
+
UK,Brunel,Brunel University London,Computer Science,Bachelor,3,23800,83.2,1800,490,800,0.79
|
| 269 |
+
UK,Queen Mary,Queen Mary University of London,Computer Science,Bachelor,3,23500,83.2,1900,490,800,0.79
|
| 270 |
+
UK,Royal Holloway,Royal Holloway University,Computer Science,Bachelor,3,23200,75.5,1400,490,800,0.79
|
| 271 |
+
UK,Lancaster,Lancaster University,Computer Science,Bachelor,3,22900,69.8,1000,490,800,0.79
|
| 272 |
+
UK,Swansea,Swansea University,Computer Science,Bachelor,3,22600,68.5,950,490,800,0.79
|
| 273 |
+
UK,Aston,Aston University,Computer Science,Bachelor,3,22300,71.8,1200,490,800,0.79
|
| 274 |
+
UK,Hull,University of Hull,Computer Science,Bachelor,3,22000,67.9,850,490,800,0.79
|
| 275 |
+
UK,Keele,Keele University,Computer Science,Bachelor,3,21700,67.5,800,490,800,0.79
|
| 276 |
+
UK,Plymouth,University of Plymouth,Computer Science,Bachelor,3,21400,69.2,950,490,800,0.79
|
| 277 |
+
UK,Portsmouth,University of Portsmouth,Computer Science,Bachelor,3,21100,70.5,1000,490,800,0.79
|
| 278 |
+
UK,Ulster,Ulster University,Computer Science,Bachelor,3,20800,67.2,800,490,800,0.79
|
| 279 |
+
UK,Northumbria,Northumbria University,Computer Science,Bachelor,3,20500,68.5,900,490,800,0.79
|
| 280 |
+
UK,Coventry,Coventry University,Computer Science,Bachelor,3,20200,69.8,950,490,800,0.79
|
| 281 |
+
UK,Oxford Brookes,Oxford Brookes University,Computer Science,Bachelor,3,19900,77.8,1500,490,800,0.79
|
| 282 |
+
UK,De Montfort,De Montfort University,Computer Science,Bachelor,3,19600,68.9,900,490,800,0.79
|
| 283 |
+
UK,Westminster,University of Westminster,Computer Science,Bachelor,3,19300,83.2,1800,490,800,0.79
|
| 284 |
+
UK,Greenwich,University of Greenwich,Computer Science,Bachelor,3,19000,83.2,1700,490,800,0.79
|
| 285 |
+
UK,Kingston,Kingston University,Computer Science,Bachelor,3,18700,83.2,1600,490,800,0.79
|
| 286 |
+
Canada,Toronto,University of Toronto,Computer Science,Bachelor,4,45200,73.5,1800,235,600,1.35
|
| 287 |
+
Canada,Toronto,University of Toronto,Computer Science,Master,2,28500,73.5,1800,235,600,1.35
|
| 288 |
+
Canada,Vancouver,University of British Columbia,Computer Science,Bachelor,4,43800,71.2,1900,235,600,1.35
|
| 289 |
+
Canada,Vancouver,University of British Columbia,Computer Science,Master,2,27900,71.2,1900,235,600,1.35
|
| 290 |
+
Canada,Montreal,McGill University,Computer Science,Bachelor,4,41500,65.8,1500,235,600,1.35
|
| 291 |
+
Canada,Montreal,McGill University,Computer Science,Master,2,26800,65.8,1500,235,600,1.35
|
| 292 |
+
Canada,Waterloo,University of Waterloo,Computer Science,Bachelor,4,40900,62.4,1300,235,600,1.35
|
| 293 |
+
Canada,Waterloo,University of Waterloo,Computer Science,Master,2,26200,62.4,1300,235,600,1.35
|
| 294 |
+
Canada,Montreal,University of Montreal,Computer Science,Bachelor,4,39500,65.8,1400,235,600,1.35
|
| 295 |
+
Canada,Montreal,University of Montreal,Computer Science,Master,2,25800,65.8,1400,235,600,1.35
|
| 296 |
+
Canada,Edmonton,University of Alberta,Computer Science,Bachelor,4,38200,61.9,1200,235,600,1.35
|
| 297 |
+
Canada,Edmonton,University of Alberta,Computer Science,Master,2,24900,61.9,1200,235,600,1.35
|
| 298 |
+
Canada,Ottawa,University of Ottawa,Computer Science,Bachelor,4,37800,63.5,1400,235,600,1.35
|
| 299 |
+
Canada,Ottawa,University of Ottawa,Computer Science,Master,2,24500,63.5,1400,235,600,1.35
|
| 300 |
+
Canada,Calgary,University of Calgary,Computer Science,Bachelor,4,37200,62.8,1300,235,600,1.35
|
| 301 |
+
Canada,Calgary,University of Calgary,Computer Science,Master,2,24100,62.8,1300,235,600,1.35
|
| 302 |
+
Canada,Hamilton,McMaster University,Computer Science,Bachelor,4,36500,64.2,1250,235,600,1.35
|
| 303 |
+
Canada,Hamilton,McMaster University,Computer Science,Master,2,23800,64.2,1250,235,600,1.35
|
| 304 |
+
Canada,London,Western University,Computer Science,Bachelor,4,35900,61.5,1200,235,600,1.35
|
| 305 |
+
Canada,London,Western University,Computer Science,Master,2,23500,61.5,1200,235,600,1.35
|
| 306 |
+
Canada,Kingston,Queen's University,Computer Science,Bachelor,4,35400,62.1,1300,235,600,1.35
|
| 307 |
+
Canada,Kingston,Queen's University,Computer Science,Master,2,23200,62.1,1300,235,600,1.35
|
| 308 |
+
Canada,Victoria,University of Victoria,Computer Science,Bachelor,4,34800,64.8,1400,235,600,1.35
|
| 309 |
+
Canada,Victoria,University of Victoria,Computer Science,Master,2,22900,64.8,1400,235,600,1.35
|
| 310 |
+
Canada,Halifax,Dalhousie University,Computer Science,Bachelor,4,34200,61.2,1200,235,600,1.35
|
| 311 |
+
Canada,Halifax,Dalhousie University,Computer Science,Master,2,22600,61.2,1200,235,600,1.35
|
| 312 |
+
Canada,Winnipeg,University of Manitoba,Computer Science,Bachelor,4,33600,59.8,1100,235,600,1.35
|
| 313 |
+
Canada,Winnipeg,University of Manitoba,Computer Science,Master,2,22300,59.8,1100,235,600,1.35
|
| 314 |
+
Canada,Quebec City,Laval University,Computer Science,Bachelor,4,33000,58.5,1000,235,600,1.35
|
| 315 |
+
Canada,Quebec City,Laval University,Computer Science,Master,2,22000,58.5,1000,235,600,1.35
|
| 316 |
+
Canada,Saskatoon,University of Saskatchewan,Computer Science,Bachelor,4,32400,58.2,950,235,600,1.35
|
| 317 |
+
Canada,Saskatoon,University of Saskatchewan,Computer Science,Master,2,21700,58.2,950,235,600,1.35
|
| 318 |
+
Canada,St. John's,Memorial University,Computer Science,Bachelor,4,31800,57.9,900,235,600,1.35
|
| 319 |
+
Canada,St. John's,Memorial University,Computer Science,Master,2,21400,57.9,900,235,600,1.35
|
| 320 |
+
Canada,Regina,University of Regina,Computer Science,Bachelor,4,31200,57.5,900,235,600,1.35
|
| 321 |
+
Canada,Regina,University of Regina,Computer Science,Master,2,21100,57.5,900,235,600,1.35
|
| 322 |
+
Canada,Sherbrooke,University of Sherbrooke,Computer Science,Bachelor,4,30600,56.8,850,235,600,1.35
|
| 323 |
+
Canada,Sherbrooke,University of Sherbrooke,Computer Science,Master,2,20800,56.8,850,235,600,1.35
|
| 324 |
+
Canada,Windsor,University of Windsor,Computer Science,Bachelor,4,30000,58.9,950,235,600,1.35
|
| 325 |
+
Canada,Windsor,University of Windsor,Computer Science,Master,2,20500,58.9,950,235,600,1.35
|
| 326 |
+
Canada,Moncton,University of New Brunswick,Computer Science,Bachelor,4,29400,57.2,900,235,600,1.35
|
| 327 |
+
Canada,Moncton,University of New Brunswick,Computer Science,Master,2,20200,57.2,900,235,600,1.35
|
| 328 |
+
Canada,Trois-Rivieres,UQTR,Computer Science,Bachelor,4,28800,56.5,850,235,600,1.35
|
| 329 |
+
Canada,Trois-Rivieres,UQTR,Computer Science,Master,2,19900,56.5,850,235,600,1.35
|
| 330 |
+
Canada,Thunder Bay,Lakehead University,Computer Science,Bachelor,4,28200,56.2,800,235,600,1.35
|
| 331 |
+
Canada,Thunder Bay,Lakehead University,Computer Science,Master,2,19600,56.2,800,235,600,1.35
|
| 332 |
+
Canada,Sudbury,Laurentian University,Computer Science,Bachelor,4,27600,55.8,800,235,600,1.35
|
| 333 |
+
Canada,Sudbury,Laurentian University,Computer Science,Master,2,19300,55.8,800,235,600,1.35
|
| 334 |
+
Canada,Prince George,UNBC,Computer Science,Bachelor,4,27000,55.5,750,235,600,1.35
|
| 335 |
+
Canada,Prince George,UNBC,Computer Science,Master,2,19000,55.5,750,235,600,1.35
|
| 336 |
+
Australia,Melbourne,University of Melbourne,Computer Science,Bachelor,3,42500,72.8,1800,450,650,1.52
|
| 337 |
+
Australia,Melbourne,University of Melbourne,Computer Science,Master,2,45800,72.8,1800,450,650,1.52
|
| 338 |
+
Australia,Melbourne,University of Melbourne,Computer Science,PhD,4,35000,72.8,1800,450,650,1.52
|
| 339 |
+
Australia,Sydney,University of Sydney,Computer Science,Bachelor,3,41800,74.5,2000,450,650,1.52
|
| 340 |
+
Australia,Sydney,University of Sydney,Computer Science,Master,2,44900,74.5,2000,450,650,1.52
|
| 341 |
+
Australia,Sydney,University of Sydney,Computer Science,PhD,4,34500,74.5,2000,450,650,1.52
|
| 342 |
+
Australia,Canberra,Australian National University,Computer Science,Bachelor,3,41200,68.9,1600,450,650,1.52
|
| 343 |
+
Australia,Canberra,Australian National University,Computer Science,Master,2,44200,68.9,1600,450,650,1.52
|
| 344 |
+
Australia,Canberra,Australian National University,Computer Science,PhD,4,34000,68.9,1600,450,650,1.52
|
| 345 |
+
Australia,Brisbane,University of Queensland,Computer Science,Bachelor,3,40500,69.2,1500,450,650,1.52
|
| 346 |
+
Australia,Brisbane,University of Queensland,Computer Science,Master,2,43500,69.2,1500,450,650,1.52
|
| 347 |
+
Australia,Brisbane,University of Queensland,Computer Science,PhD,4,33500,69.2,1500,450,650,1.52
|
| 348 |
+
Australia,Sydney,University of New South Wales,Computer Science,Bachelor,3,40200,74.5,1900,450,650,1.52
|
| 349 |
+
Australia,Sydney,University of New South Wales,Computer Science,Master,2,43200,74.5,1900,450,650,1.52
|
| 350 |
+
Australia,Sydney,University of New South Wales,Computer Science,PhD,4,33200,74.5,1900,450,650,1.52
|
| 351 |
+
Australia,Melbourne,Monash University,Computer Science,Bachelor,3,39800,72.8,1700,450,650,1.52
|
| 352 |
+
Australia,Melbourne,Monash University,Computer Science,Master,2,42800,72.8,1700,450,650,1.52
|
| 353 |
+
Australia,Melbourne,Monash University,Computer Science,PhD,4,32800,72.8,1700,450,650,1.52
|
| 354 |
+
Australia,Adelaide,University of Adelaide,Computer Science,Bachelor,3,39200,67.5,1400,450,650,1.52
|
| 355 |
+
Australia,Adelaide,University of Adelaide,Computer Science,Master,2,42200,67.5,1400,450,650,1.52
|
| 356 |
+
Australia,Adelaide,University of Adelaide,Computer Science,PhD,4,32200,67.5,1400,450,650,1.52
|
| 357 |
+
Australia,Perth,University of Western Australia,Computer Science,Bachelor,3,38800,68.2,1500,450,650,1.52
|
| 358 |
+
Australia,Perth,University of Western Australia,Computer Science,Master,2,41800,68.2,1500,450,650,1.52
|
| 359 |
+
Australia,Perth,University of Western Australia,Computer Science,PhD,4,31800,68.2,1500,450,650,1.52
|
| 360 |
+
Australia,Brisbane,Queensland University of Technology,Computer Science,Bachelor,3,38200,69.2,1400,450,650,1.52
|
| 361 |
+
Australia,Brisbane,Queensland University of Technology,Computer Science,Master,2,41200,69.2,1400,450,650,1.52
|
| 362 |
+
Australia,Brisbane,Queensland University of Technology,Computer Science,PhD,4,31200,69.2,1400,450,650,1.52
|
| 363 |
+
Australia,Sydney,University of Technology Sydney,Computer Science,Bachelor,3,37800,74.5,1800,450,650,1.52
|
| 364 |
+
Australia,Sydney,University of Technology Sydney,Computer Science,Master,2,40800,74.5,1800,450,650,1.52
|
| 365 |
+
Australia,Sydney,University of Technology Sydney,Computer Science,PhD,4,30800,74.5,1800,450,650,1.52
|
| 366 |
+
Australia,Melbourne,RMIT University,Computer Science,Bachelor,3,37200,72.8,1600,450,650,1.52
|
| 367 |
+
Australia,Melbourne,RMIT University,Computer Science,Master,2,40200,72.8,1600,450,650,1.52
|
| 368 |
+
Australia,Melbourne,RMIT University,Computer Science,PhD,4,30200,72.8,1600,450,650,1.52
|
| 369 |
+
Australia,Wollongong,University of Wollongong,Computer Science,Bachelor,3,36800,65.8,1300,450,650,1.52
|
| 370 |
+
Australia,Wollongong,University of Wollongong,Computer Science,Master,2,39800,65.8,1300,450,650,1.52
|
| 371 |
+
Australia,Wollongong,University of Wollongong,Computer Science,PhD,4,29800,65.8,1300,450,650,1.52
|
| 372 |
+
Australia,Newcastle,University of Newcastle,Computer Science,Bachelor,3,36200,66.2,1300,450,650,1.52
|
| 373 |
+
Australia,Newcastle,University of Newcastle,Computer Science,Master,2,39200,66.2,1300,450,650,1.52
|
| 374 |
+
Australia,Newcastle,University of Newcastle,Computer Science,PhD,4,29200,66.2,1300,450,650,1.52
|
| 375 |
+
Australia,Hobart,University of Tasmania,Computer Science,Bachelor,3,35800,64.5,1200,450,650,1.52
|
| 376 |
+
Australia,Hobart,University of Tasmania,Computer Science,Master,2,38800,64.5,1200,450,650,1.52
|
| 377 |
+
Australia,Hobart,University of Tasmania,Computer Science,PhD,4,28800,64.5,1200,450,650,1.52
|
| 378 |
+
Australia,Gold Coast,Griffith University,Computer Science,Bachelor,3,35200,68.5,1400,450,650,1.52
|
| 379 |
+
Australia,Gold Coast,Griffith University,Computer Science,Master,2,38200,68.5,1400,450,650,1.52
|
| 380 |
+
Australia,Gold Coast,Griffith University,Computer Science,PhD,4,28200,68.5,1400,450,650,1.52
|
| 381 |
+
Australia,Canberra,University of Canberra,Computer Science,Bachelor,3,34800,68.9,1500,450,650,1.52
|
| 382 |
+
Australia,Canberra,University of Canberra,Computer Science,Master,2,37800,68.9,1500,450,650,1.52
|
| 383 |
+
Australia,Canberra,University of Canberra,Computer Science,PhD,4,27800,68.9,1500,450,650,1.52
|
| 384 |
+
Australia,Townsville,James Cook University,Computer Science,Bachelor,3,34200,65.2,1200,450,650,1.52
|
| 385 |
+
Australia,Townsville,James Cook University,Computer Science,Master,2,37200,65.2,1200,450,650,1.52
|
| 386 |
+
Australia,Townsville,James Cook University,Computer Science,PhD,4,27200,65.2,1200,450,650,1.52
|
| 387 |
+
Australia,Armidale,University of New England,Computer Science,Bachelor,3,33800,63.8,1100,450,650,1.52
|
| 388 |
+
Australia,Armidale,University of New England,Computer Science,Master,2,36800,63.8,1100,450,650,1.52
|
| 389 |
+
Australia,Armidale,University of New England,Computer Science,PhD,4,26800,63.8,1100,450,650,1.52
|
| 390 |
+
Australia,Toowoomba,University of Southern Queensland,Computer Science,Bachelor,3,33200,64.2,1100,450,650,1.52
|
| 391 |
+
Australia,Toowoomba,University of Southern Queensland,Computer Science,Master,2,36200,64.2,1100,450,650,1.52
|
| 392 |
+
Australia,Toowoomba,University of Southern Queensland,Computer Science,PhD,4,26200,64.2,1100,450,650,1.52
|
| 393 |
+
Australia,Ballarat,Federation University,Computer Science,Bachelor,3,32800,63.5,1000,450,650,1.52
|
| 394 |
+
Australia,Ballarat,Federation University,Computer Science,Master,2,35800,63.5,1000,450,650,1.52
|
| 395 |
+
Australia,Ballarat,Federation University,Computer Science,PhD,4,25800,63.5,1000,450,650,1.52
|
| 396 |
+
Australia,Lismore,Southern Cross University,Computer Science,Bachelor,3,32200,63.2,1000,450,650,1.52
|
| 397 |
+
Australia,Lismore,Southern Cross University,Computer Science,Master,2,35200,63.2,1000,450,650,1.52
|
| 398 |
+
Australia,Lismore,Southern Cross University,Computer Science,PhD,4,25200,63.2,1000,450,650,1.52
|
| 399 |
+
USA,Boston,MIT,Computer Science,Master,2,58000,82.1,2100,160,1500,1.00
|
| 400 |
+
UK,London,Imperial College London,Data Science,Master,1,42000,75.3,1800,485,800,0.79
|
| 401 |
+
Germany,Munich,TU Munich,Mechanical Engineering,Master,2,0,71.5,1200,110,900,0.92
|
| 402 |
+
Canada,Toronto,University of Toronto,Business Analytics,Master,2,45000,73.8,1700,235,750,1.35
|
| 403 |
+
Australia,Melbourne,University of Melbourne,Artificial Intelligence,PhD,4,29000,72.4,1500,450,650,1.52
|
| 404 |
+
USA,Stanford,Stanford University,Physics,PhD,5,52000,84.3,2300,160,1500,1.00
|
| 405 |
+
UK,Edinburgh,University of Edinburgh,Chemistry,Master,2,38000,67.8,1100,485,800,0.79
|
| 406 |
+
Germany,Berlin,Humboldt University,Computer Science,Bachelor,3,0,68.9,950,110,900,0.92
|
| 407 |
+
Canada,Vancouver,University of British Columbia,Environmental Science,Master,2,42000,71.2,1600,235,750,1.35
|
| 408 |
+
Australia,Sydney,University of Sydney,Biotechnology,PhD,4,31000,75.6,1700,450,650,1.52
|
| 409 |
+
USA,Berkeley,UC Berkeley,Mathematics,Master,2,54000,83.2,2000,160,1500,1.00
|
| 410 |
+
UK,Manchester,University of Manchester,Engineering,Bachelor,3,35000,65.4,900,485,800,0.79
|
| 411 |
+
Germany,Hamburg,University of Hamburg,Physics,Master,2,0,69.8,1100,110,900,0.92
|
| 412 |
+
Canada,Montreal,McGill University,Computer Science,PhD,4,38000,68.9,1400,235,750,1.35
|
| 413 |
+
Australia,Brisbane,University of Queensland,Data Science,Master,2,32000,68.7,1200,450,650,1.52
|
| 414 |
+
USA,New York,Columbia University,Economics,Master,2,62000,100,2500,160,1500,1.00
|
| 415 |
+
UK,Oxford,University of Oxford,Computer Science,PhD,4,40000,71.5,1400,485,800,0.79
|
| 416 |
+
Germany,Dresden,TU Dresden,Mechanical Engineering,Bachelor,3,0,65.4,800,110,900,0.92
|
| 417 |
+
Canada,Ottawa,University of Ottawa,Artificial Intelligence,Master,2,40000,67.8,1300,235,750,1.35
|
| 418 |
+
Australia,Perth,University of Western Australia,Physics,Master,2,30000,67.2,1100,450,650,1.52
|
| 419 |
+
USA,Atlanta,Georgia Tech,Engineering,PhD,5,48000,71.2,1700,160,1500,1.00
|
| 420 |
+
UK,Bristol,University of Bristol,Data Science,Master,2,36000,68.9,1200,485,800,0.79
|
| 421 |
+
Germany,Frankfurt,Goethe University,Computer Science,Master,2,0,72.3,1300,110,900,0.92
|
| 422 |
+
Canada,Calgary,University of Calgary,Mathematics,Bachelor,4,35000,65.4,1200,235,750,1.35
|
| 423 |
+
Australia,Adelaide,University of Adelaide,Chemistry,PhD,4,28000,64.5,1000,450,650,1.52
|
| 424 |
+
USA,Los Angeles,UCLA,Computer Science,Master,2,52000,79.8,2200,160,1500,1.00
|
| 425 |
+
UK,Glasgow,University of Glasgow,Physics,Bachelor,3,34000,64.5,950,485,800,0.79
|
| 426 |
+
Germany,Stuttgart,University of Stuttgart,Engineering,Master,2,0,68.7,1100,110,900,0.92
|
| 427 |
+
Canada,Edmonton,University of Alberta,Data Science,Master,2,37000,64.3,1100,235,750,1.35
|
| 428 |
+
Australia,Canberra,Australian National University,Computer Science,PhD,4,33000,69.8,1300,450,650,1.52
|
| 429 |
+
USA,Austin,UT Austin,Mathematics,Master,2,45000,68.9,1600,160,1500,1.00
|
| 430 |
+
UK,Leeds,University of Leeds,Chemistry,PhD,4,35000,63.2,900,485,800,0.79
|
| 431 |
+
Germany,Heidelberg,Heidelberg University,Physics,Bachelor,3,0,67.8,1000,110,900,0.92
|
| 432 |
+
Canada,Halifax,Dalhousie University,Engineering,Master,2,36000,63.4,1000,235,750,1.35
|
| 433 |
+
Australia,Gold Coast,Griffith University,Data Science,Master,2,29000,65.4,1100,450,650,1.52
|
| 434 |
+
USA,Seattle,University of Washington,Computer Science,PhD,5,50000,77.8,2000,160,1500,1.00
|
| 435 |
+
UK,Sheffield,University of Sheffield,Engineering,Master,2,33000,62.3,850,485,800,0.79
|
| 436 |
+
Germany,Cologne,University of Cologne,Mathematics,Master,2,0,69.8,1200,110,900,0.92
|
| 437 |
+
Canada,Quebec City,Laval University,Physics,Bachelor,3,34000,62.1,900,235,750,1.35
|
| 438 |
+
Australia,Newcastle,University of Newcastle,Chemistry,Master,2,27000,63.2,950,450,650,1.52
|
| 439 |
+
USA,Pittsburgh,Carnegie Mellon,Data Science,Master,2,56000,65.4,1500,160,1500,1.00
|
| 440 |
+
UK,Nottingham,University of Nottingham,Computer Science,PhD,4,34000,61.2,800,485,800,0.79
|
| 441 |
+
Germany,Bonn,University of Bonn,Engineering,Master,2,0,67.8,1100,110,900,0.92
|
| 442 |
+
Canada,Victoria,University of Victoria,Mathematics,Master,2,35000,64.5,1100,235,750,1.35
|
| 443 |
+
Australia,Hobart,University of Tasmania,Physics,Bachelor,3,26000,62.1,900,450,650,1.52
|
| 444 |
+
USA,San Diego,UC San Diego,Chemistry,PhD,5,49000,75.6,1900,160,1500,1.00
|
| 445 |
+
UK,Durham,Durham University,Engineering,Master,2,35000,63.4,900,485,800,0.79
|
| 446 |
+
Germany,Aachen,RWTH Aachen,Computer Science,Bachelor,3,0,68.9,1000,110,900,0.92
|
| 447 |
+
Canada,Winnipeg,University of Manitoba,Data Science,Master,2,33000,61.2,900,235,750,1.35
|
| 448 |
+
Australia,Wollongong,University of Wollongong,Mathematics,PhD,4,28000,63.4,950,450,650,1.52
|
| 449 |
+
USA,San Francisco,UC Berkeley Extension,Data Science,Master,2,52000,95.2,2400,160,1500,1.00
|
| 450 |
+
UK,London,King's College London,Computer Science,Master,1,39000,75.3,1900,485,800,0.79
|
| 451 |
+
Switzerland,Zurich,ETH Zurich,Computer Science,Master,2,1500,122.4,2000,140,1200,0.89
|
| 452 |
+
France,Paris,Sorbonne University,Data Analytics,Master,2,4500,84.3,1800,99,850,0.92
|
| 453 |
+
Ireland,Dublin,Trinity College Dublin,Computer Science,PhD,4,18900,83.6,1700,150,750,0.92
|
| 454 |
+
USA,Chicago,University of Chicago,Data Science,Master,2,58000,84.1,1900,160,1500,1.00
|
| 455 |
+
UK,Cambridge,Anglia Ruskin University,Data Analytics,Bachelor,3,35000,71.2,1500,485,800,0.79
|
| 456 |
+
Switzerland,Lausanne,EPFL,Computer Science,PhD,4,1500,119.8,1900,140,1200,0.89
|
| 457 |
+
France,Lyon,University of Lyon,Data Science,Master,2,4200,75.6,1200,99,850,0.92
|
| 458 |
+
Ireland,Cork,University College Cork,Computer Science,Master,2,16800,75.4,1300,150,750,0.92
|
| 459 |
+
USA,Boston,Northeastern University,Data Analytics,Master,2,54000,82.1,2200,160,1500,1.00
|
| 460 |
+
UK,Edinburgh,Heriot-Watt University,Computer Science,Master,1,37000,67.8,1200,485,800,0.79
|
| 461 |
+
Switzerland,Geneva,University of Geneva,Data Science,Master,2,1500,116.5,1800,140,1200,0.89
|
| 462 |
+
France,Toulouse,University of Toulouse,Computer Science,Bachelor,3,4000,71.2,900,99,850,0.92
|
| 463 |
+
Ireland,Galway,NUI Galway,Data Analytics,Master,2,15900,72.3,1100,150,750,0.92
|
| 464 |
+
USA,Seattle,University of Washington,Data Science,PhD,4,51000,77.8,2100,160,1500,1.00
|
| 465 |
+
UK,Birmingham,University of Birmingham,Computer Science,Master,1,36000,65.4,1100,485,800,0.79
|
| 466 |
+
Switzerland,Basel,University of Basel,Data Science,Master,2,1500,114.3,1700,140,1200,0.89
|
| 467 |
+
France,Bordeaux,University of Bordeaux,Data Analytics,Master,2,4300,72.1,1000,99,850,0.92
|
| 468 |
+
Ireland,Limerick,University of Limerick,Computer Science,Bachelor,4,15400,71.2,1000,150,750,0.92
|
| 469 |
+
USA,Austin,UT Austin,Computer Science,Master,2,49000,68.9,1800,160,1500,1.00
|
| 470 |
+
UK,Manchester,University of Salford,Data Science,Master,1,35000,65.4,1000,485,800,0.79
|
| 471 |
+
Switzerland,St. Gallen,University of St. Gallen,Data Analytics,Master,2,1500,112.1,1600,140,1200,0.89
|
| 472 |
+
France,Nice,University of Nice,Computer Science,Master,2,4100,76.5,1300,99,850,0.92
|
| 473 |
+
Ireland,Maynooth,Maynooth University,Data Science,PhD,4,14900,70.1,950,150,750,0.92
|
| 474 |
+
USA,Denver,University of Denver,Data Analytics,Master,2,47000,69.8,1700,160,1500,1.00
|
| 475 |
+
UK,Leeds,Leeds Beckett University,Computer Science,Bachelor,3,34000,63.2,900,485,800,0.79
|
| 476 |
+
Switzerland,Bern,University of Bern,Data Science,Master,2,1500,110.4,1500,140,1200,0.89
|
| 477 |
+
France,Lille,University of Lille,Data Analytics,PhD,4,4200,69.8,950,99,850,0.92
|
| 478 |
+
Ireland,Waterford,Waterford IT,Computer Science,Master,2,14500,68.9,900,150,750,0.92
|
| 479 |
+
USA,Portland,Portland State University,Data Science,Master,2,45000,71.2,1600,160,1500,1.00
|
| 480 |
+
UK,Bristol,UWE Bristol,Computer Science,Master,1,33000,68.9,1100,485,800,0.79
|
| 481 |
+
Switzerland,Lugano,USI Lugano,Data Analytics,Master,2,1500,108.9,1400,140,1200,0.89
|
| 482 |
+
France,Strasbourg,University of Strasbourg,Computer Science,Master,2,4000,70.2,1000,99,850,0.92
|
| 483 |
+
Ireland,Sligo,IT Sligo,Data Science,Bachelor,4,14000,67.5,850,150,750,0.92
|
| 484 |
+
USA,Minneapolis,University of Minnesota,Computer Science,PhD,4,48000,72.3,1700,160,1500,1.00
|
| 485 |
+
UK,Cardiff,Cardiff University,Data Analytics,Master,1,34000,64.5,950,485,800,0.79
|
| 486 |
+
Switzerland,Fribourg,University of Fribourg,Computer Science,Master,2,1500,107.8,1300,140,1200,0.89
|
| 487 |
+
France,Grenoble,Grenoble INP,Data Science,Master,2,4100,71.5,1100,99,850,0.92
|
| 488 |
+
Ireland,Athlone,Athlone IT,Data Analytics,Master,2,13800,66.7,800,150,750,0.92
|
| 489 |
+
Norway,Oslo,University of Oslo,Computer Science,Master,2,0,83.2,1400,275,700,10.45
|
| 490 |
+
Finland,Helsinki,University of Helsinki,Data Science,Master,2,0,79.4,1200,350,650,0.92
|
| 491 |
+
Germany,Berlin,Technical University Berlin,Mechanical Engineering,Master,2,0,68.9,1100,110,900,0.92
|
| 492 |
+
Denmark,Copenhagen,University of Copenhagen,Physics,PhD,4,0,82.1,1500,450,800,7.45
|
| 493 |
+
Norway,Trondheim,NTNU,Robotics,Master,2,0,75.6,1100,275,700,10.45
|
| 494 |
+
Finland,Espoo,Aalto University,Computer Engineering,Bachelor,3,0,77.8,1000,350,650,0.92
|
| 495 |
+
Germany,Munich,LMU Munich,Mathematics,PhD,4,0,71.5,1300,110,900,0.92
|
| 496 |
+
Denmark,Aarhus,Aarhus University,Data Analytics,Master,2,0,76.5,1200,450,800,7.45
|
| 497 |
+
Norway,Bergen,University of Bergen,Artificial Intelligence,Master,2,0,74.3,1200,275,700,10.45
|
| 498 |
+
Finland,Tampere,Tampere University,Software Engineering,Master,2,0,72.1,900,350,650,0.92
|
| 499 |
+
Germany,Dresden,TU Dresden,Computer Science,Bachelor,3,0,65.4,900,110,900,0.92
|
| 500 |
+
Denmark,Odense,University of Southern Denmark,Biotechnology,Master,2,0,73.2,1100,450,800,7.45
|
| 501 |
+
Norway,Tromsø,UiT Arctic University,Marine Technology,PhD,4,0,71.2,1000,275,700,10.45
|
| 502 |
+
Finland,Turku,University of Turku,Bioinformatics,Master,2,0,71.8,850,350,650,0.92
|
| 503 |
+
Germany,Hamburg,TU Hamburg,Electrical Engineering,Master,2,0,69.8,1200,110,900,0.92
|
| 504 |
+
Denmark,Aalborg,Aalborg University,Energy Engineering,Bachelor,3,0,71.5,1000,450,800,7.45
|
| 505 |
+
Norway,Stavanger,University of Stavanger,Petroleum Engineering,Master,2,0,72.4,1100,275,700,10.45
|
| 506 |
+
Finland,Oulu,University of Oulu,Computer Science,PhD,4,0,70.2,800,350,650,0.92
|
| 507 |
+
Germany,Stuttgart,University of Stuttgart,Aerospace Engineering,Master,2,0,68.7,1100,110,900,0.92
|
| 508 |
+
Denmark,Roskilde,Roskilde University,Environmental Science,Master,2,0,70.8,1000,450,800,7.45
|
| 509 |
+
Norway,Ås,Norwegian University of Life Sciences,Biotechnology,Master,2,0,70.5,900,275,700,10.45
|
| 510 |
+
Finland,Vaasa,University of Vaasa,Industrial Management,Master,2,0,69.8,800,350,650,0.92
|
| 511 |
+
Germany,Karlsruhe,KIT,Mechatronics,PhD,4,0,67.9,1000,110,900,0.92
|
| 512 |
+
Denmark,Lyngby,Technical University of Denmark,Quantum Engineering,Master,2,0,81.2,1400,450,800,7.45
|
| 513 |
+
Norway,Bodø,Nord University,Marine Biology,Bachelor,3,0,69.4,850,275,700,10.45
|
| 514 |
+
Finland,Jyväskylä,University of Jyväskylä,Data Science,Master,2,0,68.7,750,350,650,0.92
|
| 515 |
+
Germany,Darmstadt,TU Darmstadt,Computer Engineering,Master,2,0,66.8,950,110,900,0.92
|
| 516 |
+
Denmark,Kolding,University of Southern Denmark,Software Engineering,PhD,4,0,69.5,900,450,800,7.45
|
| 517 |
+
Norway,Gjøvik,NTNU Gjøvik,Information Security,Master,2,0,68.9,800,275,700,10.45
|
| 518 |
+
Finland,Lappeenranta,LUT University,Industrial Engineering,Master,2,0,67.5,700,350,650,0.92
|
| 519 |
+
Germany,Bremen,University of Bremen,Robotics,Master,2,0,66.5,900,110,900,0.92
|
| 520 |
+
Denmark,Esbjerg,University of Southern Denmark,Environmental Engineering,Master,2,0,68.4,850,450,800,7.45
|
| 521 |
+
Norway,Kristiansand,University of Agder,Renewable Energy,PhD,4,0,67.8,850,275,700,10.45
|
| 522 |
+
Finland,Kuopio,University of Eastern Finland,Environmental Science,Bachelor,3,0,66.9,700,350,650,0.92
|
| 523 |
+
Germany,Aachen,RWTH Aachen,Materials Science,Master,2,0,68.9,1000,110,900,0.92
|
| 524 |
+
Denmark,Slagelse,University of Copenhagen,Bioinformatics,Master,2,0,67.5,900,450,800,7.45
|
| 525 |
+
Norway,Horten,University of South-Eastern Norway,Systems Engineering,Master,2,0,66.7,800,275,700,10.45
|
| 526 |
+
Finland,Joensuu,University of Eastern Finland,Forestry Sciences,PhD,4,0,65.8,650,350,650,0.92
|
| 527 |
+
Germany,Jena,University of Jena,Photonics,Master,2,0,65.4,850,110,900,0.92
|
| 528 |
+
Denmark,Herning,Aarhus University,Engineering Management,Master,2,0,66.2,800,450,800,7.45
|
| 529 |
+
New Zealand,Auckland,University of Auckland,Computer Science,Master,2,32000,79.5,1200,330,600,1.65
|
| 530 |
+
USA,Boston,Northeastern University,Data Science,Master,2,54000,82.1,2000,160,1500,1.00
|
| 531 |
+
Sweden,Stockholm,KTH Royal Institute,Engineering Physics,Master,2,0,78.4,1100,120,750,10.45
|
| 532 |
+
Netherlands,Amsterdam,University of Amsterdam,Artificial Intelligence,PhD,4,15000,81.2,1300,171,720,0.92
|
| 533 |
+
Portugal,Lisbon,University of Lisbon,Computer Engineering,Master,2,7000,65.8,800,75,400,0.92
|
| 534 |
+
New Zealand,Wellington,Victoria University,Data Analytics,Master,2,30000,75.6,1100,330,600,1.65
|
| 535 |
+
USA,Austin,UT Austin,Robotics,PhD,5,48000,68.9,1600,160,1500,1.00
|
| 536 |
+
Sweden,Uppsala,Uppsala University,Mathematics,Bachelor,3,0,72.3,900,120,750,10.45
|
| 537 |
+
Netherlands,Rotterdam,Erasmus University,Business Analytics,Master,2,14500,77.8,1200,171,720,0.92
|
| 538 |
+
Portugal,Porto,University of Porto,Software Engineering,Master,2,6500,62.4,700,75,400,0.92
|
| 539 |
+
New Zealand,Christchurch,University of Canterbury,Mechanical Engineering,PhD,4,31000,72.4,950,330,600,1.65
|
| 540 |
+
USA,San Diego,UC San Diego,Biotechnology,Master,2,49000,75.6,1900,160,1500,1.00
|
| 541 |
+
Sweden,Gothenburg,Chalmers University,Sustainable Energy,Master,2,0,71.2,950,120,750,10.45
|
| 542 |
+
Netherlands,Delft,TU Delft,Computer Science,Master,2,15500,76.5,1100,171,720,0.92
|
| 543 |
+
Portugal,Coimbra,University of Coimbra,Data Science,Bachelor,3,6000,58.9,600,75,400,0.92
|
| 544 |
+
New Zealand,Dunedin,University of Otago,Information Systems,Master,2,29000,70.2,900,330,600,1.65
|
| 545 |
+
USA,Seattle,University of Washington,Computer Engineering,Master,2,51000,77.8,2100,160,1500,1.00
|
| 546 |
+
Sweden,Lund,Lund University,Physics,PhD,4,0,73.4,1000,120,750,10.45
|
| 547 |
+
Netherlands,Eindhoven,TU Eindhoven,Artificial Intelligence,Master,2,14800,72.3,950,171,720,0.92
|
| 548 |
+
Portugal,Braga,University of Minho,Computer Science,Master,2,6200,57.8,550,75,400,0.92
|
| 549 |
+
New Zealand,Hamilton,University of Waikato,Environmental Science,Master,2,28500,68.9,850,330,600,1.65
|
| 550 |
+
USA,Atlanta,Georgia Tech,Machine Learning,PhD,5,48000,71.2,1700,160,1500,1.00
|
| 551 |
+
Sweden,Linköping,Linköping University,Computer Science,Master,2,0,69.8,850,120,750,10.45
|
| 552 |
+
Netherlands,Utrecht,Utrecht University,Data Science,Bachelor,3,13900,75.4,1100,171,720,0.92
|
| 553 |
+
Portugal,Aveiro,University of Aveiro,Robotics,PhD,4,6800,56.7,500,75,400,0.92
|
| 554 |
+
New Zealand,Palmerston North,Massey University,Computer Engineering,Bachelor,3,27500,67.5,800,330,600,1.65
|
| 555 |
+
USA,Pittsburgh,Carnegie Mellon,Software Engineering,Master,2,56000,65.4,1500,160,1500,1.00
|
| 556 |
+
Sweden,Umeå,Umeå University,Artificial Intelligence,Master,2,0,68.5,800,120,750,10.45
|
| 557 |
+
Netherlands,Groningen,University of Groningen,Computing Science,PhD,4,14200,71.2,900,171,720,0.92
|
| 558 |
+
Portugal,Faro,University of Algarve,Information Systems,Master,2,5900,55.4,480,75,400,0.92
|
| 559 |
+
New Zealand,Auckland,AUT University,Data Analytics,Master,2,29500,79.5,1150,330,600,1.65
|
| 560 |
+
USA,Raleigh,NC State University,Computer Science,Master,2,47000,67.8,1400,160,1500,1.00
|
| 561 |
+
Sweden,Karlstad,Karlstad University,Information Systems,Bachelor,3,0,67.2,750,120,750,10.45
|
| 562 |
+
Netherlands,Tilburg,Tilburg University,Data Science,Master,2,14000,70.5,950,171,720,0.92
|
| 563 |
+
Portugal,Vila Real,UTAD,Computer Engineering,Master,2,5700,54.3,450,75,400,0.92
|
| 564 |
+
New Zealand,Christchurch,Lincoln University,Environmental Computing,PhD,4,28000,72.4,900,330,600,1.65
|
| 565 |
+
USA,Davis,UC Davis,Data Science,Master,2,48000,73.2,1600,160,1500,1.00
|
| 566 |
+
Sweden,Växjö,Linnaeus University,Software Engineering,Master,2,0,66.5,700,120,750,10.45
|
| 567 |
+
Netherlands,Wageningen,Wageningen University,Bioinformatics,Master,2,14500,69.8,900,171,720,0.92
|
| 568 |
+
Portugal,Funchal,University of Madeira,Computing,Bachelor,3,5500,53.2,400,75,400,0.92
|
| 569 |
+
Spain,Madrid,Universidad Politécnica de Madrid,Computer Science,Master,2,3500,71.4,1100,80,750,0.92
|
| 570 |
+
Italy,Milan,Politecnico di Milano,Data Engineering,Master,2,4000,73.2,1200,120,700,0.92
|
| 571 |
+
Greece,Athens,National Technical University,Electrical Engineering,PhD,4,0,65.8,650,100,600,0.92
|
| 572 |
+
Austria,Vienna,TU Wien,Software Engineering,Master,2,1500,78.5,950,160,850,0.92
|
| 573 |
+
Mexico,Mexico City,UNAM,Computer Engineering,Bachelor,4,800,52.4,600,40,400,17.05
|
| 574 |
+
Spain,Barcelona,Universitat Politècnica Catalunya,Artificial Intelligence,Master,2,3800,73.6,1000,80,750,0.92
|
| 575 |
+
Italy,Rome,Sapienza University,Robotics,PhD,4,3500,71.2,1100,120,700,0.92
|
| 576 |
+
Greece,Thessaloniki,Aristotle University,Computer Engineering,Master,2,0,62.4,500,100,600,0.92
|
| 577 |
+
Austria,Graz,TU Graz,Mechanical Engineering,Bachelor,3,1500,71.2,750,160,850,0.92
|
| 578 |
+
Mexico,Monterrey,Tecnológico de Monterrey,Data Science,Master,2,12000,48.9,700,40,400,17.05
|
| 579 |
+
Spain,Valencia,Universitat de València,Data Science,Master,2,3200,68.5,800,80,750,0.92
|
| 580 |
+
Italy,Turin,Politecnico di Torino,Computer Engineering,Master,2,3800,69.8,900,120,700,0.92
|
| 581 |
+
Greece,Patras,University of Patras,Electronics,PhD,4,0,60.5,450,100,600,0.92
|
| 582 |
+
Austria,Linz,Johannes Kepler University,Artificial Intelligence,Master,2,1500,70.4,700,160,850,0.92
|
| 583 |
+
Mexico,Guadalajara,Universidad de Guadalajara,Software Engineering,Bachelor,4,900,45.6,500,40,400,17.05
|
| 584 |
+
Spain,Seville,Universidad de Sevilla,Robotics,Master,2,3000,65.4,750,80,750,0.92
|
| 585 |
+
Italy,Bologna,University of Bologna,Information Technology,PhD,4,3600,70.5,950,120,700,0.92
|
| 586 |
+
Greece,Heraklion,University of Crete,Computer Science,Master,2,0,61.2,480,100,600,0.92
|
| 587 |
+
Austria,Salzburg,University of Salzburg,Data Analytics,Bachelor,3,1500,72.3,800,160,850,0.92
|
| 588 |
+
Mexico,Puebla,UDLAP,Computer Engineering,Master,2,10000,44.5,450,40,400,17.05
|
| 589 |
+
Spain,Bilbao,University of the Basque Country,Computer Science,PhD,4,3400,67.8,850,80,750,0.92
|
| 590 |
+
Italy,Florence,University of Florence,Cybersecurity,Master,2,3500,71.2,1000,120,700,0.92
|
| 591 |
+
Greece,Volos,University of Thessaly,Digital Systems,Master,2,0,59.8,400,100,600,0.92
|
| 592 |
+
Austria,Innsbruck,University of Innsbruck,Mechatronics,Master,2,1500,71.5,780,160,850,0.92
|
| 593 |
+
Mexico,Queretaro,Tecnologico de Monterrey,Data Analytics,Bachelor,4,11000,46.7,480,40,400,17.05
|
| 594 |
+
Spain,Granada,University of Granada,Artificial Intelligence,Master,2,2800,64.5,700,80,750,0.92
|
| 595 |
+
Italy,Naples,University of Naples,Software Engineering,PhD,4,3200,67.8,800,120,700,0.92
|
| 596 |
+
Greece,Ioannina,University of Ioannina,Information Systems,Bachelor,4,0,58.9,380,100,600,0.92
|
| 597 |
+
Austria,Klagenfurt,University of Klagenfurt,Data Science,Master,2,1500,69.4,720,160,850,0.92
|
| 598 |
+
Mexico,Merida,Universidad Autonoma de Yucatan,Computer Engineering,Master,2,3500,43.2,400,40,400,17.05
|
| 599 |
+
Spain,Zaragoza,University of Zaragoza,Robotics,Master,2,2900,63.2,650,80,750,0.92
|
| 600 |
+
Italy,Pisa,University of Pisa,Computer Engineering,Master,2,3300,68.9,850,120,700,0.92
|
| 601 |
+
Greece,Rhodes,University of the Aegean,Digital Innovation,Master,2,0,61.2,420,100,600,0.92
|
| 602 |
+
Austria,Leoben,Montanuniversität Leoben,Industrial Engineering,PhD,4,1500,68.7,700,160,850,0.92
|
| 603 |
+
Mexico,Tijuana,CETYS Universidad,Information Technology,Bachelor,4,9500,45.4,550,40,400,17.05
|
| 604 |
+
Spain,Salamanca,University of Salamanca,Data Science,PhD,4,3100,62.1,600,80,750,0.92
|
| 605 |
+
Italy,Padua,University of Padua,Artificial Intelligence,Master,2,3400,69.5,900,120,700,0.92
|
| 606 |
+
Greece,Chania,Technical University of Crete,Electronic Engineering,Master,2,0,60.4,450,100,600,0.92
|
| 607 |
+
Austria,Dornbirn,FH Vorarlberg,Software Development,Bachelor,3,1500,70.2,800,160,850,0.92
|
| 608 |
+
Mexico,San Luis Potosi,UASLP,Computer Systems,Master,2,2800,42.8,380,40,400,17.05
|
| 609 |
+
Turkey,Istanbul,Bogazici University,Computer Engineering,Master,2,1500,51.2,600,90,500,28.50
|
| 610 |
+
Greece,Athens,Athens University of Economics,Data Science,Master,2,0,65.8,650,100,600,0.92
|
| 611 |
+
Belgium,Leuven,KU Leuven,Artificial Intelligence,PhD,4,3800,76.5,950,180,800,0.92
|
| 612 |
+
Hungary,Budapest,Budapest University of Technology,Software Engineering,Master,2,6500,53.4,500,140,450,350.25
|
| 613 |
+
Russia,Moscow,Moscow State University,Computer Science,Bachelor,4,5500,62.3,600,160,400,95.50
|
| 614 |
+
Turkey,Ankara,Middle East Technical University,Data Engineering,Master,2,1200,48.5,450,90,500,28.50
|
| 615 |
+
Greece,Thessaloniki,University of Macedonia,Information Systems,PhD,4,0,62.4,500,100,600,0.92
|
| 616 |
+
Belgium,Ghent,Ghent University,Computer Science,Master,2,3500,72.8,850,180,800,0.92
|
| 617 |
+
Hungary,Debrecen,University of Debrecen,Mechatronics,Bachelor,3,5800,48.9,400,140,450,350.25
|
| 618 |
+
Russia,Saint Petersburg,ITMO University,Data Science,Master,2,5000,60.1,550,160,400,95.50
|
| 619 |
+
Turkey,Izmir,Ege University,Electronics Engineering,PhD,4,1300,47.8,400,90,500,28.50
|
| 620 |
+
Greece,Patras,University of Patras,Computer Engineering,Master,2,0,60.5,450,100,600,0.92
|
| 621 |
+
Belgium,Brussels,Vrije Universiteit Brussel,Robotics,Master,2,3600,75.4,900,180,800,0.92
|
| 622 |
+
Hungary,Szeged,University of Szeged,Computer Science,PhD,4,6000,47.2,380,140,450,350.25
|
| 623 |
+
Russia,Novosibirsk,Novosibirsk State University,Mathematics,Master,2,4800,55.4,400,160,400,95.50
|
| 624 |
+
Turkey,Eskisehir,Anadolu University,Information Systems,Bachelor,4,1000,45.6,350,90,500,28.50
|
| 625 |
+
Greece,Heraklion,University of Crete,Data Analytics,Master,2,0,61.2,480,100,600,0.92
|
| 626 |
+
Belgium,Antwerp,University of Antwerp,Computer Science,PhD,4,3700,71.2,800,180,800,0.92
|
| 627 |
+
Hungary,Pecs,University of Pecs,Software Development,Master,2,5500,46.8,350,140,450,350.25
|
| 628 |
+
Russia,Kazan,Kazan Federal University,Artificial Intelligence,Bachelor,4,4500,52.3,380,160,400,95.50
|
| 629 |
+
Turkey,Bursa,Uludag University,Computer Science,Master,2,1100,46.5,380,90,500,28.50
|
| 630 |
+
Greece,Volos,University of Thessaly,Cybersecurity,PhD,4,0,59.8,400,100,600,0.92
|
| 631 |
+
Belgium,Louvain,UCLouvain,Data Engineering,Master,2,3500,70.5,780,180,800,0.92
|
| 632 |
+
Hungary,Gyor,Szechenyi Istvan University,Robotics,Bachelor,3,5200,45.6,320,140,450,350.25
|
| 633 |
+
Russia,Tomsk,Tomsk State University,Software Engineering,Master,2,4600,51.2,350,160,400,95.50
|
| 634 |
+
Turkey,Antalya,Akdeniz University,Data Science,PhD,4,1400,47.8,420,90,500,28.50
|
| 635 |
+
Greece,Piraeus,University of Piraeus,Information Technology,Master,2,0,63.4,550,100,600,0.92
|
| 636 |
+
Belgium,Hasselt,Hasselt University,Artificial Intelligence,Bachelor,3,3400,69.8,750,180,800,0.92
|
| 637 |
+
Hungary,Miskolc,University of Miskolc,Computer Engineering,Master,2,5300,44.5,300,140,450,350.25
|
| 638 |
+
Russia,Yekaterinburg,Ural Federal University,Data Analytics,PhD,4,4700,53.4,400,160,400,95.50
|
| 639 |
+
Turkey,Kayseri,Erciyes University,Software Engineering,Master,2,1200,45.2,350,90,500,28.50
|
| 640 |
+
Greece,Xanthi,Democritus University,Computer Engineering,Bachelor,4,0,58.7,380,100,600,0.92
|
| 641 |
+
Belgium,Liege,University of Liege,Data Science,PhD,4,3600,68.9,720,180,800,0.92
|
| 642 |
+
Hungary,Veszprem,University of Pannonia,Information Systems,Master,2,5100,44.8,310,140,450,350.25
|
| 643 |
+
Russia,Samara,Samara State University,Computer Science,Master,2,4400,50.5,370,160,400,95.50
|
| 644 |
+
Turkey,Konya,Selcuk University,Artificial Intelligence,Bachelor,4,1000,44.5,330,90,500,28.50
|
| 645 |
+
Greece,Chios,University of the Aegean,Digital Systems,Master,2,0,59.2,400,100,600,0.92
|
| 646 |
+
Belgium,Mons,University of Mons,Computer Engineering,Master,2,3500,67.8,700,180,800,0.92
|
| 647 |
+
Hungary,Kecskemet,John von Neumann University,Data Analytics,PhD,4,5400,43.9,290,140,450,350.25
|
| 648 |
+
Russia,Rostov-on-Don,Southern Federal University,Information Technology,Bachelor,4,4200,49.8,350,160,400,95.50
|
| 649 |
+
Brazil,Sao Paulo,University of Sao Paulo,Computer Science,Master,2,0,55.8,600,90,400,4.95
|
| 650 |
+
India,Bangalore,Indian Institute of Science,Data Science,PhD,4,2000,45.2,300,180,300,82.75
|
| 651 |
+
Thailand,Bangkok,Chulalongkorn University,Software Engineering,Master,2,15000,51.4,500,80,350,35.25
|
| 652 |
+
Egypt,Cairo,Cairo University,Computer Engineering,Bachelor,4,2500,31.8,250,100,200,30.90
|
| 653 |
+
Singapore,Singapore,National University of Singapore,Artificial Intelligence,Master,2,42000,83.8,1200,90,800,1.35
|
| 654 |
+
UAE,Dubai,University of Dubai,Data Analytics,Master,2,25000,72.4,1100,270,750,3.67
|
| 655 |
+
Brazil,Rio de Janeiro,PUC-Rio,Information Systems,PhD,4,8000,53.2,550,90,400,4.95
|
| 656 |
+
India,Mumbai,IIT Bombay,Computer Engineering,Master,2,1800,47.5,350,180,300,82.75
|
| 657 |
+
Thailand,Chiang Mai,Chiang Mai University,Data Science,Bachelor,4,12000,45.6,300,80,350,35.25
|
| 658 |
+
Singapore,Singapore,Nanyang Technological University,Computer Science,PhD,4,40000,83.8,1100,90,800,1.35
|
| 659 |
+
UAE,Abu Dhabi,Khalifa University,Robotics,Master,2,27000,71.8,1000,270,750,3.67
|
| 660 |
+
Brazil,Campinas,UNICAMP,Computer Engineering,Master,2,0,51.4,450,90,400,4.95
|
| 661 |
+
India,Delhi,IIT Delhi,Artificial Intelligence,PhD,4,1900,44.8,320,180,300,82.75
|
| 662 |
+
Thailand,Khon Kaen,Khon Kaen University,Information Technology,Master,2,11000,42.5,250,80,350,35.25
|
| 663 |
+
Egypt,Alexandria,Alexandria University,Software Engineering,Master,2,2200,30.5,200,100,200,30.90
|
| 664 |
+
Singapore,Singapore,Singapore Management University,Data Analytics,Bachelor,4,38000,83.8,1150,90,800,1.35
|
| 665 |
+
UAE,Sharjah,American University of Sharjah,Computer Science,PhD,4,26000,68.5,900,270,750,3.67
|
| 666 |
+
Brazil,Porto Alegre,UFRGS,Data Science,Bachelor,4,0,49.8,400,90,400,4.95
|
| 667 |
+
India,Chennai,IIT Madras,Software Engineering,Master,2,1700,42.4,280,180,300,82.75
|
| 668 |
+
Thailand,Phuket,Prince of Songkla University,Computer Engineering,Master,2,10000,44.8,300,80,350,35.25
|
| 669 |
+
Egypt,Giza,Ain Shams University,Data Science,PhD,4,2400,31.2,220,100,200,30.90
|
| 670 |
+
Singapore,Singapore,Singapore University of Technology,Artificial Intelligence,Master,2,39000,83.8,1100,90,800,1.35
|
| 671 |
+
UAE,Ajman,Ajman University,Information Systems,Bachelor,4,23000,65.4,800,270,750,3.67
|
| 672 |
+
Brazil,Recife,UFPE,Computer Engineering,Master,2,0,47.5,350,90,400,4.95
|
| 673 |
+
India,Hyderabad,IIT Hyderabad,Data Analytics,PhD,4,1800,41.2,260,180,300,82.75
|
| 674 |
+
Thailand,Hat Yai,Prince of Songkla University,Software Engineering,Bachelor,4,9500,43.2,280,80,350,35.25
|
| 675 |
+
Egypt,Port Said,Port Said University,Computer Science,Master,2,2100,29.8,180,100,200,30.90
|
| 676 |
+
Singapore,Singapore,SUTD,Robotics,PhD,4,37000,83.8,1050,90,800,1.35
|
| 677 |
+
UAE,Al Ain,UAE University,Data Science,Master,2,24000,64.2,750,270,750,3.67
|
| 678 |
+
Brazil,Florianopolis,UFSC,Information Technology,PhD,4,0,48.9,400,90,400,4.95
|
| 679 |
+
India,Pune,IIT Pune,Computer Science,Master,2,1600,40.5,250,180,300,82.75
|
| 680 |
+
Thailand,Nakhon Ratchasima,Suranaree University,Data Engineering,Master,2,9000,41.8,250,80,350,35.25
|
| 681 |
+
Egypt,Mansoura,Mansoura University,Information Systems,Bachelor,4,2000,28.5,170,100,200,30.90
|
| 682 |
+
Singapore,Singapore,SIM Global Education,Software Engineering,Bachelor,4,35000,83.8,1000,90,800,1.35
|
| 683 |
+
UAE,Ras Al Khaimah,RAK University,Computer Engineering,Master,2,22000,62.5,700,270,750,3.67
|
| 684 |
+
Brazil,Salvador,UFBA,Data Science,Master,2,0,46.8,380,90,400,4.95
|
| 685 |
+
India,Kanpur,IIT Kanpur,Artificial Intelligence,PhD,4,1900,39.8,240,180,300,82.75
|
| 686 |
+
Thailand,Songkhla,Thaksin University,Computer Engineering,Bachelor,4,8500,42.5,270,80,350,35.25
|
| 687 |
+
Egypt,Aswan,Aswan University,Data Analytics,Master,2,1900,27.8,160,100,200,30.90
|
| 688 |
+
UAE,Fujairah,Fujairah University,Information Technology,Bachelor,4,21000,61.4,650,270,750,3.67
|
| 689 |
+
Iceland,Reykjavik,University of Iceland,Computer Science,Master,2,0,84.5,1200,140,900,137.50
|
| 690 |
+
Colombia,Bogota,Universidad Nacional,Software Engineering,Master,2,3500,41.2,400,80,300,3950
|
| 691 |
+
Poland,Warsaw,University of Warsaw,Data Science,PhD,4,3000,54.8,650,80,400,4.10
|
| 692 |
+
Romania,Bucharest,University Politehnica,Computer Engineering,Bachelor,3,2500,45.2,450,120,350,4.65
|
| 693 |
+
Luxembourg,Luxembourg City,University of Luxembourg,Artificial Intelligence,Master,2,400,83.2,1400,100,800,0.92
|
| 694 |
+
Indonesia,Jakarta,University of Indonesia,Information Systems,Master,2,5000,45.8,400,150,250,15600
|
| 695 |
+
Iceland,Akureyri,University of Akureyri,Data Analytics,Bachelor,3,0,78.4,900,140,900,137.50
|
| 696 |
+
Colombia,Medellin,Universidad de Antioquia,Computer Science,PhD,4,4000,38.5,350,80,300,3950
|
| 697 |
+
Poland,Krakow,Jagiellonian University,Software Development,Master,2,2800,52.4,600,80,400,4.10
|
| 698 |
+
Romania,Cluj-Napoca,Babes-Bolyai University,Data Science,Master,2,2200,43.8,400,120,350,4.65
|
| 699 |
+
Luxembourg,Esch-sur-Alzette,Luxembourg School of Business,Data Engineering,Master,2,400,79.5,1200,100,800,0.92
|
| 700 |
+
Indonesia,Bandung,Institut Teknologi Bandung,Computer Engineering,PhD,4,4500,42.4,300,150,250,15600
|
| 701 |
+
Iceland,Reykjavik,Reykjavik University,Robotics,Master,2,0,84.5,1150,140,900,137.50
|
| 702 |
+
Colombia,Cali,Universidad del Valle,Information Technology,Bachelor,4,3200,36.8,300,80,300,3950
|
| 703 |
+
Poland,Wroclaw,Wroclaw University of Technology,Artificial Intelligence,Master,2,2600,50.5,550,80,400,4.10
|
| 704 |
+
Romania,Timisoara,Politehnica University,Software Engineering,PhD,4,2400,42.5,380,120,350,4.65
|
| 705 |
+
Luxembourg,Belval,Luxembourg Institute of Science,Computer Science,Bachelor,3,400,78.4,1100,100,800,0.92
|
| 706 |
+
Indonesia,Yogyakarta,Gadjah Mada University,Data Science,Master,2,4000,40.2,250,150,250,15600
|
| 707 |
+
Iceland,Hafnarfjordur,Iceland University of Arts,Digital Design,Master,2,0,82.1,1000,140,900,137.50
|
| 708 |
+
Colombia,Barranquilla,Universidad del Norte,Computer Engineering,Master,2,3800,35.4,280,80,300,3950
|
| 709 |
+
Poland,Poznan,Adam Mickiewicz University,Computer Science,PhD,4,2700,51.2,580,80,400,4.10
|
| 710 |
+
Romania,Iasi,Alexandru Ioan Cuza University,Information Systems,Master,2,2100,41.8,350,120,350,4.65
|
| 711 |
+
Luxembourg,Kirchberg,Sacred Heart University,Data Analytics,Master,2,400,81.5,1300,100,800,0.92
|
| 712 |
+
Indonesia,Surabaya,Institut Teknologi Sepuluh,Software Engineering,Bachelor,4,3800,41.5,280,150,250,15600
|
| 713 |
+
Iceland,Kopavogur,Bifrost University,Digital Business,Bachelor,3,0,81.2,950,140,900,137.50
|
| 714 |
+
Colombia,Bucaramanga,UIS,Data Science,PhD,4,3500,34.8,260,80,300,3950
|
| 715 |
+
Poland,Gdansk,Gdansk University of Technology,Cybersecurity,Master,2,2500,49.8,520,80,400,4.10
|
| 716 |
+
Romania,Brasov,Transilvania University,Computer Engineering,Bachelor,4,2000,40.5,330,120,350,4.65
|
| 717 |
+
Luxembourg,Differdange,Miami University Dolibois,Information Technology,Master,2,400,77.8,1150,100,800,0.92
|
| 718 |
+
Indonesia,Malang,Brawijaya University,Artificial Intelligence,Master,2,3500,39.8,240,150,250,15600
|
| 719 |
+
Poland,Lodz,Lodz University of Technology,Software Engineering,Master,2,2400,48.5,500,80,400,4.10
|
| 720 |
+
Romania,Constanta,Ovidius University,Data Analytics,Master,2,1900,39.8,320,120,350,4.65
|
| 721 |
+
Luxembourg,Walferdange,European Business University,Digital Innovation,Bachelor,3,400,76.5,1100,100,800,0.92
|
| 722 |
+
Indonesia,Semarang,Diponegoro University,Computer Science,PhD,4,3200,38.5,220,150,250,15600
|
| 723 |
+
Iceland,Borgarnes,Agricultural University,Data Systems,Master,2,0,79.8,900,140,900,137.50
|
| 724 |
+
Colombia,Cartagena,Universidad de Cartagena,Information Systems,Master,2,3300,35.2,290,80,300,3950
|
| 725 |
+
Poland,Katowice,University of Silesia,Computer Engineering,Bachelor,3,2300,47.8,480,80,400,4.10
|
| 726 |
+
Romania,Craiova,University of Craiova,Software Development,PhD,4,2200,38.9,300,120,350,4.65
|
| 727 |
+
Luxembourg,Bertrange,Chamber of Commerce School,Business Analytics,Master,2,400,75.4,1050,100,800,0.92
|
| 728 |
+
Indonesia,Denpasar,Udayana University,Information Technology,Master,2,3000,37.9,200,150,250,15600
|
| 729 |
+
Tunisia,Tunis,University of Tunis,Computer Science,Master,2,1500,35.8,250,60,200,3.15
|
| 730 |
+
Cyprus,Nicosia,University of Cyprus,Data Science,Master,2,8000,65.4,600,100,500,0.92
|
| 731 |
+
Croatia,Zagreb,University of Zagreb,Software Engineering,PhD,4,4000,58.9,450,80,400,7.35
|
| 732 |
+
Dominican Republic,Santo Domingo,INTEC,Computer Engineering,Bachelor,4,6000,42.5,350,100,300,56.80
|
| 733 |
+
Morocco,Rabat,Mohammed V University,Information Systems,Master,2,2000,41.2,300,70,250,10.15
|
| 734 |
+
Peru,Lima,PUCP,Data Analytics,Master,2,8500,44.8,400,120,350,3.75
|
| 735 |
+
Argentina,Buenos Aires,University of Buenos Aires,Computer Science,PhD,4,0,42.5,350,90,280,275.00
|
| 736 |
+
Tunisia,Sfax,University of Sfax,Artificial Intelligence,Master,2,1400,33.2,200,60,200,3.15
|
| 737 |
+
Cyprus,Limassol,Cyprus University of Technology,Software Development,Bachelor,4,7500,62.8,550,100,500,0.92
|
| 738 |
+
Croatia,Split,University of Split,Data Engineering,Master,2,3800,56.4,400,80,400,7.35
|
| 739 |
+
Dominican Republic,Santiago,PUCMM,Information Technology,Master,2,5500,40.2,300,100,300,56.80
|
| 740 |
+
Morocco,Casablanca,Hassan II University,Computer Engineering,PhD,4,2200,43.5,350,70,250,10.15
|
| 741 |
+
Peru,Arequipa,Universidad San Agustin,Software Engineering,Bachelor,4,7000,41.2,300,120,350,3.75
|
| 742 |
+
Argentina,Cordoba,National University of Cordoba,Data Science,Master,2,0,39.8,280,90,280,275.00
|
| 743 |
+
Tunisia,Sousse,University of Sousse,Computer Systems,Bachelor,3,1300,32.5,180,60,200,3.15
|
| 744 |
+
Cyprus,Larnaca,American University Cyprus,Artificial Intelligence,PhD,4,8200,61.5,500,100,500,0.92
|
| 745 |
+
Croatia,Rijeka,University of Rijeka,Information Systems,Master,2,3500,54.8,380,80,400,7.35
|
| 746 |
+
Dominican Republic,La Romana,Universidad Central Este,Computer Science,Bachelor,4,5000,38.5,280,100,300,56.80
|
| 747 |
+
Morocco,Fez,University of Al Quaraouiyine,Data Analytics,Master,2,1800,39.8,250,70,250,10.15
|
| 748 |
+
Peru,Trujillo,Universidad Nacional de Trujillo,Software Development,PhD,4,7500,40.5,280,120,350,3.75
|
| 749 |
+
Argentina,Rosario,National University of Rosario,Computer Engineering,Master,2,0,38.5,260,90,280,275.00
|
| 750 |
+
Tunisia,Monastir,University of Monastir,Data Science,PhD,4,1600,31.8,170,60,200,3.15
|
| 751 |
+
Cyprus,Famagusta,Eastern Mediterranean University,Software Engineering,Master,2,7800,59.8,480,100,500,0.92
|
| 752 |
+
Croatia,Osijek,University of Osijek,Computer Science,Bachelor,3,3200,52.5,350,80,400,7.35
|
| 753 |
+
Dominican Republic,San Pedro,UCNE,Information Systems,Master,2,4800,37.2,260,100,300,56.80
|
| 754 |
+
Morocco,Marrakech,Cadi Ayyad University,Artificial Intelligence,PhD,4,2100,40.5,280,70,250,10.15
|
| 755 |
+
Peru,Cusco,Universidad San Antonio Abad,Data Analytics,Master,2,6800,39.8,260,120,350,3.75
|
| 756 |
+
Argentina,La Plata,National University of La Plata,Software Development,Bachelor,4,0,37.5,240,90,280,275.00
|
| 757 |
+
Tunisia,Gabes,University of Gabes,Computer Engineering,Master,2,1400,30.5,160,60,200,3.15
|
| 758 |
+
Croatia,Zadar,University of Zadar,Information Technology,PhD,4,3600,53.2,370,80,400,7.35
|
| 759 |
+
Cyprus,Paphos,Neapolis University,Data Science,Bachelor,3,7400,58.5,450,100,500,0.92
|
| 760 |
+
Dominican Republic,Puerto Plata,UTESA,Computer Science,PhD,4,4500,36.8,250,100,300,56.80
|
| 761 |
+
Morocco,Tangier,Abdelmalek Essaadi University,Software Engineering,Master,2,1900,38.9,260,70,250,10.15
|
| 762 |
+
Peru,Piura,Universidad de Piura,Information Systems,Master,2,7200,38.5,250,120,350,3.75
|
| 763 |
+
Argentina,Mendoza,National University of Cuyo,Data Analytics,PhD,4,0,36.8,230,90,280,275.00
|
| 764 |
+
Tunisia,Bizerte,University of Carthage,Artificial Intelligence,Bachelor,3,1200,29.8,150,60,200,3.15
|
| 765 |
+
Cyprus,Girne,Girne American University,Computer Engineering,Master,2,7600,57.8,430,100,500,0.92
|
| 766 |
+
Croatia,Dubrovnik,University of Dubrovnik,Software Development,Master,2,3400,54.5,390,80,400,7.35
|
| 767 |
+
Morocco,Oujda,Mohammed I University,Computer Science,Bachelor,4,1700,37.5,240,70,250,10.15
|
| 768 |
+
Peru,Chiclayo,Universidad San Martin,Data Engineering,PhD,4,6500,37.8,240,120,350,3.75
|
| 769 |
+
Ecuador,Quito,Universidad San Francisco,Computer Science,Master,2,8500,45.8,400,100,300,1.00
|
| 770 |
+
Lebanon,Beirut,American University of Beirut,Data Science,Master,2,20000,58.9,600,150,500,15000
|
| 771 |
+
Bahrain,Manama,University of Bahrain,Software Engineering,Bachelor,4,7000,65.4,700,130,600,0.38
|
| 772 |
+
Uruguay,Montevideo,Universidad de la Republica,Computer Engineering,PhD,4,0,52.4,450,90,350,39.50
|
| 773 |
+
Bulgaria,Sofia,Sofia University,Information Systems,Master,2,3500,48.5,400,110,300,1.85
|
| 774 |
+
Ghana,Accra,University of Ghana,Data Analytics,Master,2,4500,42.1,300,120,250,12.00
|
| 775 |
+
Algeria,Algiers,University of Science and Technology,Computer Science,Bachelor,3,1200,38.5,250,80,200,137.50
|
| 776 |
+
Panama,Panama City,Universidad Tecnologica,Artificial Intelligence,Master,2,7500,51.2,600,100,400,1.00
|
| 777 |
+
Ecuador,Guayaquil,ESPOL,Software Development,PhD,4,7800,43.2,350,100,300,1.00
|
| 778 |
+
Lebanon,Byblos,Lebanese American University,Data Engineering,Master,2,18000,55.4,500,150,500,15000
|
| 779 |
+
Bahrain,Riffa,Royal University for Women,Information Technology,Master,2,8000,63.2,650,130,600,0.38
|
| 780 |
+
Uruguay,Salto,Universidad ORT Uruguay,Computer Science,Master,2,6500,48.5,380,90,350,39.50
|
| 781 |
+
Bulgaria,Plovdiv,Plovdiv University,Data Science,Bachelor,3,3200,45.8,350,110,300,1.85
|
| 782 |
+
Ghana,Kumasi,Kwame Nkrumah University,Software Engineering,PhD,4,4200,39.8,250,120,250,12.00
|
| 783 |
+
Algeria,Oran,University of Oran,Computer Engineering,Master,2,1100,36.4,220,80,200,137.50
|
| 784 |
+
Panama,David,ISAE University,Data Analytics,Bachelor,4,6800,47.5,450,100,400,1.00
|
| 785 |
+
Ecuador,Cuenca,Universidad de Cuenca,Information Systems,Master,2,7200,42.5,320,100,300,1.00
|
| 786 |
+
Lebanon,Tripoli,Lebanese University,Computer Science,PhD,4,2000,52.1,400,150,500,15000
|
| 787 |
+
Bahrain,Isa Town,Bahrain Polytechnic,Software Development,Bachelor,4,6500,61.8,600,130,600,0.38
|
| 788 |
+
Uruguay,Maldonado,Universidad Catolica,Data Science,Master,2,7000,49.2,400,90,350,39.50
|
| 789 |
+
Bulgaria,Varna,Technical University Varna,Computer Engineering,Master,2,3100,44.2,330,110,300,1.85
|
| 790 |
+
Ghana,Cape Coast,University of Cape Coast,Information Technology,Master,2,4000,38.5,230,120,250,12.00
|
| 791 |
+
Algeria,Constantine,University of Constantine,Data Analytics,PhD,4,1300,35.8,200,80,200,137.50
|
| 792 |
+
Panama,Santiago,Universidad Latina,Computer Science,Master,2,6500,45.8,400,100,400,1.00
|
| 793 |
+
Ecuador,Loja,UTPL,Artificial Intelligence,Bachelor,3,6800,41.2,300,100,300,1.00
|
| 794 |
+
Lebanon,Jounieh,Holy Spirit University,Software Engineering,Master,2,16000,54.5,450,150,500,15000
|
| 795 |
+
Bahrain,Sakhir,Arabian Gulf University,Data Science,PhD,4,9000,62.4,620,130,600,0.38
|
| 796 |
+
Uruguay,Rivera,UTEC,Information Systems,Bachelor,4,0,47.8,350,90,350,39.50
|
| 797 |
+
Bulgaria,Burgas,Burgas Free University,Computer Science,Master,2,2900,43.5,320,110,300,1.85
|
| 798 |
+
Ghana,Tamale,University for Development,Software Development,PhD,4,3800,36.8,200,120,250,12.00
|
| 799 |
+
Algeria,Annaba,Badji Mokhtar University,Computer Engineering,Master,2,1000,34.5,180,80,200,137.50
|
| 800 |
+
Panama,Chitré,Quality Leadership University,Data Analytics,Bachelor,3,6200,44.2,380,100,400,1.00
|
| 801 |
+
Ecuador,Ambato,Universidad Tecnica,Information Technology,PhD,4,6500,40.5,280,100,300,1.00
|
| 802 |
+
Lebanon,Sidon,Lebanese International,Computer Science,Bachelor,4,15000,51.8,420,150,500,15000
|
| 803 |
+
Bahrain,Muharraq,Applied Science University,Data Engineering,Master,2,7500,61.5,580,130,600,0.38
|
| 804 |
+
Uruguay,Paysandu,Universidad de Paysandu,Software Engineering,Master,2,0,46.5,330,90,350,39.50
|
| 805 |
+
Bulgaria,Ruse,University of Ruse,Artificial Intelligence,PhD,4,3300,42.8,300,110,300,1.85
|
| 806 |
+
Ghana,Ho,University of Health Sciences,Data Science,Master,2,3500,35.4,180,120,250,12.00
|
| 807 |
+
Algeria,Tlemcen,University of Tlemcen,Information Systems,Bachelor,3,900,33.2,160,80,200,137.50
|
| 808 |
+
Panama,La Chorrera,Universidad Metropolitana,Computer Science,Master,2,6000,43.5,350,100,400,1.00
|
| 809 |
+
Bangladesh,Dhaka,Bangladesh University of Engineering,Computer Science,Master,2,2500,42.5,250,100,200,109.50
|
| 810 |
+
Kuwait,Kuwait City,Kuwait University,Data Science,Master,2,3500,71.2,800,140,700,0.31
|
| 811 |
+
Ukraine,Kyiv,Igor Sikorsky Kyiv Polytechnic,Software Engineering,Bachelor,4,3800,45.8,400,120,300,36.80
|
| 812 |
+
Slovenia,Ljubljana,University of Ljubljana,Computer Engineering,PhD,4,4500,62.4,500,80,450,0.92
|
| 813 |
+
Serbia,Belgrade,University of Belgrade,Information Systems,Master,2,2800,48.5,350,90,320,108.50
|
| 814 |
+
Iran,Tehran,Sharif University of Technology,Data Analytics,Master,2,3000,51.2,400,150,280,42150
|
| 815 |
+
Uzbekistan,Tashkent,INHA University Tashkent,Computer Science,Bachelor,4,4200,44.5,300,160,250,12300
|
| 816 |
+
El Salvador,San Salvador,Universidad Don Bosco,Software Development,Master,2,5500,46.8,400,110,300,1.00
|
| 817 |
+
Bangladesh,Chittagong,CUET,Artificial Intelligence,PhD,4,2200,39.8,200,100,200,109.50
|
| 818 |
+
Kuwait,Hawalli,American University Kuwait,Data Engineering,Master,2,15000,68.5,750,140,700,0.31
|
| 819 |
+
Ukraine,Lviv,Lviv Polytechnic,Computer Science,Master,2,3500,43.2,350,120,300,36.80
|
| 820 |
+
Slovenia,Maribor,University of Maribor,Data Science,Master,2,4200,58.5,450,80,450,0.92
|
| 821 |
+
Serbia,Novi Sad,University of Novi Sad,Software Engineering,PhD,4,2600,45.8,320,90,320,108.50
|
| 822 |
+
Iran,Isfahan,Isfahan University of Technology,Information Systems,Bachelor,3,2800,48.5,350,150,280,42150
|
| 823 |
+
Uzbekistan,Samarkand,Samarkand State University,Data Analytics,Master,2,3800,41.2,250,160,250,12300
|
| 824 |
+
El Salvador,Santa Ana,Universidad Catolica,Computer Engineering,Bachelor,4,5000,44.5,350,110,300,1.00
|
| 825 |
+
Bangladesh,Khulna,Khulna University,Software Development,Master,2,2100,38.5,180,100,200,109.50
|
| 826 |
+
Kuwait,Al Jahra,Gulf University for Science,Artificial Intelligence,PhD,4,14000,66.8,700,140,700,0.31
|
| 827 |
+
Ukraine,Kharkiv,Kharkiv Polytechnic,Data Science,Master,2,3400,42.5,330,120,300,36.80
|
| 828 |
+
Slovenia,Koper,University of Primorska,Information Technology,Bachelor,3,4000,57.2,420,80,450,0.92
|
| 829 |
+
Serbia,Nis,University of Nis,Computer Engineering,Master,2,2500,44.2,300,90,320,108.50
|
| 830 |
+
Iran,Mashhad,Ferdowsi University,Data Analytics,PhD,4,2900,47.8,320,150,280,42150
|
| 831 |
+
Uzbekistan,Bukhara,Bukhara State University,Computer Science,Bachelor,4,3500,39.8,220,160,250,12300
|
| 832 |
+
El Salvador,San Miguel,Universidad de Oriente,Information Systems,Master,2,4800,43.2,320,110,300,1.00
|
| 833 |
+
Bangladesh,Rajshahi,RUET,Software Engineering,Master,2,2000,37.2,170,100,200,109.50
|
| 834 |
+
Kuwait,Salmiya,Australian College Kuwait,Data Science,Bachelor,3,13500,65.4,680,140,700,0.31
|
| 835 |
+
Ukraine,Odesa,Odesa Polytechnic,Artificial Intelligence,PhD,4,3600,41.8,320,120,300,36.80
|
| 836 |
+
Slovenia,Nova Gorica,University of Nova Gorica,Computer Science,Master,2,4100,56.5,400,80,450,0.92
|
| 837 |
+
Serbia,Kragujevac,University of Kragujevac,Data Engineering,Bachelor,4,2400,43.5,280,90,320,108.50
|
| 838 |
+
Iran,Shiraz,Shiraz University,Software Development,Master,2,2700,46.8,300,150,280,42150
|
| 839 |
+
Uzbekistan,Namangan,Namangan Institute,Information Technology,Master,2,3400,38.5,200,160,250,12300
|
| 840 |
+
El Salvador,Sonsonate,Universidad de Sonsonate,Data Science,Bachelor,3,4500,42.8,300,110,300,1.00
|
| 841 |
+
Bangladesh,Sylhet,SUST,Computer Engineering,PhD,4,2300,36.8,160,100,200,109.50
|
| 842 |
+
Kuwait,Al Ahmadi,ACK,Software Engineering,Master,2,13000,64.5,650,140,700,0.31
|
| 843 |
+
Ukraine,Dnipro,Dnipro Polytechnic,Data Analytics,Master,2,3300,40.5,300,120,300,36.80
|
| 844 |
+
Slovenia,Celje,Faculty of Logistics,Information Systems,Bachelor,3,3900,55.4,380,80,450,0.92
|
| 845 |
+
Serbia,Subotica,University of Subotica,Computer Science,Master,2,2300,42.8,270,90,320,108.50
|
| 846 |
+
Iran,Tabriz,University of Tabriz,Artificial Intelligence,PhD,4,2600,45.5,280,150,280,42150
|
| 847 |
+
Uzbekistan,Andijan,Andijan State University,Software Development,Master,2,3200,37.8,180,160,250,12300
|
| 848 |
+
El Salvador,Santa Tecla,ITCA-FEPADE,Computer Engineering,Bachelor,4,4200,42.1,280,110,300,1.00
|
| 849 |
+
Malaysia,Kuala Lumpur,University of Malaya,Computer Science,Master,2,8500,55.4,500,120,400,4.65
|
| 850 |
+
Saudi Arabia,Riyadh,King Saud University,Data Science,PhD,4,5000,72.5,800,200,800,3.75
|
| 851 |
+
USA,Boston,Harvard University,Artificial Intelligence,Master,2,58000,82.1,2200,160,1500,1.00
|
| 852 |
+
UK,London,Imperial College,Computer Engineering,Master,2,42000,75.3,1800,485,800,0.79
|
| 853 |
+
Spain,Madrid,Universidad Politecnica,Software Engineering,PhD,4,3500,71.4,1100,80,750,0.92
|
| 854 |
+
Italy,Milan,Politecnico di Milano,Data Analytics,Master,2,4000,73.2,1200,120,700,0.92
|
| 855 |
+
France,Paris,Sorbonne University,Computer Science,Master,2,4500,84.3,1800,99,850,0.92
|
| 856 |
+
Malaysia,Penang,USM,Information Systems,Bachelor,3,7500,52.1,450,120,400,4.65
|
| 857 |
+
Saudi Arabia,Jeddah,King Abdulaziz University,Data Engineering,Master,2,4800,70.2,750,200,800,3.75
|
| 858 |
+
USA,Stanford,Stanford University,Computer Science,PhD,5,52000,84.3,2300,160,1500,1.00
|
| 859 |
+
UK,Cambridge,University of Cambridge,Artificial Intelligence,PhD,4,45000,71.5,1600,485,800,0.79
|
| 860 |
+
Spain,Barcelona,Universitat de Barcelona,Data Science,Master,2,3800,73.6,1000,80,750,0.92
|
| 861 |
+
Italy,Rome,Sapienza University,Software Engineering,Bachelor,3,3500,71.2,1100,120,700,0.92
|
| 862 |
+
France,Lyon,École Normale Supérieure,Computer Engineering,Master,2,4200,75.6,1200,99,850,0.92
|
| 863 |
+
Malaysia,Johor Bahru,UTM,Data Analytics,PhD,4,8000,51.8,400,120,400,4.65
|
| 864 |
+
Saudi Arabia,Dhahran,KFUPM,Computer Science,Master,2,4500,68.5,700,200,800,3.75
|
| 865 |
+
USA,Berkeley,UC Berkeley,Data Science,Master,2,54000,83.2,2000,160,1500,1.00
|
| 866 |
+
UK,Oxford,University of Oxford,Software Engineering,Master,2,40000,71.5,1400,485,800,0.79
|
| 867 |
+
Spain,Valencia,Universidad de Valencia,Information Systems,PhD,4,3200,68.5,800,80,750,0.92
|
| 868 |
+
Italy,Turin,Politecnico di Torino,Artificial Intelligence,Master,2,3800,69.8,900,120,700,0.92
|
| 869 |
+
France,Toulouse,INSA Toulouse,Data Engineering,PhD,4,4300,72.1,1000,99,850,0.92
|
| 870 |
+
Malaysia,Kuching,UNIMAS,Computer Science,Master,2,7000,49.5,380,120,400,4.65
|
| 871 |
+
Saudi Arabia,Medina,Islamic University,Software Development,Bachelor,4,4200,65.4,650,200,800,3.75
|
| 872 |
+
USA,MIT,Massachusetts,Robotics,PhD,5,56000,82.1,2100,160,1500,1.00
|
| 873 |
+
UK,Edinburgh,University of Edinburgh,Data Science,Master,2,38000,67.8,1100,485,800,0.79
|
| 874 |
+
Spain,Seville,Universidad de Sevilla,Computer Engineering,Master,2,3000,65.4,750,80,750,0.92
|
| 875 |
+
Italy,Bologna,University of Bologna,Information Systems,PhD,4,3600,70.5,950,120,700,0.92
|
| 876 |
+
France,Marseille,Aix-Marseille University,Artificial Intelligence,Master,2,4100,73.5,1100,99,850,0.92
|
| 877 |
+
Malaysia,Cyberjaya,Multimedia University,Data Analytics,Bachelor,3,7800,53.2,450,120,400,4.65
|
| 878 |
+
Saudi Arabia,Dammam,Imam Abdulrahman University,Computer Science,Master,2,4600,67.8,680,200,800,3.75
|
| 879 |
+
USA,New York,Columbia University,Data Science,Master,2,62000,100,2500,160,1500,1.00
|
| 880 |
+
UK,Manchester,University of Manchester,Software Engineering,PhD,4,35000,65.4,900,485,800,0.79
|
| 881 |
+
Spain,Granada,Universidad de Granada,Computer Science,Bachelor,3,2800,64.5,700,80,750,0.92
|
| 882 |
+
Italy,Florence,University of Florence,Data Engineering,Master,2,3500,71.2,1000,120,700,0.92
|
| 883 |
+
France,Bordeaux,University of Bordeaux,Information Systems,PhD,4,4300,72.1,1000,99,850,0.92
|
| 884 |
+
Malaysia,Bangi,UKM,Artificial Intelligence,Master,2,7200,51.5,420,120,400,4.65
|
| 885 |
+
Saudi Arabia,Taif,Taif University,Software Development,Master,2,4400,64.5,600,200,800,3.75
|
| 886 |
+
USA,Los Angeles,UCLA,Computer Engineering,PhD,5,52000,79.8,2200,160,1500,1.00
|
| 887 |
+
UK,Bristol,University of Bristol,Data Analytics,Master,2,36000,68.9,1200,485,800,0.79
|
| 888 |
+
Spain,Bilbao,University of the Basque Country,Information Technology,Master,2,3400,67.8,850,80,750,0.92
|
| 889 |
+
Italy,Naples,University of Naples,Computer Science,Bachelor,3,3200,67.8,800,120,700,0.92
|
| 890 |
+
France,Nice,University of Nice,Data Science,Master,2,4100,76.5,1300,99,850,0.92
|
| 891 |
+
Malaysia,Melaka,UTeM,Software Engineering,PhD,4,7500,50.2,400,120,400,4.65
|
| 892 |
+
Saudi Arabia,Tabuk,University of Tabuk,Computer Engineering,Bachelor,4,4100,63.2,580,200,800,3.75
|
| 893 |
+
USA,Chicago,University of Chicago,Artificial Intelligence,Master,2,58000,84.1,1900,160,1500,1.00
|
| 894 |
+
UK,Glasgow,University of Glasgow,Data Engineering,PhD,4,34000,64.5,950,485,800,0.79
|
| 895 |
+
Spain,Salamanca,University of Salamanca,Information Systems,Master,2,3100,62.1,600,80,750,0.92
|
| 896 |
+
Italy,Pisa,University of Pisa,Software Development,Master,2,3300,68.9,850,120,700,0.92
|
| 897 |
+
France,Lille,University of Lille,Computer Science,Bachelor,3,4200,69.8,950,99,850,0.92
|
| 898 |
+
Malaysia,Shah Alam,UiTM,Data Analytics,Master,2,7100,51.8,430,120,400,4.65
|
| 899 |
+
Saudi Arabia,Makkah,Umm Al-Qura University,Information Technology,PhD,4,4300,65.8,650,200,800,3.75
|
| 900 |
+
USA,San Francisco,Stanford University,Data Science,Master,2,55000,95.2,2400,160,1500,1.00
|
| 901 |
+
UK,Leeds,University of Leeds,Computer Engineering,Master,2,35000,63.2,900,485,800,0.79
|
| 902 |
+
Spain,Zaragoza,University of Zaragoza,Artificial Intelligence,PhD,4,2900,63.2,650,80,750,0.92
|
| 903 |
+
Italy,Padua,University of Padua,Software Engineering,Master,2,3400,69.5,900,120,700,0.92
|
| 904 |
+
France,Strasbourg,University of Strasbourg,Data Analytics,Master,2,4000,70.2,1000,99,850,0.92
|
| 905 |
+
Malaysia,Nilai,USIM,Computer Science,Bachelor,3,6800,50.5,400,120,400,4.65
|
| 906 |
+
Saudi Arabia,Al-Ahsa,King Faisal University,Information Systems,Master,2,4200,64.2,600,200,800,3.75
|
| 907 |
+
USA,Seattle,University of Washington,Software Development,PhD,5,50000,77.8,2000,160,1500,1.00
|
| 908 |
+
UK,Nottingham,University of Nottingham,Data Engineering,Master,2,34000,61.2,800,485,800,0.79
|
next/QS World University Rankings 2025.csv
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
next/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
|
| 2 |
+
|
| 3 |
+
## Getting Started
|
| 4 |
+
|
| 5 |
+
First, run the development server:
|
| 6 |
+
|
| 7 |
+
```bash
|
| 8 |
+
npm run dev
|
| 9 |
+
# or
|
| 10 |
+
yarn dev
|
| 11 |
+
# or
|
| 12 |
+
pnpm dev
|
| 13 |
+
# or
|
| 14 |
+
bun dev
|
| 15 |
+
```
|
| 16 |
+
|
| 17 |
+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
| 18 |
+
|
| 19 |
+
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
|
| 20 |
+
|
| 21 |
+
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
|
| 22 |
+
|
| 23 |
+
## Learn More
|
| 24 |
+
|
| 25 |
+
To learn more about Next.js, take a look at the following resources:
|
| 26 |
+
|
| 27 |
+
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
| 28 |
+
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
| 29 |
+
|
| 30 |
+
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
|
| 31 |
+
|
| 32 |
+
## Deploy on Vercel
|
| 33 |
+
|
| 34 |
+
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
| 35 |
+
|
| 36 |
+
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|
next/components.json
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"$schema": "https://ui.shadcn.com/schema.json",
|
| 3 |
+
"style": "new-york",
|
| 4 |
+
"rsc": true,
|
| 5 |
+
"tsx": true,
|
| 6 |
+
"tailwind": {
|
| 7 |
+
"config": "",
|
| 8 |
+
"css": "src/app/globals.css",
|
| 9 |
+
"baseColor": "slate",
|
| 10 |
+
"cssVariables": true,
|
| 11 |
+
"prefix": ""
|
| 12 |
+
},
|
| 13 |
+
"iconLibrary": "lucide",
|
| 14 |
+
"aliases": {
|
| 15 |
+
"components": "@/components",
|
| 16 |
+
"utils": "@/lib/utils",
|
| 17 |
+
"ui": "@/components/ui",
|
| 18 |
+
"lib": "@/lib",
|
| 19 |
+
"hooks": "@/hooks"
|
| 20 |
+
},
|
| 21 |
+
"registries": {}
|
| 22 |
+
}
|
next/eslint.config.mjs
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { defineConfig, globalIgnores } from "eslint/config";
|
| 2 |
+
import nextVitals from "eslint-config-next/core-web-vitals";
|
| 3 |
+
import nextTs from "eslint-config-next/typescript";
|
| 4 |
+
|
| 5 |
+
const eslintConfig = defineConfig([
|
| 6 |
+
...nextVitals,
|
| 7 |
+
...nextTs,
|
| 8 |
+
// Override default ignores of eslint-config-next.
|
| 9 |
+
globalIgnores([
|
| 10 |
+
// Default ignores of eslint-config-next:
|
| 11 |
+
".next/**",
|
| 12 |
+
"out/**",
|
| 13 |
+
"build/**",
|
| 14 |
+
"next-env.d.ts",
|
| 15 |
+
]),
|
| 16 |
+
]);
|
| 17 |
+
|
| 18 |
+
export default eslintConfig;
|
next/fetch_real_fees.py
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import time
|
| 2 |
+
import json
|
| 3 |
+
import re
|
| 4 |
+
from groq import Groq
|
| 5 |
+
from supabase import create_client, Client
|
| 6 |
+
from ddgs import DDGS
|
| 7 |
+
|
| 8 |
+
# --- CONFIGURATION ---
|
| 9 |
+
SUPABASE_URL = "https://uwxzvealdwdlbedhpway.supabase.co"
|
| 10 |
+
|
| 11 |
+
# 👇 PASTE YOUR SUPABASE KEY HERE
|
| 12 |
+
SUPABASE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InV3eHp2ZWFsZHdkbGJlZGhwd2F5Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc2NDI0ODM5MCwiZXhwIjoyMDc5ODI0MzkwfQ.TsE9cx1eMHTbQcHhynB4YUFP1UDj9htgrbuUQQk4sR4"
|
| 13 |
+
|
| 14 |
+
# 👇 PASTE YOUR GROQ API KEY HERE
|
| 15 |
+
GROQ_API_KEY = "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"
|
| 16 |
+
|
| 17 |
+
# Initialize Clients
|
| 18 |
+
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
|
| 19 |
+
groq_client = Groq(api_key=GROQ_API_KEY)
|
| 20 |
+
|
| 21 |
+
def search_university_fee(uni_name, country):
|
| 22 |
+
"""
|
| 23 |
+
Searches DuckDuckGo for the real fee structure.
|
| 24 |
+
"""
|
| 25 |
+
clean_name = re.sub(r'\(.*?\)', '', uni_name).strip()
|
| 26 |
+
query = f"{clean_name} {country} tuition fees 2025 undergraduate local student"
|
| 27 |
+
print(f" 🔎 Searching: '{query}'...")
|
| 28 |
+
|
| 29 |
+
try:
|
| 30 |
+
with DDGS() as ddgs:
|
| 31 |
+
# Pass query directly
|
| 32 |
+
results = list(ddgs.text(query, max_results=3))
|
| 33 |
+
|
| 34 |
+
if results:
|
| 35 |
+
combined_text = " ".join([r['body'] for r in results])
|
| 36 |
+
return combined_text
|
| 37 |
+
except Exception as e:
|
| 38 |
+
print(f" ⚠️ Search Warning: {e}")
|
| 39 |
+
time.sleep(5)
|
| 40 |
+
|
| 41 |
+
return None
|
| 42 |
+
|
| 43 |
+
def extract_fee_from_text(search_text, uni_name, country):
|
| 44 |
+
"""
|
| 45 |
+
Uses AI to analyze the search text and calculate the ANNUAL fee in USD.
|
| 46 |
+
"""
|
| 47 |
+
prompt = f"""
|
| 48 |
+
Analyze this search result for '{uni_name}' in '{country}'.
|
| 49 |
+
|
| 50 |
+
SEARCH SNIPPET:
|
| 51 |
+
"{search_text}"
|
| 52 |
+
|
| 53 |
+
TASK:
|
| 54 |
+
1. Find the Tuition Fee for a **LOCAL** undergraduate student.
|
| 55 |
+
2. **CRITICAL MATH:** - If the text says "Per Semester", **MULTIPLY BY 2** to get the Annual fee.
|
| 56 |
+
- If the text says "Per Annum" or "Yearly", use it as is.
|
| 57 |
+
- If the text says "Total Program Fee" (for 4 years), divide by 4.
|
| 58 |
+
3. Convert the final ANNUAL number to USD (integer only).
|
| 59 |
+
4. If it says "Free" (e.g. Germany), return 0.
|
| 60 |
+
5. If NO fee info is found, return null.
|
| 61 |
+
|
| 62 |
+
JSON FORMAT:
|
| 63 |
+
{{ "fee": 1500 }}
|
| 64 |
+
"""
|
| 65 |
+
|
| 66 |
+
try:
|
| 67 |
+
completion = groq_client.chat.completions.create(
|
| 68 |
+
model="llama-3.1-8b-instant",
|
| 69 |
+
messages=[
|
| 70 |
+
{"role": "system", "content": "You are a data extractor. Output only JSON."},
|
| 71 |
+
{"role": "user", "content": prompt}
|
| 72 |
+
],
|
| 73 |
+
temperature=0,
|
| 74 |
+
response_format={"type": "json_object"}
|
| 75 |
+
)
|
| 76 |
+
data = json.loads(completion.choices[0].message.content)
|
| 77 |
+
return data.get("fee")
|
| 78 |
+
except:
|
| 79 |
+
return None
|
| 80 |
+
|
| 81 |
+
def main():
|
| 82 |
+
print("🌍 Starting Global Fee Extraction (Safe Mode)...")
|
| 83 |
+
|
| 84 |
+
# 👇 CHANGE THIS NUMBER TO RESUME IF STOPPED (e.g., last_processed_id = 450)
|
| 85 |
+
last_processed_id = 1449
|
| 86 |
+
|
| 87 |
+
while True:
|
| 88 |
+
try:
|
| 89 |
+
# Fetch batch of 50 universities
|
| 90 |
+
response = supabase.table('universities') \
|
| 91 |
+
.select('id, university_name, country') \
|
| 92 |
+
.gt('id', last_processed_id) \
|
| 93 |
+
.order('id', desc=False) \
|
| 94 |
+
.limit(50) \
|
| 95 |
+
.execute()
|
| 96 |
+
|
| 97 |
+
universities = response.data
|
| 98 |
+
except Exception as e:
|
| 99 |
+
print(f"❌ Database Error: {e}")
|
| 100 |
+
time.sleep(10)
|
| 101 |
+
continue
|
| 102 |
+
|
| 103 |
+
if not universities:
|
| 104 |
+
print("✅✅✅ ALL DONE! Entire database processed.")
|
| 105 |
+
break
|
| 106 |
+
|
| 107 |
+
print(f"\n🔄 Loading batch of {len(universities)} universities (Starting ID: {universities[0]['id']})...")
|
| 108 |
+
|
| 109 |
+
for uni in universities:
|
| 110 |
+
name = uni['university_name']
|
| 111 |
+
country = uni['country']
|
| 112 |
+
uni_id = uni['id']
|
| 113 |
+
|
| 114 |
+
last_processed_id = uni_id
|
| 115 |
+
|
| 116 |
+
# SKIP HEADER ROWS
|
| 117 |
+
if "university" in name.lower() and "name" in name.lower():
|
| 118 |
+
print(f"Skipping Header Row (ID {uni_id})")
|
| 119 |
+
continue
|
| 120 |
+
if name.lower() == "institution":
|
| 121 |
+
print(f"Skipping Header Row (ID {uni_id})")
|
| 122 |
+
continue
|
| 123 |
+
|
| 124 |
+
print(f"Processing ID {uni_id}: {name} ({country})...")
|
| 125 |
+
|
| 126 |
+
search_text = search_university_fee(name, country)
|
| 127 |
+
|
| 128 |
+
if search_text:
|
| 129 |
+
real_fee = extract_fee_from_text(search_text, name, country)
|
| 130 |
+
|
| 131 |
+
if real_fee is not None:
|
| 132 |
+
# 👇 SMART CHECK: Only allow $0 for free-education countries
|
| 133 |
+
# If AI says $0 for Pakistan or USA, we ignore it.
|
| 134 |
+
allowed_free_countries = ["Germany", "Norway", "Finland", "Iceland", "Sweden", "Brazil"]
|
| 135 |
+
|
| 136 |
+
if real_fee == 0 and country not in allowed_free_countries:
|
| 137 |
+
print(f" ⚠️ Ignoring $0 fee for {country} (likely AI error). Skipping update.")
|
| 138 |
+
else:
|
| 139 |
+
print(f" 💰 Found Annual Fee: ${real_fee} USD")
|
| 140 |
+
try:
|
| 141 |
+
supabase.table('universities').update({"avg_tuition_usd": real_fee}).eq('id', uni_id).execute()
|
| 142 |
+
except:
|
| 143 |
+
print(" ❌ Save failed")
|
| 144 |
+
else:
|
| 145 |
+
print(" ⚠️ Text found, but AI couldn't find a clear fee.")
|
| 146 |
+
else:
|
| 147 |
+
print(" ⚠️ Search returned nothing.")
|
| 148 |
+
|
| 149 |
+
# Sleep 3 seconds to avoid blocking
|
| 150 |
+
time.sleep(3)
|
| 151 |
+
|
| 152 |
+
if __name__ == "__main__":
|
| 153 |
+
main()
|
next/fill_database.py
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import time
|
| 3 |
+
import json
|
| 4 |
+
from groq import Groq
|
| 5 |
+
from supabase import create_client, Client
|
| 6 |
+
|
| 7 |
+
# --- CONFIGURATION ---
|
| 8 |
+
SUPABASE_URL = "https://uwxzvealdwdlbedhpway.supabase.co"
|
| 9 |
+
|
| 10 |
+
SUPABASE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InV3eHp2ZWFsZHdkbGJlZGhwd2F5Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc2NDI0ODM5MCwiZXhwIjoyMDc5ODI0MzkwfQ.TsE9cx1eMHTbQcHhynB4YUFP1UDj9htgrbuUQQk4sR4"
|
| 11 |
+
|
| 12 |
+
GROQ_API_KEY = "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"
|
| 13 |
+
|
| 14 |
+
# Initialize Clients
|
| 15 |
+
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
|
| 16 |
+
groq_client = Groq(api_key=GROQ_API_KEY)
|
| 17 |
+
|
| 18 |
+
def generate_university_data(uni_name, country):
|
| 19 |
+
prompt = f"""
|
| 20 |
+
I have a university named '{uni_name}' located in '{country}'.
|
| 21 |
+
|
| 22 |
+
1. Write a professional 2-sentence description for it.
|
| 23 |
+
(Focus on its reputation, history, or academic strengths).
|
| 24 |
+
2. List 5 to 8 specific degree programs it likely offers.
|
| 25 |
+
|
| 26 |
+
Return ONLY raw JSON with no extra text or markdown formatting:
|
| 27 |
+
{{
|
| 28 |
+
"description": "The description string here.",
|
| 29 |
+
"programs": ["Program 1", "Program 2", "Program 3"]
|
| 30 |
+
}}
|
| 31 |
+
"""
|
| 32 |
+
|
| 33 |
+
try:
|
| 34 |
+
completion = groq_client.chat.completions.create(
|
| 35 |
+
model="llama-3.1-8b-instant",
|
| 36 |
+
messages=[
|
| 37 |
+
{"role": "system", "content": "You are a helpful database assistant that outputs only JSON."},
|
| 38 |
+
{"role": "user", "content": prompt}
|
| 39 |
+
],
|
| 40 |
+
temperature=0.5,
|
| 41 |
+
response_format={"type": "json_object"} # Ensures valid JSON
|
| 42 |
+
)
|
| 43 |
+
|
| 44 |
+
return json.loads(completion.choices[0].message.content)
|
| 45 |
+
|
| 46 |
+
except Exception as e:
|
| 47 |
+
print(f"⚠️ AI Generation Error for {uni_name}: {e}")
|
| 48 |
+
return None
|
| 49 |
+
|
| 50 |
+
def main():
|
| 51 |
+
print("🚀 Starting AI Database Filler (Groq Powered)...")
|
| 52 |
+
|
| 53 |
+
# Fetch universities with no description
|
| 54 |
+
try:
|
| 55 |
+
# Fetch 50 at a time
|
| 56 |
+
response = supabase.table('universities').select('id, university_name, country').is_('description', 'null').limit(50).execute()
|
| 57 |
+
universities = response.data
|
| 58 |
+
except Exception as e:
|
| 59 |
+
print(f"❌ Failed to fetch initial list: {e}")
|
| 60 |
+
return
|
| 61 |
+
|
| 62 |
+
if not universities:
|
| 63 |
+
print("✅ All universities are already filled!")
|
| 64 |
+
return
|
| 65 |
+
|
| 66 |
+
print(f"Found {len(universities)} universities to update in this batch...")
|
| 67 |
+
|
| 68 |
+
count = 0
|
| 69 |
+
for uni in universities:
|
| 70 |
+
uni_id = uni['id']
|
| 71 |
+
name = uni['university_name']
|
| 72 |
+
country = uni['country']
|
| 73 |
+
|
| 74 |
+
print(f"🤖 Processing: {name} ({country})...")
|
| 75 |
+
|
| 76 |
+
# 1. Generate Data with Groq
|
| 77 |
+
ai_data = generate_university_data(name, country)
|
| 78 |
+
|
| 79 |
+
if ai_data:
|
| 80 |
+
# 2. Update Supabase
|
| 81 |
+
attempts = 0
|
| 82 |
+
while attempts < 3:
|
| 83 |
+
try:
|
| 84 |
+
data_to_update = {
|
| 85 |
+
"description": ai_data['description'],
|
| 86 |
+
"offered_programs": ai_data['programs']
|
| 87 |
+
}
|
| 88 |
+
supabase.table('universities').update(data_to_update).eq('id', uni_id).execute()
|
| 89 |
+
print(f" ✅ Updated!")
|
| 90 |
+
count += 1
|
| 91 |
+
break
|
| 92 |
+
except Exception as e:
|
| 93 |
+
attempts += 1
|
| 94 |
+
print(f" ⚠️ Connection dropped. Retrying ({attempts}/3)...")
|
| 95 |
+
time.sleep(5)
|
| 96 |
+
|
| 97 |
+
# Groq is fast, but let's keep a tiny sleep to be safe
|
| 98 |
+
time.sleep(1)
|
| 99 |
+
|
| 100 |
+
print(f"\n🎉 Batch finished! Updated {count} universities.")
|
| 101 |
+
print("Run the script again to process the next batch.")
|
| 102 |
+
|
| 103 |
+
if __name__ == "__main__":
|
| 104 |
+
main()
|
next/fill_tuition.py
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import time
|
| 3 |
+
import json
|
| 4 |
+
from groq import Groq
|
| 5 |
+
from supabase import create_client, Client
|
| 6 |
+
|
| 7 |
+
# --- CONFIGURATION ---
|
| 8 |
+
SUPABASE_URL = "https://uwxzvealdwdlbedhpway.supabase.co"
|
| 9 |
+
|
| 10 |
+
SUPABASE_KEY = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InV3eHp2ZWFsZHdkbGJlZGhwd2F5Iiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc2NDI0ODM5MCwiZXhwIjoyMDc5ODI0MzkwfQ.TsE9cx1eMHTbQcHhynB4YUFP1UDj9htgrbuUQQk4sR4"
|
| 11 |
+
|
| 12 |
+
GROQ_API_KEY = "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"
|
| 13 |
+
|
| 14 |
+
# Initialize Clients
|
| 15 |
+
supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
|
| 16 |
+
groq_client = Groq(api_key=GROQ_API_KEY)
|
| 17 |
+
|
| 18 |
+
def get_monthly_living_cost(uni_name, country):
|
| 19 |
+
prompt = f"""
|
| 20 |
+
Estimate the average MONTHLY living cost (Rent + Food + Transport + Utilities)
|
| 21 |
+
for a single university student at '{uni_name}' in '{country}'.
|
| 22 |
+
|
| 23 |
+
RULES:
|
| 24 |
+
1. Output MUST be in USD.
|
| 25 |
+
2. IGNORE global averages. Use LOCAL purchasing power context.
|
| 26 |
+
3. REALISTIC EXAMPLES:
|
| 27 |
+
- Pakistan/India/Bangladesh: $200 - $450 USD.
|
| 28 |
+
- Thailand/Vietnam: $350 - $600 USD.
|
| 29 |
+
- Germany/France: $800 - $1400 USD.
|
| 30 |
+
- USA/UK/Australia: $1200 - $2500 USD.
|
| 31 |
+
4. Return ONLY a single integer.
|
| 32 |
+
|
| 33 |
+
Return ONLY raw JSON:
|
| 34 |
+
{{
|
| 35 |
+
"cost": 350
|
| 36 |
+
}}
|
| 37 |
+
"""
|
| 38 |
+
|
| 39 |
+
max_retries = 3
|
| 40 |
+
for attempt in range(max_retries):
|
| 41 |
+
try:
|
| 42 |
+
completion = groq_client.chat.completions.create(
|
| 43 |
+
model="llama-3.1-8b-instant",
|
| 44 |
+
messages=[
|
| 45 |
+
{"role": "system", "content": "You are an expert on local economic data. Output only JSON."},
|
| 46 |
+
{"role": "user", "content": prompt}
|
| 47 |
+
],
|
| 48 |
+
temperature=0.1,
|
| 49 |
+
response_format={"type": "json_object"},
|
| 50 |
+
timeout=10
|
| 51 |
+
)
|
| 52 |
+
|
| 53 |
+
data = json.loads(completion.choices[0].message.content)
|
| 54 |
+
return data.get("cost")
|
| 55 |
+
|
| 56 |
+
except Exception as e:
|
| 57 |
+
print(f" ⚠️ AI Glitch (Attempt {attempt+1}/{max_retries}): {e}")
|
| 58 |
+
time.sleep(2)
|
| 59 |
+
|
| 60 |
+
return None
|
| 61 |
+
|
| 62 |
+
def main():
|
| 63 |
+
print("💰 Starting Living Cost Filler (Infinite Loop)...")
|
| 64 |
+
|
| 65 |
+
while True:
|
| 66 |
+
# 1. Fetch batch of 50 universities where 'avg_living_usd' is NULL
|
| 67 |
+
try:
|
| 68 |
+
response = supabase.table('universities') \
|
| 69 |
+
.select('id, university_name, country') \
|
| 70 |
+
.is_('avg_living_usd', 'null') \
|
| 71 |
+
.limit(50) \
|
| 72 |
+
.execute()
|
| 73 |
+
universities = response.data
|
| 74 |
+
except Exception as e:
|
| 75 |
+
print(f"❌ Database Error: {e}")
|
| 76 |
+
time.sleep(10)
|
| 77 |
+
continue
|
| 78 |
+
|
| 79 |
+
# 2. Stop if everything is done
|
| 80 |
+
if not universities:
|
| 81 |
+
print("\n✅✅✅ ALL DONE! Every university has living costs updated!")
|
| 82 |
+
break
|
| 83 |
+
|
| 84 |
+
print(f"\n🔄 Loading batch of {len(universities)} universities...")
|
| 85 |
+
|
| 86 |
+
# 3. Process Batch
|
| 87 |
+
count = 0
|
| 88 |
+
for uni in universities:
|
| 89 |
+
uni_id = uni['id']
|
| 90 |
+
name = uni['university_name']
|
| 91 |
+
country = uni['country']
|
| 92 |
+
|
| 93 |
+
print(f"🤖 Processing: {name} ({country})...")
|
| 94 |
+
|
| 95 |
+
cost = get_monthly_living_cost(name, country)
|
| 96 |
+
|
| 97 |
+
if cost:
|
| 98 |
+
attempts = 0
|
| 99 |
+
while attempts < 3:
|
| 100 |
+
try:
|
| 101 |
+
# 👇 UPDATING 'avg_living_usd' COLUMN
|
| 102 |
+
supabase.table('universities').update({"avg_living_usd": cost}).eq('id', uni_id).execute()
|
| 103 |
+
print(f" ✅ Updated: ${cost}/month")
|
| 104 |
+
count += 1
|
| 105 |
+
break
|
| 106 |
+
except Exception as e:
|
| 107 |
+
attempts += 1
|
| 108 |
+
print(f" ⚠️ Save failed. Retrying ({attempts}/3)...")
|
| 109 |
+
time.sleep(5)
|
| 110 |
+
|
| 111 |
+
time.sleep(0.5)
|
| 112 |
+
|
| 113 |
+
print(f"✨ Batch complete! Updated {count} universities. Grabbing next batch...")
|
| 114 |
+
time.sleep(1)
|
| 115 |
+
|
| 116 |
+
if __name__ == "__main__":
|
| 117 |
+
main()
|
next/global.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
declare module 'csv-parser';
|
next/merge_data.py
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
import requests
|
| 3 |
+
from fuzzywuzzy import process, fuzz
|
| 4 |
+
import io
|
| 5 |
+
|
| 6 |
+
# ==========================================
|
| 7 |
+
# CONFIGURATION
|
| 8 |
+
# ==========================================
|
| 9 |
+
QS_FILE = "QS World University Rankings 2025.csv"
|
| 10 |
+
COST_FILE = "International_Education_Costs.csv"
|
| 11 |
+
OUTPUT_FILE = "Edupath_Final_Database.csv"
|
| 12 |
+
|
| 13 |
+
# Stronger headers to try and bypass the 403 error
|
| 14 |
+
HEADERS = {
|
| 15 |
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
|
| 16 |
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
|
| 17 |
+
"Accept-Language": "en-US,en;q=0.5"
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
print("🚀 Starting the Edupath AI Data Merge (Final Fix)...")
|
| 21 |
+
|
| 22 |
+
# ==========================================
|
| 23 |
+
# STEP 1: SCRAPE CANADIAN FEES (With Backup)
|
| 24 |
+
# ==========================================
|
| 25 |
+
print("\n[1/4] Attempting to scrape Universities Canada...")
|
| 26 |
+
df_can = pd.DataFrame(columns=['university_name', 'canada_grad_fee_cad'])
|
| 27 |
+
|
| 28 |
+
try:
|
| 29 |
+
url = "https://univcan.ca/about-universities-canada/facts-and-stats/tuition-fees-by-university/"
|
| 30 |
+
response = requests.get(url, headers=HEADERS, timeout=10)
|
| 31 |
+
|
| 32 |
+
if response.status_code == 200:
|
| 33 |
+
tables = pd.read_html(io.StringIO(response.text), header=0)
|
| 34 |
+
temp_df = tables[0]
|
| 35 |
+
|
| 36 |
+
# Clean columns
|
| 37 |
+
if 'Graduate Foreign' in temp_df.columns:
|
| 38 |
+
df_can = temp_df[['University', 'Graduate Foreign']].copy()
|
| 39 |
+
df_can.columns = ['university_name', 'canada_grad_fee_cad']
|
| 40 |
+
|
| 41 |
+
# Clean money values
|
| 42 |
+
def clean_cad(val):
|
| 43 |
+
if pd.isna(val) or '-' in str(val): return None
|
| 44 |
+
try: return float(str(val).replace('$', '').replace(',', '').strip())
|
| 45 |
+
except: return None
|
| 46 |
+
|
| 47 |
+
df_can['canada_grad_fee_cad'] = df_can['canada_grad_fee_cad'].apply(clean_cad)
|
| 48 |
+
print(f" ✅ Success! Scraped fees for {len(df_can)} Canadian universities.")
|
| 49 |
+
else:
|
| 50 |
+
print(" ⚠️ Scraper warning: Table structure changed. Skipping Canada specific fees.")
|
| 51 |
+
else:
|
| 52 |
+
print(f" ⚠️ Website blocked automation (Status {response.status_code}). Skipping Canada specific fees.")
|
| 53 |
+
|
| 54 |
+
except Exception as e:
|
| 55 |
+
print(f" ⚠️ Scraper failed ({e}). Proceeding without new Canadian data.")
|
| 56 |
+
|
| 57 |
+
# ==========================================
|
| 58 |
+
# STEP 2: PREPARE THE COST DATASET (Robust)
|
| 59 |
+
# ==========================================
|
| 60 |
+
print(f"\n[2/4] Processing '{COST_FILE}'...")
|
| 61 |
+
try:
|
| 62 |
+
df_cost = pd.read_csv(COST_FILE)
|
| 63 |
+
|
| 64 |
+
# 1. Clean Column Names (Strip spaces)
|
| 65 |
+
df_cost.columns = df_cost.columns.str.strip()
|
| 66 |
+
print(f" ℹ️ Columns found: {df_cost.columns.tolist()}")
|
| 67 |
+
|
| 68 |
+
# 2. INTELLIGENT COLUMN FINDER
|
| 69 |
+
# This finds the correct column names even if they are spelled slightly differently
|
| 70 |
+
def find_col(keywords, columns):
|
| 71 |
+
for col in columns:
|
| 72 |
+
if any(k.lower() in col.lower() for k in keywords):
|
| 73 |
+
return col
|
| 74 |
+
return None
|
| 75 |
+
|
| 76 |
+
col_tuition = find_col(['Tuition', 'Tuition_US', 'Tuition_USD'], df_cost.columns)
|
| 77 |
+
col_rent = find_col(['Rent', 'Rent_USD'], df_cost.columns)
|
| 78 |
+
col_living = find_col(['Living', 'Living_Cos', 'Living_Cost'], df_cost.columns)
|
| 79 |
+
|
| 80 |
+
if not col_tuition:
|
| 81 |
+
print(" ❌ Error: Could not find a 'Tuition' column. Check your CSV.")
|
| 82 |
+
exit()
|
| 83 |
+
|
| 84 |
+
print(f" ℹ️ Mapping: Tuition='{col_tuition}', Rent='{col_rent}', Living='{col_living}'")
|
| 85 |
+
|
| 86 |
+
# 3. Process Data
|
| 87 |
+
# Convert to numbers (force non-numbers to become NaN)
|
| 88 |
+
df_cost[col_tuition] = pd.to_numeric(df_cost[col_tuition], errors='coerce')
|
| 89 |
+
|
| 90 |
+
if col_rent: df_cost[col_rent] = pd.to_numeric(df_cost[col_rent], errors='coerce')
|
| 91 |
+
else: df_cost['Rent_Fake'] = 0 # Placeholder if missing
|
| 92 |
+
|
| 93 |
+
if col_living: df_cost[col_living] = pd.to_numeric(df_cost[col_living], errors='coerce')
|
| 94 |
+
else: df_cost['Living_Fake'] = 0
|
| 95 |
+
|
| 96 |
+
# Group duplicates
|
| 97 |
+
agg_dict = {
|
| 98 |
+
col_tuition: 'mean',
|
| 99 |
+
'City': 'first',
|
| 100 |
+
'Country': 'first'
|
| 101 |
+
}
|
| 102 |
+
if col_rent: agg_dict[col_rent] = 'mean'
|
| 103 |
+
if col_living: agg_dict[col_living] = 'mean'
|
| 104 |
+
|
| 105 |
+
df_cost_grouped = df_cost.groupby('University').agg(agg_dict).reset_index()
|
| 106 |
+
|
| 107 |
+
# Rename columns for the merge step
|
| 108 |
+
rename_map = {col_tuition: 'Tuition_US'}
|
| 109 |
+
if col_rent: rename_map[col_rent] = 'Rent_USD'
|
| 110 |
+
if col_living: rename_map[col_living] = 'Living_Cos'
|
| 111 |
+
|
| 112 |
+
df_cost_grouped.rename(columns=rename_map, inplace=True)
|
| 113 |
+
|
| 114 |
+
# Ensure all expected columns exist even if original file was missing them
|
| 115 |
+
if 'Rent_USD' not in df_cost_grouped.columns: df_cost_grouped['Rent_USD'] = None
|
| 116 |
+
if 'Living_Cos' not in df_cost_grouped.columns: df_cost_grouped['Living_Cos'] = None
|
| 117 |
+
|
| 118 |
+
print(f" ✅ Loaded cost data for {len(df_cost_grouped)} universities.")
|
| 119 |
+
|
| 120 |
+
except Exception as e:
|
| 121 |
+
print(f" ❌ Critical Error processing cost file: {e}")
|
| 122 |
+
exit()
|
| 123 |
+
|
| 124 |
+
# ==========================================
|
| 125 |
+
# STEP 3: MERGE WITH QS
|
| 126 |
+
# ==========================================
|
| 127 |
+
print("\n[3/4] Merging with QS Rankings...")
|
| 128 |
+
try:
|
| 129 |
+
df_qs = pd.read_csv(QS_FILE, encoding='latin1')
|
| 130 |
+
|
| 131 |
+
# Find name column
|
| 132 |
+
qs_name_col = [c for c in df_qs.columns if 'institution' in c.lower() or 'university' in c.lower()][0]
|
| 133 |
+
|
| 134 |
+
# Init columns
|
| 135 |
+
df_qs['avg_tuition_usd'] = None
|
| 136 |
+
df_qs['avg_rent_usd'] = None
|
| 137 |
+
df_qs['avg_living_usd'] = None
|
| 138 |
+
df_qs['canada_fee_cad'] = None
|
| 139 |
+
df_qs['source'] = 'QS Ranked'
|
| 140 |
+
|
| 141 |
+
cost_names = df_cost_grouped['University'].tolist()
|
| 142 |
+
can_names = df_can['university_name'].tolist() if not df_can.empty else []
|
| 143 |
+
|
| 144 |
+
matches = 0
|
| 145 |
+
|
| 146 |
+
for index, row in df_qs.iterrows():
|
| 147 |
+
qs_name = str(row[qs_name_col])
|
| 148 |
+
|
| 149 |
+
# Match Cost
|
| 150 |
+
match, score = process.extractOne(qs_name, cost_names, scorer=fuzz.token_sort_ratio)
|
| 151 |
+
if score > 85:
|
| 152 |
+
data = df_cost_grouped[df_cost_grouped['University'] == match].iloc[0]
|
| 153 |
+
df_qs.at[index, 'avg_tuition_usd'] = data['Tuition_US']
|
| 154 |
+
df_qs.at[index, 'avg_rent_usd'] = data['Rent_USD']
|
| 155 |
+
df_qs.at[index, 'avg_living_usd'] = data['Living_Cos']
|
| 156 |
+
matches += 1
|
| 157 |
+
|
| 158 |
+
# Match Canada (only if we have data)
|
| 159 |
+
if not df_can.empty and 'Canada' in str(row):
|
| 160 |
+
m_can, s_can = process.extractOne(qs_name, can_names, scorer=fuzz.token_set_ratio)
|
| 161 |
+
if s_can > 90:
|
| 162 |
+
fee = df_can[df_can['university_name'] == m_can]['canada_grad_fee_cad'].values[0]
|
| 163 |
+
df_qs.at[index, 'canada_fee_cad'] = fee
|
| 164 |
+
|
| 165 |
+
print(f" ✅ Attached data to {matches} QS universities.")
|
| 166 |
+
|
| 167 |
+
# Add Unranked
|
| 168 |
+
print(" Adding extra universities...")
|
| 169 |
+
qs_names_existing = df_qs[qs_name_col].astype(str).tolist()
|
| 170 |
+
new_rows = []
|
| 171 |
+
|
| 172 |
+
for index, row in df_cost_grouped.iterrows():
|
| 173 |
+
cost_name = row['University']
|
| 174 |
+
match, score = process.extractOne(cost_name, qs_names_existing, scorer=fuzz.token_sort_ratio)
|
| 175 |
+
|
| 176 |
+
if score < 85:
|
| 177 |
+
new_rows.append({
|
| 178 |
+
qs_name_col: cost_name,
|
| 179 |
+
'avg_tuition_usd': row['Tuition_US'],
|
| 180 |
+
'avg_rent_usd': row['Rent_USD'],
|
| 181 |
+
'avg_living_usd': row['Living_Cos'],
|
| 182 |
+
'source': 'Cost Database (Unranked)'
|
| 183 |
+
})
|
| 184 |
+
|
| 185 |
+
if new_rows:
|
| 186 |
+
df_final = pd.concat([df_qs, pd.DataFrame(new_rows)], ignore_index=True)
|
| 187 |
+
print(f" ✅ Added {len(new_rows)} new universities.")
|
| 188 |
+
else:
|
| 189 |
+
df_final = df_qs
|
| 190 |
+
|
| 191 |
+
# STEP 4: SAVE
|
| 192 |
+
df_final.to_csv(OUTPUT_FILE, index=False)
|
| 193 |
+
print("\n" + "="*50)
|
| 194 |
+
print(f"🎉 SUCCESS! Database saved as: {OUTPUT_FILE}")
|
| 195 |
+
print(f"Total Universities: {len(df_final)}")
|
| 196 |
+
print("="*50)
|
| 197 |
+
|
| 198 |
+
except Exception as e:
|
| 199 |
+
print(f"❌ Error during merge: {e}")
|
next/next.config.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import type { NextConfig } from "next";
|
| 2 |
+
|
| 3 |
+
const nextConfig: NextConfig = {
|
| 4 |
+
/* config options here */
|
| 5 |
+
reactCompiler: true,
|
| 6 |
+
};
|
| 7 |
+
|
| 8 |
+
export default nextConfig;
|
next/package-lock.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
next/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"name": "next",
|
| 3 |
+
"version": "0.1.0",
|
| 4 |
+
"private": true,
|
| 5 |
+
"scripts": {
|
| 6 |
+
"dev": "next dev",
|
| 7 |
+
"build": "next build",
|
| 8 |
+
"start": "next start",
|
| 9 |
+
"lint": "eslint"
|
| 10 |
+
},
|
| 11 |
+
"dependencies": {
|
| 12 |
+
"@hookform/resolvers": "^5.2.2",
|
| 13 |
+
"@prisma/client": "^5.22.0",
|
| 14 |
+
"@radix-ui/react-avatar": "^1.1.11",
|
| 15 |
+
"@radix-ui/react-dialog": "^1.1.15",
|
| 16 |
+
"@radix-ui/react-label": "^2.1.8",
|
| 17 |
+
"@radix-ui/react-separator": "^1.1.8",
|
| 18 |
+
"@radix-ui/react-slot": "^1.2.4",
|
| 19 |
+
"@radix-ui/react-tooltip": "^1.2.8",
|
| 20 |
+
"@supabase/ssr": "^0.8.0",
|
| 21 |
+
"@supabase/supabase-js": "^2.89.0",
|
| 22 |
+
"class-variance-authority": "^0.7.1",
|
| 23 |
+
"clsx": "^2.1.1",
|
| 24 |
+
"csv-parser": "^3.2.0",
|
| 25 |
+
"dotenv": "^17.2.3",
|
| 26 |
+
"groq-sdk": "^0.37.0",
|
| 27 |
+
"lucide-react": "^0.559.0",
|
| 28 |
+
"next": "^16.0.8",
|
| 29 |
+
"next-themes": "^0.4.6",
|
| 30 |
+
"react": "19.2.0",
|
| 31 |
+
"react-dom": "19.2.0",
|
| 32 |
+
"react-hook-form": "^7.68.0",
|
| 33 |
+
"sonner": "^2.0.7",
|
| 34 |
+
"tailwind-merge": "^3.4.0",
|
| 35 |
+
"zod": "^4.1.13"
|
| 36 |
+
},
|
| 37 |
+
"devDependencies": {
|
| 38 |
+
"@tailwindcss/postcss": "^4",
|
| 39 |
+
"@types/node": "^20",
|
| 40 |
+
"@types/react": "^19",
|
| 41 |
+
"@types/react-dom": "^19",
|
| 42 |
+
"babel-plugin-react-compiler": "1.0.0",
|
| 43 |
+
"baseline-browser-mapping": "^2.9.19",
|
| 44 |
+
"dotenv-cli": "^11.0.0",
|
| 45 |
+
"eslint": "^9",
|
| 46 |
+
"eslint-config-next": "16.0.5",
|
| 47 |
+
"prisma": "^5.22.0",
|
| 48 |
+
"tailwindcss": "^4",
|
| 49 |
+
"tw-animate-css": "^1.4.0",
|
| 50 |
+
"typescript": "^5"
|
| 51 |
+
}
|
| 52 |
+
}
|
next/postcss.config.mjs
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const config = {
|
| 2 |
+
plugins: {
|
| 3 |
+
"@tailwindcss/postcss": {},
|
| 4 |
+
},
|
| 5 |
+
};
|
| 6 |
+
|
| 7 |
+
export default config;
|
next/prisma/schema.prisma
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
generator client {
|
| 2 |
+
provider = "prisma-client-js"
|
| 3 |
+
}
|
| 4 |
+
datasource db {
|
| 5 |
+
provider = "postgresql"
|
| 6 |
+
url = env("DATABASE_URL")
|
| 7 |
+
directUrl = env("DIRECT_URL")
|
| 8 |
+
}
|
| 9 |
+
|
| 10 |
+
enum Role {
|
| 11 |
+
STUDENT
|
| 12 |
+
ADMIN
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
enum RoadmapStatus {
|
| 16 |
+
ACTIVE
|
| 17 |
+
COMPLETED
|
| 18 |
+
ARCHIVED
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
model User {
|
| 22 |
+
id String @id @default(uuid())
|
| 23 |
+
email String @unique
|
| 24 |
+
password String @unique
|
| 25 |
+
name String?
|
| 26 |
+
role Role @default(STUDENT)
|
| 27 |
+
createdAt DateTime @default(now())
|
| 28 |
+
updatedAt DateTime @updatedAt
|
| 29 |
+
|
| 30 |
+
quizResults QuizResult[]
|
| 31 |
+
roadmaps Roadmap[]
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
model QuizResult {
|
| 35 |
+
id String @id @default(uuid())
|
| 36 |
+
userId String
|
| 37 |
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
| 38 |
+
|
| 39 |
+
confidenceScore Float
|
| 40 |
+
|
| 41 |
+
profileVector Json
|
| 42 |
+
|
| 43 |
+
createdAt DateTime @default(now())
|
| 44 |
+
|
| 45 |
+
// This relates to your other table "QuizAnswer"
|
| 46 |
+
answers QuizAnswer[]
|
| 47 |
+
}
|
| 48 |
+
|
| 49 |
+
model Question {
|
| 50 |
+
id String @id @default(uuid())
|
| 51 |
+
text String // The question text itself
|
| 52 |
+
|
| 53 |
+
// Stores options if it's multiple choice (e.g., ["A", "B", "C", "D"])
|
| 54 |
+
options Json?
|
| 55 |
+
|
| 56 |
+
// THE KEY: Stores the correct answer (e.g., "A" or "True")
|
| 57 |
+
// If it's a personality question with no "right" answer, leave this empty (null).
|
| 58 |
+
correctAnswer String?
|
| 59 |
+
|
| 60 |
+
category String // e.g., "Logical Reasoning" or "Creative Thinking"
|
| 61 |
+
|
| 62 |
+
// Relation: One question has many answers (from different students)
|
| 63 |
+
userAnswers QuizAnswer[]
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
model QuizAnswer {
|
| 67 |
+
id String @id @default(uuid())
|
| 68 |
+
quizResultId String
|
| 69 |
+
quizResult QuizResult @relation(fields: [quizResultId], references: [id], onDelete: Cascade)
|
| 70 |
+
questionId String
|
| 71 |
+
question Question @relation(fields: [questionId], references: [id])
|
| 72 |
+
isCorrect Boolean?
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
model CareerCluster {
|
| 76 |
+
id String @id @default(uuid())
|
| 77 |
+
name String @unique
|
| 78 |
+
description String
|
| 79 |
+
avgSalary String?
|
| 80 |
+
|
| 81 |
+
universities University[]
|
| 82 |
+
marketTrends MarketTrend[]
|
| 83 |
+
roadmaps Roadmap[]
|
| 84 |
+
}
|
| 85 |
+
|
| 86 |
+
model University {
|
| 87 |
+
id String @id @default(uuid())
|
| 88 |
+
name String
|
| 89 |
+
location String
|
| 90 |
+
website String?
|
| 91 |
+
|
| 92 |
+
admissionCriteria String @db.Text
|
| 93 |
+
feeStructure Int?
|
| 94 |
+
|
| 95 |
+
offeredCareers CareerCluster[]
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
model MarketTrend {
|
| 99 |
+
id String @id @default(uuid())
|
| 100 |
+
careerClusterId String
|
| 101 |
+
careerCluster CareerCluster @relation(fields: [careerClusterId], references: [id])
|
| 102 |
+
|
| 103 |
+
localDemand String
|
| 104 |
+
globalDemand String
|
| 105 |
+
growthPercentage Float?
|
| 106 |
+
lastUpdated DateTime @default(now())
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
model Roadmap {
|
| 110 |
+
id String @id @default(uuid())
|
| 111 |
+
userId String
|
| 112 |
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
| 113 |
+
careerClusterId String
|
| 114 |
+
careerCluster CareerCluster @relation(fields: [careerClusterId], references: [id])
|
| 115 |
+
content Json
|
| 116 |
+
progress Int @default(0)
|
| 117 |
+
status RoadmapStatus @default(ACTIVE)
|
| 118 |
+
createdAt DateTime @default(now())
|
| 119 |
+
updatedAt DateTime @updatedAt
|
| 120 |
+
}
|
next/public/file.svg
ADDED
|
|
next/public/globe.svg
ADDED
|
|
next/public/next.svg
ADDED
|
|
next/public/vercel.svg
ADDED
|
|
next/public/window.svg
ADDED
|
|
next/scripts/import_universities.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import * as dotenv from 'dotenv';
|
| 2 |
+
import * as path from 'path';
|
| 3 |
+
import * as fs from 'fs';
|
| 4 |
+
import csv from 'csv-parser';
|
| 5 |
+
import { PrismaClient } from '@prisma/client';
|
| 6 |
+
|
| 7 |
+
// 1. Force load the .env file
|
| 8 |
+
dotenv.config({ path: path.resolve(process.cwd(), '.env') });
|
| 9 |
+
|
| 10 |
+
const prisma = new PrismaClient();
|
| 11 |
+
|
| 12 |
+
async function main() {
|
| 13 |
+
const results: any[] = [];
|
| 14 |
+
|
| 15 |
+
console.log("🚀 Step 1: Importing Global Universities...");
|
| 16 |
+
|
| 17 |
+
// 2. Read the CSV file
|
| 18 |
+
await new Promise((resolve, reject) => {
|
| 19 |
+
fs.createReadStream(path.resolve(process.cwd(), 'university_data.csv'))
|
| 20 |
+
.pipe(csv())
|
| 21 |
+
.on('data', (data: any) => results.push(data))
|
| 22 |
+
.on('end', resolve)
|
| 23 |
+
.on('error', reject);
|
| 24 |
+
});
|
| 25 |
+
|
| 26 |
+
console.log(`📦 Found ${results.length} rows. Processing...`);
|
| 27 |
+
|
| 28 |
+
let successCount = 0;
|
| 29 |
+
|
| 30 |
+
// 3. Loop through rows and insert them safely
|
| 31 |
+
for (const row of results) {
|
| 32 |
+
// Try to find the name using common header names
|
| 33 |
+
const name = row.Name || row.University || row.institution || row.name;
|
| 34 |
+
|
| 35 |
+
// Try to find the location using common header names
|
| 36 |
+
// If missing, fallback to "Unknown Location" so it doesn't crash
|
| 37 |
+
const location = row.Location || row.Country || row.Region || row.location || "Unknown Location";
|
| 38 |
+
|
| 39 |
+
// Skip rows that have no name (usually empty lines at the end of file)
|
| 40 |
+
if (!name) {
|
| 41 |
+
continue;
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
try {
|
| 45 |
+
// Create the university
|
| 46 |
+
await prisma.university.create({
|
| 47 |
+
data: {
|
| 48 |
+
name: name.trim(),
|
| 49 |
+
location: location.trim(),
|
| 50 |
+
// Add default values for other fields if they exist in your schema
|
| 51 |
+
admissionCriteria: "General admission requirements apply.",
|
| 52 |
+
},
|
| 53 |
+
});
|
| 54 |
+
successCount++;
|
| 55 |
+
} catch (error) {
|
| 56 |
+
// If a duplicate or error occurs, just log it and keep going
|
| 57 |
+
console.log(`⚠️ Skipped "${name}": Already exists or invalid.`);
|
| 58 |
+
}
|
| 59 |
+
}
|
| 60 |
+
|
| 61 |
+
console.log(`✅ Done! Successfully imported ${successCount} universities.`);
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
main()
|
| 65 |
+
.catch((e) => {
|
| 66 |
+
console.error(e);
|
| 67 |
+
process.exit(1);
|
| 68 |
+
})
|
| 69 |
+
.finally(async () => {
|
| 70 |
+
await prisma.$disconnect();
|
| 71 |
+
});
|
next/scripts/upsert_us_fees.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import * as dotenv from 'dotenv';
|
| 2 |
+
import * as path from 'path';
|
| 3 |
+
import * as fs from 'fs';
|
| 4 |
+
import csv from 'csv-parser';
|
| 5 |
+
import { PrismaClient } from '@prisma/client';
|
| 6 |
+
|
| 7 |
+
dotenv.config({ path: path.resolve(process.cwd(), '.env') });
|
| 8 |
+
|
| 9 |
+
const prisma = new PrismaClient();
|
| 10 |
+
|
| 11 |
+
async function main() {
|
| 12 |
+
const rows: any[] = [];
|
| 13 |
+
|
| 14 |
+
console.log("📖 Reading US Fees CSV...");
|
| 15 |
+
|
| 16 |
+
await new Promise((resolve, reject) => {
|
| 17 |
+
fs.createReadStream(path.resolve(process.cwd(), 'us_fees.csv'))
|
| 18 |
+
.pipe(csv())
|
| 19 |
+
.on('data', (data: any) => rows.push(data))
|
| 20 |
+
.on('end', resolve)
|
| 21 |
+
.on('error', reject);
|
| 22 |
+
});
|
| 23 |
+
|
| 24 |
+
console.log(`🔍 Found ${rows.length} rows. Starting Smart Import (Update or Create)...`);
|
| 25 |
+
|
| 26 |
+
let updatedCount = 0;
|
| 27 |
+
let createdCount = 0;
|
| 28 |
+
|
| 29 |
+
for (const row of rows) {
|
| 30 |
+
const csvName = row.name;
|
| 31 |
+
const feeString = row.fee_usd;
|
| 32 |
+
|
| 33 |
+
if (!csvName || !feeString) continue;
|
| 34 |
+
|
| 35 |
+
// Clean the fee (remove '$' and ',')
|
| 36 |
+
const cleanFee = parseFloat(feeString.toString().replace(/[^0-9.]/g, ''));
|
| 37 |
+
if (isNaN(cleanFee)) continue;
|
| 38 |
+
|
| 39 |
+
const finalFee = Math.floor(cleanFee);
|
| 40 |
+
|
| 41 |
+
// 1. Try to find it
|
| 42 |
+
const existingUni = await prisma.university.findFirst({
|
| 43 |
+
where: {
|
| 44 |
+
name: { contains: csvName.trim(), mode: 'insensitive' },
|
| 45 |
+
},
|
| 46 |
+
});
|
| 47 |
+
|
| 48 |
+
if (existingUni) {
|
| 49 |
+
// OPTION A: UPDATE existing
|
| 50 |
+
await prisma.university.update({
|
| 51 |
+
where: { id: existingUni.id },
|
| 52 |
+
data: { feeStructure: finalFee },
|
| 53 |
+
});
|
| 54 |
+
updatedCount++;
|
| 55 |
+
} else {
|
| 56 |
+
// OPTION B: CREATE new
|
| 57 |
+
// We assume it's United States because of the filename
|
| 58 |
+
await prisma.university.create({
|
| 59 |
+
data: {
|
| 60 |
+
name: csvName.trim(),
|
| 61 |
+
location: "United States",
|
| 62 |
+
feeStructure: finalFee,
|
| 63 |
+
admissionCriteria: "Contact institution for details."
|
| 64 |
+
}
|
| 65 |
+
});
|
| 66 |
+
createdCount++;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
const total = updatedCount + createdCount;
|
| 70 |
+
if (total % 10 === 0) console.log(` Processed ${total} universities...`);
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
console.log(`✅ DONE!`);
|
| 74 |
+
console.log(` - Updated: ${updatedCount}`);
|
| 75 |
+
console.log(` - Created: ${createdCount}`);
|
| 76 |
+
console.log(` - Total Fees Added: ${updatedCount + createdCount}`);
|
| 77 |
+
}
|
| 78 |
+
|
| 79 |
+
main()
|
| 80 |
+
.catch((e) => {
|
| 81 |
+
console.error(e);
|
| 82 |
+
process.exit(1);
|
| 83 |
+
})
|
| 84 |
+
.finally(async () => {
|
| 85 |
+
await prisma.$disconnect();
|
| 86 |
+
});
|
next/src/app/about-us/page.tsx
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { Navbar } from "@/components/navbar"
|
| 2 |
+
import { Footer } from "@/components/footer"
|
| 3 |
+
import { Card, CardContent } from "@/components/ui/card"
|
| 4 |
+
import { Target, Eye, Award, Users2 } from "lucide-react"
|
| 5 |
+
|
| 6 |
+
export default function AboutPage() {
|
| 7 |
+
return (
|
| 8 |
+
<div className="min-h-screen flex flex-col">
|
| 9 |
+
<Navbar />
|
| 10 |
+
|
| 11 |
+
<main className="flex-1">
|
| 12 |
+
{/* Hero Section */}
|
| 13 |
+
<section className="py-20 md:py-32 bg-linear-to-b from-secondary/50 to-background">
|
| 14 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 15 |
+
<div className="max-w-3xl mx-auto text-center space-y-6">
|
| 16 |
+
<h1 className="text-4xl md:text-5xl font-bold text-balance">
|
| 17 |
+
{"About "}
|
| 18 |
+
<span className="text-primary">Edu Path AI</span>
|
| 19 |
+
</h1>
|
| 20 |
+
<p className="text-lg md:text-xl text-muted-foreground leading-relaxed">
|
| 21 |
+
We're on a mission to revolutionize career guidance through intelligent interest assessment and
|
| 22 |
+
personalized university recommendations.
|
| 23 |
+
</p>
|
| 24 |
+
</div>
|
| 25 |
+
</div>
|
| 26 |
+
</section>
|
| 27 |
+
|
| 28 |
+
{/* Story Section */}
|
| 29 |
+
<section className="py-20">
|
| 30 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 31 |
+
<div className="max-w-4xl mx-auto space-y-8">
|
| 32 |
+
<div className="space-y-4">
|
| 33 |
+
<h2 className="text-3xl font-bold">Our Story</h2>
|
| 34 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 35 |
+
Edu Path AI was born from a critical observation: too many students struggle to select their professional
|
| 36 |
+
careers due to a lack of proper research or guidance. We saw talented individuals drifting into fields solely
|
| 37 |
+
because of parental pressure or limited information, leading to dissatisfaction and wasted potential.
|
| 38 |
+
</p>
|
| 39 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 40 |
+
In 2025, our team of Software Engineering students at Lahore Garrison University set out to change this.
|
| 41 |
+
We realized that existing platforms were fragmented—some offered university lists, others offered
|
| 42 |
+
career tests, but none combined them effectively. We wanted to build a centralized platform that
|
| 43 |
+
not only identifies a student's true interests but also maps out the exact path to achieve them.
|
| 44 |
+
</p>
|
| 45 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 46 |
+
Today, Edu Path AI serves as a comprehensive recommendation engine. By leveraging Artificial Intelligence
|
| 47 |
+
and Psychometric Testing, we help students discover their passion, find the right university, and generate
|
| 48 |
+
a 4-year roadmap for success, contributing directly to Quality Education (SDG 4).
|
| 49 |
+
</p>
|
| 50 |
+
</div>
|
| 51 |
+
</div>
|
| 52 |
+
</div>
|
| 53 |
+
</section>
|
| 54 |
+
|
| 55 |
+
{/* Mission & Vision */}
|
| 56 |
+
<section className="py-20 bg-card">
|
| 57 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 58 |
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 max-w-5xl mx-auto">
|
| 59 |
+
<Card className="border-2">
|
| 60 |
+
<CardContent className="pt-6 space-y-4">
|
| 61 |
+
<div className="h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center">
|
| 62 |
+
<Target className="h-6 w-6 text-primary" />
|
| 63 |
+
</div>
|
| 64 |
+
<h3 className="text-2xl font-bold">Our Mission</h3>
|
| 65 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 66 |
+
To eliminate the risk of students choosing fields under pressure by providing scientific,
|
| 67 |
+
AI-driven guidance. We aim to empower every student to make data-driven decisions about their
|
| 68 |
+
future, ensuring they pursue careers where they can truly make a difference.
|
| 69 |
+
</p>
|
| 70 |
+
</CardContent>
|
| 71 |
+
</Card>
|
| 72 |
+
|
| 73 |
+
<Card className="border-2">
|
| 74 |
+
<CardContent className="pt-6 space-y-4">
|
| 75 |
+
<div className="h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center">
|
| 76 |
+
<Eye className="h-6 w-6 text-primary" />
|
| 77 |
+
</div>
|
| 78 |
+
<h3 className="text-2xl font-bold">Our Vision</h3>
|
| 79 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 80 |
+
A world where every student has access to personalized career counseling. We envision a future
|
| 81 |
+
where choosing a university is no longer a gamble, but a calculated step towards economic
|
| 82 |
+
development and industry innovation (SDG 9).
|
| 83 |
+
</p>
|
| 84 |
+
</CardContent>
|
| 85 |
+
</Card>
|
| 86 |
+
</div>
|
| 87 |
+
</div>
|
| 88 |
+
</section>
|
| 89 |
+
|
| 90 |
+
{/* Values Section */}
|
| 91 |
+
<section className="py-20">
|
| 92 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 93 |
+
<div className="max-w-4xl mx-auto space-y-12">
|
| 94 |
+
<div className="text-center space-y-4">
|
| 95 |
+
<h2 className="text-3xl font-bold">Our Values</h2>
|
| 96 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 97 |
+
The principles that guide everything we do at Edu Path AI.
|
| 98 |
+
</p>
|
| 99 |
+
</div>
|
| 100 |
+
|
| 101 |
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
|
| 102 |
+
<div className="space-y-3 text-center">
|
| 103 |
+
<div className="h-16 w-16 rounded-lg bg-primary/10 flex items-center justify-center mx-auto">
|
| 104 |
+
<Award className="h-8 w-8 text-primary" />
|
| 105 |
+
</div>
|
| 106 |
+
<h3 className="text-xl font-semibold">Accuracy</h3>
|
| 107 |
+
<p className="text-sm text-muted-foreground leading-relaxed">
|
| 108 |
+
We prioritize high-quality datasets and reliable AI models to ensure our recommendations
|
| 109 |
+
genuinely reflect a student's potential.
|
| 110 |
+
</p>
|
| 111 |
+
</div>
|
| 112 |
+
|
| 113 |
+
<div className="space-y-3 text-center">
|
| 114 |
+
<div className="h-16 w-16 rounded-lg bg-primary/10 flex items-center justify-center mx-auto">
|
| 115 |
+
<Users2 className="h-8 w-8 text-primary" />
|
| 116 |
+
</div>
|
| 117 |
+
<h3 className="text-xl font-semibold">Student-Centric</h3>
|
| 118 |
+
<p className="text-sm text-muted-foreground leading-relaxed">
|
| 119 |
+
Our primary focus is the student. We design intuitive interfaces and clear guidance
|
| 120 |
+
to help those with limited technical expertise navigate their future.
|
| 121 |
+
</p>
|
| 122 |
+
</div>
|
| 123 |
+
|
| 124 |
+
<div className="space-y-3 text-center">
|
| 125 |
+
<div className="h-16 w-16 rounded-lg bg-primary/10 flex items-center justify-center mx-auto">
|
| 126 |
+
<Target className="h-8 w-8 text-primary" />
|
| 127 |
+
</div>
|
| 128 |
+
<h3 className="text-xl font-semibold">Transparency</h3>
|
| 129 |
+
<p className="text-sm text-muted-foreground leading-relaxed">
|
| 130 |
+
We believe in providing all information—from fee structures to market trends—on a
|
| 131 |
+
single platform, removing the confusion of scattered data.
|
| 132 |
+
</p>
|
| 133 |
+
</div>
|
| 134 |
+
</div>
|
| 135 |
+
</div>
|
| 136 |
+
</div>
|
| 137 |
+
</section>
|
| 138 |
+
|
| 139 |
+
{/* Platform Overview */}
|
| 140 |
+
<section className="py-20 bg-linear-to-b from-background to-secondary/50">
|
| 141 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 142 |
+
<div className="max-w-4xl mx-auto space-y-8">
|
| 143 |
+
<div className="text-center space-y-4">
|
| 144 |
+
<h2 className="text-3xl font-bold">The Platform</h2>
|
| 145 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 146 |
+
A comprehensive solution designed for students and educators.
|
| 147 |
+
</p>
|
| 148 |
+
</div>
|
| 149 |
+
|
| 150 |
+
<div className="space-y-6">
|
| 151 |
+
<div className="space-y-2">
|
| 152 |
+
<h3 className="text-xl font-semibold">AI Interest Discovery</h3>
|
| 153 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 154 |
+
Our core feature uses advanced psychometric testing and Machine Learning to create a unique
|
| 155 |
+
profile vector for every student. By assessing over 30 data points, we identify hidden
|
| 156 |
+
talents and match them with the most compatible career clusters and degree programs.
|
| 157 |
+
</p>
|
| 158 |
+
</div>
|
| 159 |
+
|
| 160 |
+
<div className="space-y-2">
|
| 161 |
+
<h3 className="text-xl font-semibold">Integrated University Data</h3>
|
| 162 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 163 |
+
Say goodbye to browsing hundreds of university websites. Our database integrates admission criteria,
|
| 164 |
+
fee structures, and course outlines in one place. Students can compare universities side-by-side
|
| 165 |
+
and filter by location or cost to find their perfect match.
|
| 166 |
+
</p>
|
| 167 |
+
</div>
|
| 168 |
+
|
| 169 |
+
<div className="space-y-2">
|
| 170 |
+
<h3 className="text-xl font-semibold">4-Year Career Roadmap</h3>
|
| 171 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 172 |
+
We don't just point you to a degree; we show you how to succeed in it. Our system generates
|
| 173 |
+
a year-by-year roadmap suggesting major subjects, necessary skills, certifications, and
|
| 174 |
+
internship windows, ensuring you stay ahead in the competitive job market.
|
| 175 |
+
</p>
|
| 176 |
+
</div>
|
| 177 |
+
</div>
|
| 178 |
+
</div>
|
| 179 |
+
</div>
|
| 180 |
+
</section>
|
| 181 |
+
</main>
|
| 182 |
+
|
| 183 |
+
<Footer />
|
| 184 |
+
</div>
|
| 185 |
+
)
|
| 186 |
+
}
|
next/src/app/api/auth/login/route.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { createClient } from "@/utils/supabase/server"
|
| 2 |
+
import { NextResponse } from "next/server"
|
| 3 |
+
import { loginSchema } from "@/lib/validations/login"
|
| 4 |
+
import { createSupabaseAdminClient } from "@/utils/supabase"
|
| 5 |
+
|
| 6 |
+
export async function POST(request: Request) {
|
| 7 |
+
try {
|
| 8 |
+
const body = await request.json()
|
| 9 |
+
const result = loginSchema.safeParse(body)
|
| 10 |
+
|
| 11 |
+
if (!result.success) {
|
| 12 |
+
return NextResponse.json({ error: result.error.message }, { status: 400 })
|
| 13 |
+
}
|
| 14 |
+
|
| 15 |
+
const { email, password } = result.data
|
| 16 |
+
const supabase = createSupabaseAdminClient();
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
// 2. Sign in with Password
|
| 20 |
+
const { error } = await supabase.auth.signInWithPassword({
|
| 21 |
+
email,
|
| 22 |
+
password,
|
| 23 |
+
})
|
| 24 |
+
|
| 25 |
+
if (error) {
|
| 26 |
+
return NextResponse.json({ error: error.message }, { status: 401 })
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
return NextResponse.json({ success: true, message: "Login successful!" })
|
| 30 |
+
|
| 31 |
+
} catch (error) {
|
| 32 |
+
return NextResponse.json({ error: "Internal Server Error" }, { status: 500 })
|
| 33 |
+
}
|
| 34 |
+
}
|
next/src/app/api/auth/register/route.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { NextResponse } from "next/server"
|
| 2 |
+
import { registerSchema } from "@/lib/validations/register"
|
| 3 |
+
import { createSupabaseAdminClient } from "@/utils/supabase"
|
| 4 |
+
|
| 5 |
+
export async function POST(request: Request) {
|
| 6 |
+
try {
|
| 7 |
+
const body = await request.json()
|
| 8 |
+
console.log(body)
|
| 9 |
+
|
| 10 |
+
// 1. Validate Input
|
| 11 |
+
const result = registerSchema.safeParse(body)
|
| 12 |
+
if (!result.success) {
|
| 13 |
+
return NextResponse.json({ error: result.error.message }, { status: 400 })
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
const { email, password, name, role } = result.data
|
| 17 |
+
|
| 18 |
+
const supabase = createSupabaseAdminClient();
|
| 19 |
+
|
| 20 |
+
const { data, error } = await supabase.auth.signUp({
|
| 21 |
+
email,
|
| 22 |
+
password,
|
| 23 |
+
options: {
|
| 24 |
+
data: {
|
| 25 |
+
role: role
|
| 26 |
+
}
|
| 27 |
+
}
|
| 28 |
+
})
|
| 29 |
+
|
| 30 |
+
if (error) {
|
| 31 |
+
console.log(error)
|
| 32 |
+
return NextResponse.json({ error: error.message }, { status: 400 })
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
return NextResponse.json({
|
| 36 |
+
success: true,
|
| 37 |
+
message: "Account created! Please check your email to confirm."
|
| 38 |
+
})
|
| 39 |
+
|
| 40 |
+
} catch (error) {
|
| 41 |
+
console.log(error)
|
| 42 |
+
return NextResponse.json({ error: "Internal Server Error" }, { status: 500 })
|
| 43 |
+
}
|
| 44 |
+
}
|
next/src/app/api/universities/route.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { NextResponse } from 'next/server';
|
| 2 |
+
import { supabase } from '@/lib/supabase';
|
| 3 |
+
|
| 4 |
+
export async function GET(request: Request) {
|
| 5 |
+
try {
|
| 6 |
+
const { searchParams } = new URL(request.url);
|
| 7 |
+
const search = searchParams.get('search');
|
| 8 |
+
const location = searchParams.get('location');
|
| 9 |
+
const maxFee = searchParams.get('maxFee');
|
| 10 |
+
|
| 11 |
+
// 1. Start the query (Sort by ID to mix datasets, or name)
|
| 12 |
+
let query = supabase
|
| 13 |
+
.from('University')
|
| 14 |
+
.select('*')
|
| 15 |
+
// .order('createdAt', { ascending: false }) // OPTIONAL: Uncomment if you want newest first
|
| 16 |
+
.limit(50);
|
| 17 |
+
|
| 18 |
+
// 2. Add Filters
|
| 19 |
+
if (search) {
|
| 20 |
+
query = query.ilike('name', `%${search}%`);
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
if (location) {
|
| 24 |
+
query = query.ilike('location', `%${location}%`);
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
if (maxFee) {
|
| 28 |
+
// THE FIX:
|
| 29 |
+
// This says: "Fee is less than maxFee OR Fee is NULL (Unknown)"
|
| 30 |
+
// This ensures universities with no fee data (like your Top 1600) still show up.
|
| 31 |
+
query = query.or(`feeStructure.lte.${parseInt(maxFee)},feeStructure.is.null`);
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
// 3. Execute
|
| 35 |
+
const { data, error } = await query;
|
| 36 |
+
|
| 37 |
+
if (error) throw error;
|
| 38 |
+
|
| 39 |
+
return NextResponse.json(data);
|
| 40 |
+
|
| 41 |
+
} catch (error: any) {
|
| 42 |
+
console.error("❌ SUPABASE API ERROR:", error);
|
| 43 |
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
| 44 |
+
}
|
| 45 |
+
}
|
next/src/app/blogs/page.tsx
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import Link from "next/link"
|
| 2 |
+
import { Navbar } from "@/components/navbar"
|
| 3 |
+
import { Footer } from "@/components/footer"
|
| 4 |
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
|
| 5 |
+
import { Badge } from "@/components/ui/badge"
|
| 6 |
+
import { Calendar, Clock, ArrowRight } from "lucide-react"
|
| 7 |
+
|
| 8 |
+
const blogPosts = [
|
| 9 |
+
{
|
| 10 |
+
id: 1,
|
| 11 |
+
title: "How AI Predicts Your Perfect Career Path",
|
| 12 |
+
excerpt:
|
| 13 |
+
"Discover the science behind our psychometric testing and how Machine Learning algorithms analyze your interests to find your ideal profession.",
|
| 14 |
+
category: "Technology",
|
| 15 |
+
date: "December 15, 2024",
|
| 16 |
+
readTime: "5 min read",
|
| 17 |
+
image: "/modern-university-campus-with-digital-interface-ov.jpg", // You can keep placeholder images or update paths later
|
| 18 |
+
},
|
| 19 |
+
{
|
| 20 |
+
id: 2,
|
| 21 |
+
title: "The Hidden Dangers of Parental Pressure",
|
| 22 |
+
excerpt:
|
| 23 |
+
"Why following someone else's dream can lead to career dissatisfaction. We explore the importance of choosing a field based on your own aptitude.",
|
| 24 |
+
category: "Student Life",
|
| 25 |
+
date: "December 10, 2024",
|
| 26 |
+
readTime: "7 min read",
|
| 27 |
+
image: "/students-working-on-projects-with-laptops-and-digi.jpg",
|
| 28 |
+
},
|
| 29 |
+
{
|
| 30 |
+
id: 3,
|
| 31 |
+
title: "Why You Need a 4-Year Career Roadmap",
|
| 32 |
+
excerpt:
|
| 33 |
+
"Success isn't just about getting a degree. Learn how a structured timeline of internships, projects, and skills can fast-track your employment.",
|
| 34 |
+
category: "Career Advice",
|
| 35 |
+
date: "December 5, 2024",
|
| 36 |
+
readTime: "6 min read",
|
| 37 |
+
image: "/digital-checklist-and-approval-workflow-interface.jpg",
|
| 38 |
+
},
|
| 39 |
+
{
|
| 40 |
+
id: 4,
|
| 41 |
+
title: "Top 5 High-Demand Careers in Pakistan for 2025",
|
| 42 |
+
excerpt:
|
| 43 |
+
"Based on our real-time market trend analysis, here are the fields offering the highest growth potential and salary packages this year.",
|
| 44 |
+
category: "Market Trends",
|
| 45 |
+
date: "November 28, 2024",
|
| 46 |
+
readTime: "4 min read",
|
| 47 |
+
image: "/dashboard-interface-with-multiple-user-roles-and-a.jpg",
|
| 48 |
+
},
|
| 49 |
+
{
|
| 50 |
+
id: 5,
|
| 51 |
+
title: "University Finder: Comparing Fees & Criteria",
|
| 52 |
+
excerpt:
|
| 53 |
+
"Stop browsing hundreds of websites. Learn how to use our centralized database to filter universities by location, cost, and admission requirements.",
|
| 54 |
+
category: "Education",
|
| 55 |
+
date: "November 20, 2024",
|
| 56 |
+
readTime: "5 min read",
|
| 57 |
+
image: "/professor-and-student-collaborating-with-digital-f.jpg",
|
| 58 |
+
},
|
| 59 |
+
{
|
| 60 |
+
id: 6,
|
| 61 |
+
title: "Understanding Your Psychometric Test Results",
|
| 62 |
+
excerpt: "A comprehensive guide to interpreting your profile vector, confidence scores, and what to do if your results surprise you.",
|
| 63 |
+
category: "Guidance",
|
| 64 |
+
date: "November 12, 2024",
|
| 65 |
+
readTime: "8 min read",
|
| 66 |
+
image: "/digital-security-shield-protecting-university-data.jpg",
|
| 67 |
+
},
|
| 68 |
+
]
|
| 69 |
+
|
| 70 |
+
export default function BlogPage() {
|
| 71 |
+
return (
|
| 72 |
+
<div className="min-h-screen flex flex-col">
|
| 73 |
+
<Navbar />
|
| 74 |
+
|
| 75 |
+
<main className="flex-1">
|
| 76 |
+
{/* Hero Section */}
|
| 77 |
+
<section className="py-20 md:py-32 bg-linear-to-b from-secondary/50 to-background">
|
| 78 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 79 |
+
<div className="max-w-3xl mx-auto text-center space-y-6">
|
| 80 |
+
<h1 className="text-4xl md:text-5xl font-bold text-balance">
|
| 81 |
+
{"Insights & Updates from "}
|
| 82 |
+
<span className="text-primary">Edu Path AI</span>
|
| 83 |
+
</h1>
|
| 84 |
+
<p className="text-lg md:text-xl text-muted-foreground leading-relaxed">
|
| 85 |
+
Stay informed about the latest trends in career counseling, AI technology, and university admissions
|
| 86 |
+
to make the best decisions for your future.
|
| 87 |
+
</p>
|
| 88 |
+
</div>
|
| 89 |
+
</div>
|
| 90 |
+
</section>
|
| 91 |
+
|
| 92 |
+
{/* Blog Posts Grid */}
|
| 93 |
+
<section className="py-20">
|
| 94 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 95 |
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
|
| 96 |
+
{blogPosts.map((post) => (
|
| 97 |
+
<Card key={post.id} className="overflow-hidden group hover:shadow-lg transition-shadow">
|
| 98 |
+
<div className="aspect-video overflow-hidden bg-muted">
|
| 99 |
+
<img
|
| 100 |
+
src={post.image || "/placeholder.svg"}
|
| 101 |
+
alt={post.title}
|
| 102 |
+
className="w-full h-full object-cover group-hover:scale-105 transition-transform duration-300"
|
| 103 |
+
/>
|
| 104 |
+
</div>
|
| 105 |
+
<CardHeader>
|
| 106 |
+
<div className="flex items-center gap-2 mb-3">
|
| 107 |
+
<Badge variant="secondary">{post.category}</Badge>
|
| 108 |
+
</div>
|
| 109 |
+
<CardTitle className="text-xl leading-tight group-hover:text-primary transition-colors">
|
| 110 |
+
{post.title}
|
| 111 |
+
</CardTitle>
|
| 112 |
+
<CardDescription className="line-clamp-2 leading-relaxed">{post.excerpt}</CardDescription>
|
| 113 |
+
</CardHeader>
|
| 114 |
+
<CardContent>
|
| 115 |
+
<div className="flex items-center justify-between text-sm text-muted-foreground">
|
| 116 |
+
<div className="flex items-center gap-1">
|
| 117 |
+
<Calendar className="h-4 w-4" />
|
| 118 |
+
<span>{post.date}</span>
|
| 119 |
+
</div>
|
| 120 |
+
<div className="flex items-center gap-1">
|
| 121 |
+
<Clock className="h-4 w-4" />
|
| 122 |
+
<span>{post.readTime}</span>
|
| 123 |
+
</div>
|
| 124 |
+
</div>
|
| 125 |
+
<Link
|
| 126 |
+
href={`/blog/${post.id}`}
|
| 127 |
+
className="inline-flex items-center gap-2 mt-4 text-primary font-medium hover:gap-3 transition-all"
|
| 128 |
+
>
|
| 129 |
+
Read More <ArrowRight className="h-4 w-4" />
|
| 130 |
+
</Link>
|
| 131 |
+
</CardContent>
|
| 132 |
+
</Card>
|
| 133 |
+
))}
|
| 134 |
+
</div>
|
| 135 |
+
</div>
|
| 136 |
+
</section>
|
| 137 |
+
|
| 138 |
+
{/* Newsletter Section */}
|
| 139 |
+
<section className="py-20 bg-card border-y">
|
| 140 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 141 |
+
<div className="max-w-2xl mx-auto text-center space-y-6">
|
| 142 |
+
<h2 className="text-3xl font-bold">Stay Updated</h2>
|
| 143 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 144 |
+
Subscribe to our newsletter to receive the latest career advice, university updates, and scholarship news
|
| 145 |
+
directly in your inbox.
|
| 146 |
+
</p>
|
| 147 |
+
<div className="flex flex-col sm:flex-row gap-3 max-w-md mx-auto">
|
| 148 |
+
<input
|
| 149 |
+
type="email"
|
| 150 |
+
placeholder="Enter your email"
|
| 151 |
+
className="flex-1 px-4 py-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-primary"
|
| 152 |
+
/>
|
| 153 |
+
<button className="px-6 py-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90 transition-colors font-medium">
|
| 154 |
+
Subscribe
|
| 155 |
+
</button>
|
| 156 |
+
</div>
|
| 157 |
+
<p className="text-xs text-muted-foreground">{"We respect your privacy. Unsubscribe at any time."}</p>
|
| 158 |
+
</div>
|
| 159 |
+
</div>
|
| 160 |
+
</section>
|
| 161 |
+
</main>
|
| 162 |
+
|
| 163 |
+
<Footer />
|
| 164 |
+
</div>
|
| 165 |
+
)
|
| 166 |
+
}
|
next/src/app/contact-us/page.tsx
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"use client"
|
| 2 |
+
|
| 3 |
+
import type React from "react"
|
| 4 |
+
|
| 5 |
+
import { useState } from "react"
|
| 6 |
+
import { Navbar } from "@/components/navbar"
|
| 7 |
+
import { Footer } from "@/components/footer"
|
| 8 |
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
|
| 9 |
+
import { Button } from "@/components/ui/button"
|
| 10 |
+
import { Input } from "@/components/ui/input"
|
| 11 |
+
import { Textarea } from "@/components/ui/textarea"
|
| 12 |
+
import { Label } from "@/components/ui/label"
|
| 13 |
+
import { Mail, Phone, MapPin, Send } from "lucide-react"
|
| 14 |
+
import { toast } from "sonner"
|
| 15 |
+
|
| 16 |
+
export default function ContactPage() {
|
| 17 |
+
const [isSubmitting, setIsSubmitting] = useState(false)
|
| 18 |
+
|
| 19 |
+
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
|
| 20 |
+
e.preventDefault()
|
| 21 |
+
setIsSubmitting(true)
|
| 22 |
+
|
| 23 |
+
// Simulate form submission
|
| 24 |
+
await new Promise((resolve) => setTimeout(resolve, 1500))
|
| 25 |
+
|
| 26 |
+
toast("Message sent successfully!", {
|
| 27 |
+
description: "Our support team will get back to you shortly.",
|
| 28 |
+
})
|
| 29 |
+
|
| 30 |
+
setIsSubmitting(false)
|
| 31 |
+
; (e.target as HTMLFormElement).reset()
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
return (
|
| 35 |
+
<div className="min-h-screen flex flex-col">
|
| 36 |
+
<Navbar />
|
| 37 |
+
|
| 38 |
+
<main className="flex-1">
|
| 39 |
+
{/* Hero Section */}
|
| 40 |
+
<section className="py-20 md:py-32 bg-linear-to-b from-secondary/50 to-background">
|
| 41 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 42 |
+
<div className="max-w-3xl mx-auto text-center space-y-6">
|
| 43 |
+
<h1 className="text-4xl md:text-5xl font-bold text-balance">
|
| 44 |
+
{"Get in "}
|
| 45 |
+
<span className="text-primary">Touch</span>
|
| 46 |
+
</h1>
|
| 47 |
+
<p className="text-lg md:text-xl text-muted-foreground leading-relaxed">
|
| 48 |
+
Have questions about your career recommendation? Need help with the university finder?
|
| 49 |
+
We're here to guide you every step of the way.
|
| 50 |
+
</p>
|
| 51 |
+
</div>
|
| 52 |
+
</div>
|
| 53 |
+
</section>
|
| 54 |
+
|
| 55 |
+
{/* Contact Section */}
|
| 56 |
+
<section className="py-20">
|
| 57 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 58 |
+
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8 max-w-6xl mx-auto">
|
| 59 |
+
{/* Contact Info */}
|
| 60 |
+
<div className="space-y-6">
|
| 61 |
+
<div>
|
| 62 |
+
<h2 className="text-2xl font-bold mb-6">Contact Information</h2>
|
| 63 |
+
<p className="text-muted-foreground leading-relaxed mb-8">
|
| 64 |
+
Reach out to our support team for assistance with account recovery, test results, or university data updates.
|
| 65 |
+
</p>
|
| 66 |
+
</div>
|
| 67 |
+
|
| 68 |
+
<Card>
|
| 69 |
+
<CardContent className="pt-6 space-y-6">
|
| 70 |
+
<div className="flex items-start gap-4">
|
| 71 |
+
<div className="h-10 w-10 rounded-lg bg-primary/10 flex items-center justify-center shrink-0">
|
| 72 |
+
<Mail className="h-5 w-5 text-primary" />
|
| 73 |
+
</div>
|
| 74 |
+
<div className="space-y-1">
|
| 75 |
+
<p className="font-medium">Email Support</p>
|
| 76 |
+
<p className="text-sm text-muted-foreground">help@edupathai.com</p>
|
| 77 |
+
<p className="text-sm text-muted-foreground">admin@edupathai.com</p>
|
| 78 |
+
</div>
|
| 79 |
+
</div>
|
| 80 |
+
|
| 81 |
+
<div className="flex items-start gap-4">
|
| 82 |
+
<div className="h-10 w-10 rounded-lg bg-primary/10 flex items-center justify-center shrink-0">
|
| 83 |
+
<Phone className="h-5 w-5 text-primary" />
|
| 84 |
+
</div>
|
| 85 |
+
<div className="space-y-1">
|
| 86 |
+
<p className="font-medium">Phone</p>
|
| 87 |
+
<p className="text-sm text-muted-foreground">+92 (334) 061-5582</p>
|
| 88 |
+
<p className="text-sm text-muted-foreground">Mon-Fri 9am-5pm PKT</p>
|
| 89 |
+
</div>
|
| 90 |
+
</div>
|
| 91 |
+
|
| 92 |
+
<div className="flex items-start gap-4">
|
| 93 |
+
<div className="h-10 w-10 rounded-lg bg-primary/10 flex items-center justify-center shrink-0">
|
| 94 |
+
<MapPin className="h-5 w-5 text-primary" />
|
| 95 |
+
</div>
|
| 96 |
+
<div className="space-y-1">
|
| 97 |
+
<p className="font-medium">Department Location</p>
|
| 98 |
+
<p className="text-sm text-muted-foreground">
|
| 99 |
+
Department of Software Engineering
|
| 100 |
+
<br />
|
| 101 |
+
Lahore Garrison University, Lahore
|
| 102 |
+
</p>
|
| 103 |
+
</div>
|
| 104 |
+
</div>
|
| 105 |
+
</CardContent>
|
| 106 |
+
</Card>
|
| 107 |
+
</div>
|
| 108 |
+
|
| 109 |
+
{/* Contact Form */}
|
| 110 |
+
<Card className="lg:col-span-2">
|
| 111 |
+
<CardHeader>
|
| 112 |
+
<CardTitle>Send us a Message</CardTitle>
|
| 113 |
+
<CardDescription>Fill out the form below for inquiries about features, partnerships, or technical issues.</CardDescription>
|
| 114 |
+
</CardHeader>
|
| 115 |
+
<CardContent>
|
| 116 |
+
<form onSubmit={handleSubmit} className="space-y-6">
|
| 117 |
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
| 118 |
+
<div className="space-y-2">
|
| 119 |
+
<Label htmlFor="firstName">First Name</Label>
|
| 120 |
+
<Input id="firstName" name="firstName" required placeholder=" " />
|
| 121 |
+
</div>
|
| 122 |
+
<div className="space-y-2">
|
| 123 |
+
<Label htmlFor="lastName">Last Name</Label>
|
| 124 |
+
<Input id="lastName" name="lastName" required placeholder=" " />
|
| 125 |
+
</div>
|
| 126 |
+
</div>
|
| 127 |
+
|
| 128 |
+
<div className="space-y-2">
|
| 129 |
+
<Label htmlFor="email">Email</Label>
|
| 130 |
+
<Input id="email" name="email" type="email" required placeholder=" " />
|
| 131 |
+
</div>
|
| 132 |
+
|
| 133 |
+
<div className="space-y-2">
|
| 134 |
+
<Label htmlFor="category">Inquiry Type</Label>
|
| 135 |
+
<Input id="category" name="category" placeholder="e.g., Technical Support, Feature Request" />
|
| 136 |
+
</div>
|
| 137 |
+
|
| 138 |
+
<div className="space-y-2">
|
| 139 |
+
<Label htmlFor="subject">Subject</Label>
|
| 140 |
+
<Input id="subject" name="subject" required placeholder="How can we help you?" />
|
| 141 |
+
</div>
|
| 142 |
+
|
| 143 |
+
<div className="space-y-2">
|
| 144 |
+
<Label htmlFor="message">Message</Label>
|
| 145 |
+
<Textarea
|
| 146 |
+
id="message"
|
| 147 |
+
name="message"
|
| 148 |
+
required
|
| 149 |
+
rows={6}
|
| 150 |
+
placeholder="Describe your issue or question..."
|
| 151 |
+
className="resize-none"
|
| 152 |
+
/>
|
| 153 |
+
</div>
|
| 154 |
+
|
| 155 |
+
<Button type="submit" size="lg" className="w-full" disabled={isSubmitting}>
|
| 156 |
+
{isSubmitting ? (
|
| 157 |
+
<>Sending...</>
|
| 158 |
+
) : (
|
| 159 |
+
<>
|
| 160 |
+
Send Message <Send className="ml-2 h-4 w-4" />
|
| 161 |
+
</>
|
| 162 |
+
)}
|
| 163 |
+
</Button>
|
| 164 |
+
</form>
|
| 165 |
+
</CardContent>
|
| 166 |
+
</Card>
|
| 167 |
+
</div>
|
| 168 |
+
</div>
|
| 169 |
+
</section>
|
| 170 |
+
|
| 171 |
+
{/* FAQ Section */}
|
| 172 |
+
<section className="py-20 bg-card border-y">
|
| 173 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 174 |
+
<div className="max-w-4xl mx-auto">
|
| 175 |
+
<div className="text-center space-y-4 mb-12">
|
| 176 |
+
<h2 className="text-3xl font-bold">Frequently Asked Questions</h2>
|
| 177 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 178 |
+
Common questions about our career guidance platform.
|
| 179 |
+
</p>
|
| 180 |
+
</div>
|
| 181 |
+
|
| 182 |
+
<div className="space-y-6">
|
| 183 |
+
<Card>
|
| 184 |
+
<CardHeader>
|
| 185 |
+
<CardTitle className="text-lg">How accurate is the career recommendation?</CardTitle>
|
| 186 |
+
</CardHeader>
|
| 187 |
+
<CardContent>
|
| 188 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 189 |
+
Our AI model is trained on a vast dataset of career profiles and aptitudes, achieving an 85% match accuracy.
|
| 190 |
+
However, we recommend treating the results as expert guidance rather than an absolute rule.
|
| 191 |
+
</p>
|
| 192 |
+
</CardContent>
|
| 193 |
+
</Card>
|
| 194 |
+
|
| 195 |
+
<Card>
|
| 196 |
+
<CardHeader>
|
| 197 |
+
<CardTitle className="text-lg">Can I retake the psychometric test?</CardTitle>
|
| 198 |
+
</CardHeader>
|
| 199 |
+
<CardContent>
|
| 200 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 201 |
+
Yes, you can retake the test after a 10-day cooldown period. This ensures that your interests have
|
| 202 |
+
genuinely evolved rather than just momentary changes in mood.
|
| 203 |
+
</p>
|
| 204 |
+
</CardContent>
|
| 205 |
+
</Card>
|
| 206 |
+
|
| 207 |
+
<Card>
|
| 208 |
+
<CardHeader>
|
| 209 |
+
<CardTitle className="text-lg">Is my data shared with universities?</CardTitle>
|
| 210 |
+
</CardHeader>
|
| 211 |
+
<CardContent>
|
| 212 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 213 |
+
No. Your psychometric test results and personal profile are private. We only use your data to generate
|
| 214 |
+
recommendations for you. We do not sell student data to third parties.
|
| 215 |
+
</p>
|
| 216 |
+
</CardContent>
|
| 217 |
+
</Card>
|
| 218 |
+
|
| 219 |
+
<Card>
|
| 220 |
+
<CardHeader>
|
| 221 |
+
<CardTitle className="text-lg">How often is the university data updated?</CardTitle>
|
| 222 |
+
</CardHeader>
|
| 223 |
+
<CardContent>
|
| 224 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 225 |
+
Our database is updated every semester to reflect the latest fee structures, admission deadlines,
|
| 226 |
+
and new degree programs offered by universities across Pakistan.
|
| 227 |
+
</p>
|
| 228 |
+
</CardContent>
|
| 229 |
+
</Card>
|
| 230 |
+
</div>
|
| 231 |
+
</div>
|
| 232 |
+
</div>
|
| 233 |
+
</section>
|
| 234 |
+
</main>
|
| 235 |
+
|
| 236 |
+
<Footer />
|
| 237 |
+
</div>
|
| 238 |
+
)
|
| 239 |
+
}
|
next/src/app/dashboard/compare/page.tsx
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
'use client';
|
| 2 |
+
|
| 3 |
+
import { useState } from 'react';
|
| 4 |
+
import { createClient } from '@supabase/supabase-js';
|
| 5 |
+
import Link from 'next/link';
|
| 6 |
+
|
| 7 |
+
// Initialize Supabase Client (Client-side)
|
| 8 |
+
const supabase = createClient(
|
| 9 |
+
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
| 10 |
+
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
|
| 11 |
+
);
|
| 12 |
+
|
| 13 |
+
export default function ComparePage() {
|
| 14 |
+
const [query1, setQuery1] = useState('');
|
| 15 |
+
const [query2, setQuery2] = useState('');
|
| 16 |
+
const [results1, setResults1] = useState<any[]>([]);
|
| 17 |
+
const [results2, setResults2] = useState<any[]>([]);
|
| 18 |
+
const [uni1, setUni1] = useState<any>(null);
|
| 19 |
+
const [uni2, setUni2] = useState<any>(null);
|
| 20 |
+
|
| 21 |
+
// Search Function
|
| 22 |
+
const searchUni = async (query: string, setResults: Function) => {
|
| 23 |
+
if (query.length < 2) return;
|
| 24 |
+
const { data } = await supabase
|
| 25 |
+
.from('universities')
|
| 26 |
+
.select('*')
|
| 27 |
+
.ilike('university_name', `%${query}%`)
|
| 28 |
+
.limit(5);
|
| 29 |
+
setResults(data || []);
|
| 30 |
+
};
|
| 31 |
+
|
| 32 |
+
return (
|
| 33 |
+
<div className="min-h-screen bg-gray-50 p-6 md:p-12">
|
| 34 |
+
<div className="max-w-6xl mx-auto">
|
| 35 |
+
<h1 className="text-3xl font-bold text-blue-900 mb-8 text-center">Compare Universities</h1>
|
| 36 |
+
|
| 37 |
+
{/* SELECTION AREA */}
|
| 38 |
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 mb-12">
|
| 39 |
+
|
| 40 |
+
{/* UNIVERSITY 1 SELECTOR */}
|
| 41 |
+
<div className="bg-white p-6 rounded-xl shadow-sm border border-gray-200">
|
| 42 |
+
<h3 className="font-bold text-gray-700 mb-4">University A</h3>
|
| 43 |
+
{!uni1 ? (
|
| 44 |
+
<div className="relative">
|
| 45 |
+
<input
|
| 46 |
+
type="text"
|
| 47 |
+
placeholder="Search (e.g. NUST)..."
|
| 48 |
+
className="w-full p-3 border rounded-lg focus:ring-2 focus:ring-blue-500"
|
| 49 |
+
onChange={(e) => {
|
| 50 |
+
setQuery1(e.target.value);
|
| 51 |
+
searchUni(e.target.value, setResults1);
|
| 52 |
+
}}
|
| 53 |
+
/>
|
| 54 |
+
{results1.length > 0 && (
|
| 55 |
+
<div className="absolute w-full bg-white border mt-1 rounded-lg shadow-lg z-10">
|
| 56 |
+
{results1.map((u) => (
|
| 57 |
+
<div
|
| 58 |
+
key={u.id}
|
| 59 |
+
className="p-3 hover:bg-blue-50 cursor-pointer"
|
| 60 |
+
onClick={() => { setUni1(u); setResults1([]); }}
|
| 61 |
+
>
|
| 62 |
+
{u.university_name}
|
| 63 |
+
</div>
|
| 64 |
+
))}
|
| 65 |
+
</div>
|
| 66 |
+
)}
|
| 67 |
+
</div>
|
| 68 |
+
) : (
|
| 69 |
+
<div className="flex justify-between items-center bg-blue-50 p-4 rounded-lg border border-blue-100">
|
| 70 |
+
<span className="font-bold text-blue-900">{uni1.university_name}</span>
|
| 71 |
+
<button onClick={() => setUni1(null)} className="text-red-500 text-sm hover:underline">Change</button>
|
| 72 |
+
</div>
|
| 73 |
+
)}
|
| 74 |
+
</div>
|
| 75 |
+
|
| 76 |
+
{/* UNIVERSITY 2 SELECTOR */}
|
| 77 |
+
<div className="bg-white p-6 rounded-xl shadow-sm border border-gray-200">
|
| 78 |
+
<h3 className="font-bold text-gray-700 mb-4">University B</h3>
|
| 79 |
+
{!uni2 ? (
|
| 80 |
+
<div className="relative">
|
| 81 |
+
<input
|
| 82 |
+
type="text"
|
| 83 |
+
placeholder="Search (e.g. LUMS)..."
|
| 84 |
+
className="w-full p-3 border rounded-lg focus:ring-2 focus:ring-blue-500"
|
| 85 |
+
onChange={(e) => {
|
| 86 |
+
setQuery2(e.target.value);
|
| 87 |
+
searchUni(e.target.value, setResults2);
|
| 88 |
+
}}
|
| 89 |
+
/>
|
| 90 |
+
{results2.length > 0 && (
|
| 91 |
+
<div className="absolute w-full bg-white border mt-1 rounded-lg shadow-lg z-10">
|
| 92 |
+
{results2.map((u) => (
|
| 93 |
+
<div
|
| 94 |
+
key={u.id}
|
| 95 |
+
className="p-3 hover:bg-blue-50 cursor-pointer"
|
| 96 |
+
onClick={() => { setUni2(u); setResults2([]); }}
|
| 97 |
+
>
|
| 98 |
+
{u.university_name}
|
| 99 |
+
</div>
|
| 100 |
+
))}
|
| 101 |
+
</div>
|
| 102 |
+
)}
|
| 103 |
+
</div>
|
| 104 |
+
) : (
|
| 105 |
+
<div className="flex justify-between items-center bg-blue-50 p-4 rounded-lg border border-blue-100">
|
| 106 |
+
<span className="font-bold text-blue-900">{uni2.university_name}</span>
|
| 107 |
+
<button onClick={() => setUni2(null)} className="text-red-500 text-sm hover:underline">Change</button>
|
| 108 |
+
</div>
|
| 109 |
+
)}
|
| 110 |
+
</div>
|
| 111 |
+
</div>
|
| 112 |
+
|
| 113 |
+
{/* COMPARISON TABLE */}
|
| 114 |
+
{uni1 && uni2 && (
|
| 115 |
+
<div className="bg-white rounded-2xl shadow-lg border border-gray-200 overflow-hidden">
|
| 116 |
+
<table className="w-full text-left">
|
| 117 |
+
<thead>
|
| 118 |
+
<tr className="bg-gray-100 border-b border-gray-200">
|
| 119 |
+
<th className="p-6 text-gray-500 font-medium w-1/3">Metric</th>
|
| 120 |
+
<th className="p-6 font-bold text-blue-900 w-1/3">{uni1.university_name}</th>
|
| 121 |
+
<th className="p-6 font-bold text-blue-900 w-1/3">{uni2.university_name}</th>
|
| 122 |
+
</tr>
|
| 123 |
+
</thead>
|
| 124 |
+
<tbody className="divide-y divide-gray-100">
|
| 125 |
+
|
| 126 |
+
{/* RANK COMPARISON */}
|
| 127 |
+
<tr>
|
| 128 |
+
<td className="p-6 font-medium text-gray-700">Global Rank</td>
|
| 129 |
+
<td className={`p-6 font-bold ${uni1.rank < uni2.rank ? 'text-green-600' : 'text-gray-900'}`}>
|
| 130 |
+
#{uni1.rank}
|
| 131 |
+
</td>
|
| 132 |
+
<td className={`p-6 font-bold ${uni2.rank < uni1.rank ? 'text-green-600' : 'text-gray-900'}`}>
|
| 133 |
+
#{uni2.rank}
|
| 134 |
+
</td>
|
| 135 |
+
</tr>
|
| 136 |
+
|
| 137 |
+
{/* TUITION COMPARISON */}
|
| 138 |
+
<tr>
|
| 139 |
+
<td className="p-6 font-medium text-gray-700">Est. Annual Fee</td>
|
| 140 |
+
<td className={`p-6 font-bold ${uni1.avg_tuition_usd < uni2.avg_tuition_usd ? 'text-green-600' : 'text-gray-900'}`}>
|
| 141 |
+
${uni1.avg_tuition_usd?.toLocaleString() || "N/A"}
|
| 142 |
+
</td>
|
| 143 |
+
<td className={`p-6 font-bold ${uni2.avg_tuition_usd < uni1.avg_tuition_usd ? 'text-green-600' : 'text-gray-900'}`}>
|
| 144 |
+
${uni2.avg_tuition_usd?.toLocaleString() || "N/A"}
|
| 145 |
+
</td>
|
| 146 |
+
</tr>
|
| 147 |
+
|
| 148 |
+
{/* LOCATION */}
|
| 149 |
+
<tr>
|
| 150 |
+
<td className="p-6 font-medium text-gray-700">Location</td>
|
| 151 |
+
<td className="p-6 text-gray-600">{uni1.country}</td>
|
| 152 |
+
<td className="p-6 text-gray-600">{uni2.country}</td>
|
| 153 |
+
</tr>
|
| 154 |
+
|
| 155 |
+
{/* ACTION BUTTONS */}
|
| 156 |
+
<tr className="bg-gray-50">
|
| 157 |
+
<td className="p-6"></td>
|
| 158 |
+
<td className="p-6">
|
| 159 |
+
<Link href={`/dashboard/university/${uni1.id}`} className="text-blue-600 hover:underline font-bold">
|
| 160 |
+
View Details →
|
| 161 |
+
</Link>
|
| 162 |
+
</td>
|
| 163 |
+
<td className="p-6">
|
| 164 |
+
<Link href={`/dashboard/university/${uni2.id}`} className="text-blue-600 hover:underline font-bold">
|
| 165 |
+
View Details →
|
| 166 |
+
</Link>
|
| 167 |
+
</td>
|
| 168 |
+
</tr>
|
| 169 |
+
|
| 170 |
+
</tbody>
|
| 171 |
+
</table>
|
| 172 |
+
</div>
|
| 173 |
+
)}
|
| 174 |
+
|
| 175 |
+
</div>
|
| 176 |
+
</div>
|
| 177 |
+
);
|
| 178 |
+
}
|
next/src/app/dashboard/layout.tsx
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar"
|
| 2 |
+
import { DashboardSidebar } from "@/components/dashboard-sidebar"
|
| 3 |
+
|
| 4 |
+
export default function DashboardLayout({
|
| 5 |
+
children,
|
| 6 |
+
}: {
|
| 7 |
+
children: React.ReactNode
|
| 8 |
+
}) {
|
| 9 |
+
return (
|
| 10 |
+
<SidebarProvider>
|
| 11 |
+
<div className="flex min-h-screen w-full bg-linear-to-b from-indigo-50 via-white to-white">
|
| 12 |
+
{/* This loads the actual functional sidebar, not just an icon */}
|
| 13 |
+
<DashboardSidebar />
|
| 14 |
+
|
| 15 |
+
<main className="flex-1 overflow-auto">
|
| 16 |
+
{/* This button allows mobile users to open/close the menu */}
|
| 17 |
+
<div className="p-4">
|
| 18 |
+
<SidebarTrigger />
|
| 19 |
+
</div>
|
| 20 |
+
|
| 21 |
+
{/* This is where your page content (Dashboard, Roadmap, etc.) appears */}
|
| 22 |
+
{children}
|
| 23 |
+
</main>
|
| 24 |
+
</div>
|
| 25 |
+
</SidebarProvider>
|
| 26 |
+
)
|
| 27 |
+
}
|
next/src/app/dashboard/page.tsx
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import Link from "next/link"
|
| 2 |
+
import { MessageSquare, GraduationCap, Map, Scale } from "lucide-react" // 👈 Added Scale icon here
|
| 3 |
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
|
| 4 |
+
import { Footer } from "@/components/footer"
|
| 5 |
+
|
| 6 |
+
export default function DashboardPage() {
|
| 7 |
+
return (
|
| 8 |
+
<div className="mx-auto max-w-6xl px-4 py-8 sm:px-6 lg:px-8">
|
| 9 |
+
<div className="mb-12 text-center">
|
| 10 |
+
<h1 className="mb-4 font-bold text-4xl text-foreground text-balance">Your Edu Path AI Dashboard</h1>
|
| 11 |
+
<p className="mx-auto max-w-2xl text-muted-foreground text-xl text-pretty">
|
| 12 |
+
Navigate your academic journey with intelligent insights and comprehensive university data
|
| 13 |
+
</p>
|
| 14 |
+
</div>
|
| 15 |
+
|
| 16 |
+
<div className="mb-8 text-center">
|
| 17 |
+
<h2 className="mb-8 font-semibold text-2xl text-foreground">How would you like to get started?</h2>
|
| 18 |
+
|
| 19 |
+
{/* 👇 UPDATED GRID: Now handles 4 items nicely */}
|
| 20 |
+
<div className="mx-auto grid max-w-6xl gap-6 md:grid-cols-2 lg:grid-cols-4">
|
| 21 |
+
|
| 22 |
+
{/* Card 1: Chatbot */}
|
| 23 |
+
<Card className="group cursor-pointer border-2 transition-all duration-300 hover:scale-105 hover:border-indigo-600 hover:shadow-xl">
|
| 24 |
+
<Link href="/dashboard/chatbot" className="block h-full">
|
| 25 |
+
<CardHeader className="pb-4">
|
| 26 |
+
<div className="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-indigo-100 transition-transform group-hover:scale-110">
|
| 27 |
+
<MessageSquare className="h-8 w-8 text-indigo-600" />
|
| 28 |
+
</div>
|
| 29 |
+
<CardTitle className="text-xl text-center">AI Career Advisor</CardTitle>
|
| 30 |
+
</CardHeader>
|
| 31 |
+
<CardContent>
|
| 32 |
+
<CardDescription className="text-center">
|
| 33 |
+
Chat with our AI to find your perfect career path.
|
| 34 |
+
</CardDescription>
|
| 35 |
+
</CardContent>
|
| 36 |
+
</Link>
|
| 37 |
+
</Card>
|
| 38 |
+
|
| 39 |
+
{/* Card 2: Universities */}
|
| 40 |
+
<Card className="group cursor-pointer border-2 transition-all duration-300 hover:scale-105 hover:border-indigo-600 hover:shadow-xl">
|
| 41 |
+
<Link href="/dashboard/university" className="block h-full">
|
| 42 |
+
<CardHeader className="pb-4">
|
| 43 |
+
<div className="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-indigo-100 transition-transform group-hover:scale-110">
|
| 44 |
+
<GraduationCap className="h-8 w-8 text-indigo-600" />
|
| 45 |
+
</div>
|
| 46 |
+
<CardTitle className="text-xl text-center">Explore Universities</CardTitle>
|
| 47 |
+
</CardHeader>
|
| 48 |
+
<CardContent>
|
| 49 |
+
<CardDescription className="text-center">
|
| 50 |
+
Browse 1,800+ top universities and fee structures.
|
| 51 |
+
</CardDescription>
|
| 52 |
+
</CardContent>
|
| 53 |
+
</Link>
|
| 54 |
+
</Card>
|
| 55 |
+
|
| 56 |
+
{/* Card 3: Roadmap */}
|
| 57 |
+
<Card className="group cursor-pointer border-2 transition-all duration-300 hover:scale-105 hover:border-indigo-600 hover:shadow-xl">
|
| 58 |
+
<Link href="/dashboard/roadmap" className="block h-full">
|
| 59 |
+
<CardHeader className="pb-4">
|
| 60 |
+
<div className="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-indigo-100 transition-transform group-hover:scale-110">
|
| 61 |
+
<Map className="h-8 w-8 text-indigo-600" />
|
| 62 |
+
</div>
|
| 63 |
+
<CardTitle className="text-xl text-center">Degree Roadmap</CardTitle>
|
| 64 |
+
</CardHeader>
|
| 65 |
+
<CardContent>
|
| 66 |
+
<CardDescription className="text-center">
|
| 67 |
+
A complete guide to skills and subjects for your major.
|
| 68 |
+
</CardDescription>
|
| 69 |
+
</CardContent>
|
| 70 |
+
</Link>
|
| 71 |
+
</Card>
|
| 72 |
+
|
| 73 |
+
{/* 👇 Card 4: COMPARE TOOL (NEW) */}
|
| 74 |
+
<Card className="group cursor-pointer border-2 transition-all duration-300 hover:scale-105 hover:border-green-600 hover:shadow-xl">
|
| 75 |
+
<Link href="/dashboard/compare" className="block h-full">
|
| 76 |
+
<CardHeader className="pb-4">
|
| 77 |
+
<div className="mx-auto mb-4 flex h-16 w-16 items-center justify-center rounded-full bg-green-100 transition-transform group-hover:scale-110">
|
| 78 |
+
<Scale className="h-8 w-8 text-green-600" />
|
| 79 |
+
</div>
|
| 80 |
+
<CardTitle className="text-xl text-center">Compare Tool</CardTitle>
|
| 81 |
+
</CardHeader>
|
| 82 |
+
<CardContent>
|
| 83 |
+
<CardDescription className="text-center">
|
| 84 |
+
Compare fees and rankings side-by-side.
|
| 85 |
+
</CardDescription>
|
| 86 |
+
</CardContent>
|
| 87 |
+
</Link>
|
| 88 |
+
</Card>
|
| 89 |
+
|
| 90 |
+
</div>
|
| 91 |
+
</div>
|
| 92 |
+
|
| 93 |
+
<div className="mt-12 rounded-lg border bg-card p-6 text-center shadow-sm">
|
| 94 |
+
<Footer />
|
| 95 |
+
</div>
|
| 96 |
+
</div>
|
| 97 |
+
)
|
| 98 |
+
}
|
next/src/app/dashboard/roadmap/page.tsx
ADDED
|
@@ -0,0 +1,482 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"use client"
|
| 2 |
+
|
| 3 |
+
import { useState } from "react";
|
| 4 |
+
import {
|
| 5 |
+
Code, Briefcase, Stethoscope, FlaskConical, Palette, Scale,
|
| 6 |
+
Cpu, Building2, TrendingUp, ShieldCheck, Calculator, BookOpen,
|
| 7 |
+
Camera, Plane, GraduationCap, HeartHandshake, Globe, Layout
|
| 8 |
+
} from "lucide-react";
|
| 9 |
+
|
| 10 |
+
// --- 1. THE COMPLETE DATA (All Fields) ---
|
| 11 |
+
const roadmaps = {
|
| 12 |
+
// === CATEGORY: TECHNOLOGY & ENGINEERING ===
|
| 13 |
+
cs: {
|
| 14 |
+
category: "Tech & Engineering",
|
| 15 |
+
title: "Computer Science (CS/SE)",
|
| 16 |
+
icon: Code,
|
| 17 |
+
description: "The path to becoming a Software Engineer, Data Scientist, or AI Specialist.",
|
| 18 |
+
universityFocus: [
|
| 19 |
+
"Data Structures & Algorithms (The interview standard)",
|
| 20 |
+
"Object Oriented Programming (OOP)",
|
| 21 |
+
"Database Systems (SQL)",
|
| 22 |
+
"Operating Systems & Computer Networks"
|
| 23 |
+
],
|
| 24 |
+
externalSkills: [
|
| 25 |
+
{ name: "Full Stack Web Dev", detail: "React, Next.js, Node.js" },
|
| 26 |
+
{ name: "Version Control", detail: "Git & GitHub (Essential)" },
|
| 27 |
+
{ name: "Cloud Computing", detail: "AWS, Azure, or Docker basics" },
|
| 28 |
+
{ name: "Portfolio Building", detail: "Build 2-3 real apps to show recruiters" }
|
| 29 |
+
]
|
| 30 |
+
},
|
| 31 |
+
engineering: {
|
| 32 |
+
category: "Tech & Engineering",
|
| 33 |
+
title: "Electrical/Mechanical Eng.",
|
| 34 |
+
icon: Cpu,
|
| 35 |
+
description: "For Engineers working with hardware, robotics, power, or machines.",
|
| 36 |
+
universityFocus: [
|
| 37 |
+
"Circuit Analysis / Thermodynamics",
|
| 38 |
+
"Control Systems & Automation",
|
| 39 |
+
"Embedded Systems",
|
| 40 |
+
"Engineering Mechanics & Materials"
|
| 41 |
+
],
|
| 42 |
+
externalSkills: [
|
| 43 |
+
{ name: "Simulation Software", detail: "MATLAB, Simulink, SolidWorks, ANSYS" },
|
| 44 |
+
{ name: "IoT & Microcontrollers", detail: "Arduino, Raspberry Pi, ESP32" },
|
| 45 |
+
{ name: "PCB Design", detail: "Altium Designer, KiCad" },
|
| 46 |
+
{ name: "Coding for Hardware", detail: "Python, C/C++" }
|
| 47 |
+
]
|
| 48 |
+
},
|
| 49 |
+
civil: {
|
| 50 |
+
category: "Tech & Engineering",
|
| 51 |
+
title: "Civil Engineering",
|
| 52 |
+
icon: Building2,
|
| 53 |
+
description: "Designing the infrastructure of the world: bridges, roads, and dams.",
|
| 54 |
+
universityFocus: [
|
| 55 |
+
"Structural Analysis",
|
| 56 |
+
"Fluid Mechanics & Hydraulics",
|
| 57 |
+
"Geotechnical Engineering",
|
| 58 |
+
"Concrete & Steel Design"
|
| 59 |
+
],
|
| 60 |
+
externalSkills: [
|
| 61 |
+
{ name: "Design Software", detail: "AutoCAD Civil 3D, STAAD.Pro, ETABS" },
|
| 62 |
+
{ name: "Project Management", detail: "Primavera P6, MS Project" },
|
| 63 |
+
{ name: "Site Safety", detail: "OSHA Certification / HSE Standards" },
|
| 64 |
+
{ name: "Sustainability", detail: "LEED Certification basics" }
|
| 65 |
+
]
|
| 66 |
+
},
|
| 67 |
+
|
| 68 |
+
// === CATEGORY: BUSINESS & FINANCE ===
|
| 69 |
+
bba: {
|
| 70 |
+
category: "Business & Management",
|
| 71 |
+
title: "Business Admin (BBA/MBA)",
|
| 72 |
+
icon: Briefcase,
|
| 73 |
+
description: "For future Managers, Entrepreneurs, and HR Specialists.",
|
| 74 |
+
universityFocus: [
|
| 75 |
+
"Financial Accounting & Analysis",
|
| 76 |
+
"Marketing Management",
|
| 77 |
+
"Human Resource Management (HRM)",
|
| 78 |
+
"Supply Chain Management"
|
| 79 |
+
],
|
| 80 |
+
externalSkills: [
|
| 81 |
+
{ name: "Data Analysis Tools", detail: "Advanced Excel (Pivot Tables), PowerBI" },
|
| 82 |
+
{ name: "Digital Marketing", detail: "SEO, Google Ads, Meta Ads Manager" },
|
| 83 |
+
{ name: "Soft Skills", detail: "Public Speaking & Negotiation" },
|
| 84 |
+
{ name: "Project Tools", detail: "JIRA, Trello, Asana" }
|
| 85 |
+
]
|
| 86 |
+
},
|
| 87 |
+
accounting: {
|
| 88 |
+
category: "Business & Management",
|
| 89 |
+
title: "Accounting & Finance (ACCA)",
|
| 90 |
+
icon: Calculator,
|
| 91 |
+
description: "For Auditors, Financial Analysts, and Tax Consultants.",
|
| 92 |
+
universityFocus: [
|
| 93 |
+
"Financial Reporting",
|
| 94 |
+
"Taxation Laws",
|
| 95 |
+
"Audit & Assurance",
|
| 96 |
+
"Corporate Finance"
|
| 97 |
+
],
|
| 98 |
+
externalSkills: [
|
| 99 |
+
{ name: "Accounting Software", detail: "QuickBooks, Xero, SAP" },
|
| 100 |
+
{ name: "Financial Modeling", detail: "Valuation models in Excel" },
|
| 101 |
+
{ name: "Certifications", detail: "CFA Level 1, ACCA papers" },
|
| 102 |
+
{ name: "Regulation Knowledge", detail: "Local tax laws & IFRS" }
|
| 103 |
+
]
|
| 104 |
+
},
|
| 105 |
+
economics: {
|
| 106 |
+
category: "Business & Management",
|
| 107 |
+
title: "Economics",
|
| 108 |
+
icon: TrendingUp,
|
| 109 |
+
description: "Analyzing markets, policy, and financial trends.",
|
| 110 |
+
universityFocus: [
|
| 111 |
+
"Micro & Macro Economics",
|
| 112 |
+
"Econometrics & Statistics",
|
| 113 |
+
"Game Theory",
|
| 114 |
+
"Development Economics"
|
| 115 |
+
],
|
| 116 |
+
externalSkills: [
|
| 117 |
+
{ name: "Statistical Tools", detail: "R, Stata, Python" },
|
| 118 |
+
{ name: "Data Visualization", detail: "Tableau, PowerBI" },
|
| 119 |
+
{ name: "Policy Analysis", detail: "Writing policy briefs" },
|
| 120 |
+
{ name: "Finance Knowledge", detail: "Stock markets & banking systems" }
|
| 121 |
+
]
|
| 122 |
+
},
|
| 123 |
+
|
| 124 |
+
// === CATEGORY: HEALTH & SCIENCE ===
|
| 125 |
+
medical: {
|
| 126 |
+
category: "Health & Science",
|
| 127 |
+
title: "Medical (MBBS/BDS)",
|
| 128 |
+
icon: Stethoscope,
|
| 129 |
+
description: "The path for Doctors, Dentists, and Health Professionals.",
|
| 130 |
+
universityFocus: [
|
| 131 |
+
"Anatomy & Physiology",
|
| 132 |
+
"Pathology & Pharmacology",
|
| 133 |
+
"Internal Medicine",
|
| 134 |
+
"Surgery Basics"
|
| 135 |
+
],
|
| 136 |
+
externalSkills: [
|
| 137 |
+
{ name: "Clinical Electives", detail: "Hospital internships" },
|
| 138 |
+
{ name: "Research Writing", detail: "Publishing research papers" },
|
| 139 |
+
{ name: "Patient Communication", detail: "Empathy & local languages" },
|
| 140 |
+
{ name: "Licensing Prep", detail: "USMLE/PLAB/NLE prep" }
|
| 141 |
+
]
|
| 142 |
+
},
|
| 143 |
+
biotech: {
|
| 144 |
+
category: "Health & Science",
|
| 145 |
+
title: "Biotechnology / Biology",
|
| 146 |
+
icon: FlaskConical,
|
| 147 |
+
description: "Merging biology with technology for research and pharma.",
|
| 148 |
+
universityFocus: [
|
| 149 |
+
"Molecular Biology",
|
| 150 |
+
"Genetics & Genomics",
|
| 151 |
+
"Microbiology",
|
| 152 |
+
"Bioinformatics"
|
| 153 |
+
],
|
| 154 |
+
externalSkills: [
|
| 155 |
+
{ name: "Lab Techniques", detail: "PCR, CRISPR, Gel Electrophoresis" },
|
| 156 |
+
{ name: "Data Science", detail: "Python/R for bio-data" },
|
| 157 |
+
{ name: "Regulatory Affairs", detail: "FDA/GMP guidelines" },
|
| 158 |
+
{ name: "Scientific Writing", detail: "Grant writing" }
|
| 159 |
+
]
|
| 160 |
+
},
|
| 161 |
+
psychology: {
|
| 162 |
+
category: "Health & Science",
|
| 163 |
+
title: "Psychology",
|
| 164 |
+
icon: HeartHandshake,
|
| 165 |
+
description: "Understanding human behavior, mental health, and HR.",
|
| 166 |
+
universityFocus: [
|
| 167 |
+
"Cognitive Psychology",
|
| 168 |
+
"Abnormal Psychology",
|
| 169 |
+
"Research Methods",
|
| 170 |
+
"Clinical Psychology"
|
| 171 |
+
],
|
| 172 |
+
externalSkills: [
|
| 173 |
+
{ name: "Counseling Skills", detail: "Active listening, CBT basics" },
|
| 174 |
+
{ name: "HR Applications", detail: "Psychometric testing" },
|
| 175 |
+
{ name: "Data Analysis", detail: "SPSS software mastery" },
|
| 176 |
+
{ name: "User Research", detail: "UX Research methods" }
|
| 177 |
+
]
|
| 178 |
+
},
|
| 179 |
+
|
| 180 |
+
// === CATEGORY: ARTS & HUMANITIES ===
|
| 181 |
+
law: {
|
| 182 |
+
category: "Arts & Humanities",
|
| 183 |
+
title: "Law (LLB/JD)",
|
| 184 |
+
icon: Scale,
|
| 185 |
+
description: "For Lawyers, Judges, and Corporate Legal Advisors.",
|
| 186 |
+
universityFocus: [
|
| 187 |
+
"Constitutional Law",
|
| 188 |
+
"Contract & Tort Law",
|
| 189 |
+
"Criminal Law",
|
| 190 |
+
"Corporate Law"
|
| 191 |
+
],
|
| 192 |
+
externalSkills: [
|
| 193 |
+
{ name: "Mooting", detail: "Moot Court competitions" },
|
| 194 |
+
{ name: "Drafting", detail: "Legal contract writing" },
|
| 195 |
+
{ name: "Public Speaking", detail: "Debating skills" },
|
| 196 |
+
{ name: "Networking", detail: "Law firm internships" }
|
| 197 |
+
]
|
| 198 |
+
},
|
| 199 |
+
media: {
|
| 200 |
+
category: "Arts & Humanities",
|
| 201 |
+
title: "Media & Journalism",
|
| 202 |
+
icon: Camera,
|
| 203 |
+
description: "Journalism, Mass Com, and Digital Media production.",
|
| 204 |
+
universityFocus: [
|
| 205 |
+
"News Writing & Reporting",
|
| 206 |
+
"Media Ethics & Law",
|
| 207 |
+
"Broadcasting",
|
| 208 |
+
"Public Relations (PR)"
|
| 209 |
+
],
|
| 210 |
+
externalSkills: [
|
| 211 |
+
{ name: "Video Editing", detail: "Premiere Pro, DaVinci Resolve" },
|
| 212 |
+
{ name: "Content Creation", detail: "SEO Writing, Social Media" },
|
| 213 |
+
{ name: "Photography", detail: "DSLR handling" },
|
| 214 |
+
{ name: "Digital Tools", detail: "WordPress, CMS, Analytics" }
|
| 215 |
+
]
|
| 216 |
+
},
|
| 217 |
+
design: {
|
| 218 |
+
category: "Arts & Humanities",
|
| 219 |
+
title: "Graphic Design / Fine Arts",
|
| 220 |
+
icon: Palette,
|
| 221 |
+
description: "Visual communication, branding, and UX/UI.",
|
| 222 |
+
universityFocus: [
|
| 223 |
+
"Color Theory & Typography",
|
| 224 |
+
"History of Art/Design",
|
| 225 |
+
"Visual Composition",
|
| 226 |
+
"Branding Identity"
|
| 227 |
+
],
|
| 228 |
+
externalSkills: [
|
| 229 |
+
{ name: "Design Suite", detail: "Photoshop, Illustrator, InDesign" },
|
| 230 |
+
{ name: "UI/UX Design", detail: "Figma, Adobe XD" },
|
| 231 |
+
{ name: "Portfolio", detail: "Behance/Dribbble portfolio" },
|
| 232 |
+
{ name: "Motion Graphics", detail: "After Effects basics" }
|
| 233 |
+
]
|
| 234 |
+
},
|
| 235 |
+
english: {
|
| 236 |
+
category: "Arts & Humanities",
|
| 237 |
+
title: "English Lit & Linguistics",
|
| 238 |
+
icon: BookOpen,
|
| 239 |
+
description: "Content writing, teaching, and editorial careers.",
|
| 240 |
+
universityFocus: [
|
| 241 |
+
"Literary Criticism",
|
| 242 |
+
"Sociolinguistics",
|
| 243 |
+
"Creative Writing",
|
| 244 |
+
"Post-Colonial Literature"
|
| 245 |
+
],
|
| 246 |
+
externalSkills: [
|
| 247 |
+
{ name: "Copywriting", detail: "SEO Content, Sales Copy" },
|
| 248 |
+
{ name: "Technical Writing", detail: "Documentation skills" },
|
| 249 |
+
{ name: "Teaching Certs", detail: "TEFL/TESOL" },
|
| 250 |
+
{ name: "Editing", detail: "Professional proofreading" }
|
| 251 |
+
]
|
| 252 |
+
},
|
| 253 |
+
|
| 254 |
+
// === CATEGORY: SPECIALIZED FIELDS ===
|
| 255 |
+
architecture: {
|
| 256 |
+
category: "Specialized",
|
| 257 |
+
title: "Architecture",
|
| 258 |
+
icon: Building2,
|
| 259 |
+
description: "For Architects, Interior Designers, and Urban Planners.",
|
| 260 |
+
universityFocus: [
|
| 261 |
+
"Design Studios",
|
| 262 |
+
"History of Architecture",
|
| 263 |
+
"Structural Systems",
|
| 264 |
+
"Building Materials"
|
| 265 |
+
],
|
| 266 |
+
externalSkills: [
|
| 267 |
+
{ name: "Digital Modeling", detail: "AutoCAD, Revit, SketchUp" },
|
| 268 |
+
{ name: "Rendering", detail: "Lumion, V-Ray" },
|
| 269 |
+
{ name: "Graphics", detail: "Adobe Suite" },
|
| 270 |
+
{ name: "Site Experience", detail: "Construction site visits" }
|
| 271 |
+
]
|
| 272 |
+
},
|
| 273 |
+
aviation: {
|
| 274 |
+
category: "Specialized",
|
| 275 |
+
title: "Aviation & Management",
|
| 276 |
+
icon: Plane,
|
| 277 |
+
description: "Pilots, Airport Managers, and Aerospace operations.",
|
| 278 |
+
universityFocus: [
|
| 279 |
+
"Aerodynamics",
|
| 280 |
+
"Aviation Law & Safety",
|
| 281 |
+
"Airport Operations",
|
| 282 |
+
"Navigation"
|
| 283 |
+
],
|
| 284 |
+
externalSkills: [
|
| 285 |
+
{ name: "Licensing", detail: "PPL/CPL hours" },
|
| 286 |
+
{ name: "Safety Mgmt", detail: "SMS Certification" },
|
| 287 |
+
{ name: "Logistics", detail: "Supply chain software" },
|
| 288 |
+
{ name: "Languages", detail: "ICAO English proficiency" }
|
| 289 |
+
]
|
| 290 |
+
},
|
| 291 |
+
education: {
|
| 292 |
+
category: "Specialized",
|
| 293 |
+
title: "Education & Teaching",
|
| 294 |
+
icon: GraduationCap,
|
| 295 |
+
description: "Training the next generation of teachers and policymakers.",
|
| 296 |
+
universityFocus: [
|
| 297 |
+
"Curriculum Development",
|
| 298 |
+
"Educational Psychology",
|
| 299 |
+
"Classroom Management",
|
| 300 |
+
"Assessment Strategies"
|
| 301 |
+
],
|
| 302 |
+
externalSkills: [
|
| 303 |
+
{ name: "EdTech", detail: "Canvas, Google Classroom" },
|
| 304 |
+
{ name: "Special Needs", detail: "Sign Language basics" },
|
| 305 |
+
{ name: "Public Speaking", detail: "Voice modulation" },
|
| 306 |
+
{ name: "Lesson Planning", detail: "Digital lesson plans" }
|
| 307 |
+
]
|
| 308 |
+
},
|
| 309 |
+
ir: {
|
| 310 |
+
category: "Specialized",
|
| 311 |
+
title: "International Relations",
|
| 312 |
+
icon: Globe,
|
| 313 |
+
description: "Diplomacy, NGOs, and Global Policy.",
|
| 314 |
+
universityFocus: [
|
| 315 |
+
"Political Theory",
|
| 316 |
+
"Foreign Policy Analysis",
|
| 317 |
+
"International Law",
|
| 318 |
+
"Conflict Resolution"
|
| 319 |
+
],
|
| 320 |
+
externalSkills: [
|
| 321 |
+
{ name: "Languages", detail: "French, Arabic, or Chinese" },
|
| 322 |
+
{ name: "Research", detail: "Policy paper writing" },
|
| 323 |
+
{ name: "Networking", detail: "Model UN (MUN)" },
|
| 324 |
+
{ name: "Project Mgmt", detail: "Grant writing" }
|
| 325 |
+
]
|
| 326 |
+
}
|
| 327 |
+
};
|
| 328 |
+
|
| 329 |
+
// Type definitions
|
| 330 |
+
type FieldKey = keyof typeof roadmaps;
|
| 331 |
+
|
| 332 |
+
// Categories for Sidebar Grouping
|
| 333 |
+
const categories = {
|
| 334 |
+
"Tech & Engineering": ["cs", "engineering", "civil"],
|
| 335 |
+
"Business & Management": ["bba", "accounting", "economics"],
|
| 336 |
+
"Health & Science": ["medical", "biotech", "psychology"],
|
| 337 |
+
"Arts & Humanities": ["law", "media", "design", "english"],
|
| 338 |
+
"Specialized": ["architecture", "aviation", "education", "ir"]
|
| 339 |
+
};
|
| 340 |
+
|
| 341 |
+
export default function RoadmapPage() {
|
| 342 |
+
const [selectedField, setSelectedField] = useState<FieldKey>("cs");
|
| 343 |
+
|
| 344 |
+
// Helper to safely get the current roadmap data
|
| 345 |
+
const currentRoadmap = roadmaps[selectedField] || roadmaps.cs;
|
| 346 |
+
|
| 347 |
+
return (
|
| 348 |
+
<div className="flex flex-col md:flex-row h-[calc(100vh-80px)]">
|
| 349 |
+
|
| 350 |
+
{/* 1. LEFT SIDEBAR: Categorized Selection */}
|
| 351 |
+
<aside className="w-full md:w-72 bg-white border-r h-full overflow-y-auto custom-scrollbar">
|
| 352 |
+
<div className="p-4 bg-white sticky top-0 z-10 border-b">
|
| 353 |
+
<h2 className="text-lg font-bold text-gray-900">Select Degree</h2>
|
| 354 |
+
</div>
|
| 355 |
+
|
| 356 |
+
<div className="p-4 space-y-6 pb-20">
|
| 357 |
+
{Object.entries(categories).map(([categoryName, keys]) => (
|
| 358 |
+
<div key={categoryName}>
|
| 359 |
+
<h3 className="text-xs font-bold text-gray-400 uppercase tracking-wider mb-2 px-2">
|
| 360 |
+
{categoryName}
|
| 361 |
+
</h3>
|
| 362 |
+
<div className="space-y-1">
|
| 363 |
+
{keys.map((key) => {
|
| 364 |
+
// Cast key to FieldKey to avoid TS errors
|
| 365 |
+
const fieldKey = key as FieldKey;
|
| 366 |
+
const data = roadmaps[fieldKey];
|
| 367 |
+
const Icon = data.icon;
|
| 368 |
+
const isSelected = selectedField === fieldKey;
|
| 369 |
+
|
| 370 |
+
return (
|
| 371 |
+
<button
|
| 372 |
+
key={fieldKey}
|
| 373 |
+
onClick={() => setSelectedField(fieldKey)}
|
| 374 |
+
className={`w-full flex items-center gap-3 px-3 py-2 rounded-lg transition-all text-left text-sm ${
|
| 375 |
+
isSelected
|
| 376 |
+
? "bg-blue-50 text-blue-700 font-semibold border border-blue-200"
|
| 377 |
+
: "text-gray-600 hover:bg-gray-50"
|
| 378 |
+
}`}
|
| 379 |
+
>
|
| 380 |
+
<Icon className={`h-4 w-4 ${isSelected ? "text-blue-600" : "text-gray-400"}`} />
|
| 381 |
+
<span>{data.title}</span>
|
| 382 |
+
</button>
|
| 383 |
+
);
|
| 384 |
+
})}
|
| 385 |
+
</div>
|
| 386 |
+
</div>
|
| 387 |
+
))}
|
| 388 |
+
</div>
|
| 389 |
+
</aside>
|
| 390 |
+
|
| 391 |
+
{/* 2. MAIN CONTENT AREA */}
|
| 392 |
+
<main className="flex-1 overflow-y-auto p-6 md:p-12 bg-gray-50">
|
| 393 |
+
<div className="max-w-4xl mx-auto pb-20">
|
| 394 |
+
|
| 395 |
+
{/* Header */}
|
| 396 |
+
<div className="mb-10">
|
| 397 |
+
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-blue-100 text-blue-700 text-xs font-bold mb-4">
|
| 398 |
+
{currentRoadmap.category}
|
| 399 |
+
</div>
|
| 400 |
+
<h1 className="text-3xl md:text-4xl font-bold text-gray-900 mb-2 flex items-center gap-3">
|
| 401 |
+
{currentRoadmap.title}
|
| 402 |
+
</h1>
|
| 403 |
+
<p className="text-xl text-gray-600 leading-relaxed">
|
| 404 |
+
{currentRoadmap.description}
|
| 405 |
+
</p>
|
| 406 |
+
</div>
|
| 407 |
+
|
| 408 |
+
<div className="grid md:grid-cols-2 gap-8">
|
| 409 |
+
|
| 410 |
+
{/* CARD 1: University Focus */}
|
| 411 |
+
<div className="bg-white rounded-2xl shadow-sm border border-gray-200 overflow-hidden h-full">
|
| 412 |
+
<div className="bg-indigo-50 p-6 border-b border-indigo-100 flex items-center gap-3">
|
| 413 |
+
<div className="bg-white p-2 rounded-lg shadow-sm">
|
| 414 |
+
<Layout className="h-6 w-6 text-indigo-600" />
|
| 415 |
+
</div>
|
| 416 |
+
<div>
|
| 417 |
+
<h3 className="font-bold text-lg text-indigo-900">University Focus</h3>
|
| 418 |
+
<p className="text-indigo-600 text-sm">Core Academic Theory</p>
|
| 419 |
+
</div>
|
| 420 |
+
</div>
|
| 421 |
+
<div className="p-6">
|
| 422 |
+
<ul className="space-y-4">
|
| 423 |
+
{currentRoadmap.universityFocus.map((item, index) => (
|
| 424 |
+
<li key={index} className="flex items-start gap-3">
|
| 425 |
+
<span className="shrink-0 flex h-6 w-6 items-center justify-center rounded-full bg-indigo-100 text-indigo-600 text-xs font-bold mt-0.5">
|
| 426 |
+
{index + 1}
|
| 427 |
+
</span>
|
| 428 |
+
<span className="text-gray-700 font-medium leading-snug">{item}</span>
|
| 429 |
+
</li>
|
| 430 |
+
))}
|
| 431 |
+
</ul>
|
| 432 |
+
</div>
|
| 433 |
+
</div>
|
| 434 |
+
|
| 435 |
+
{/* CARD 2: External Skills (Job Ready) */}
|
| 436 |
+
<div className="bg-white rounded-2xl shadow-sm border border-gray-200 overflow-hidden ring-1 ring-green-100 h-full">
|
| 437 |
+
<div className="bg-green-50 p-6 border-b border-green-100 flex items-center gap-3">
|
| 438 |
+
<div className="bg-white p-2 rounded-lg shadow-sm">
|
| 439 |
+
<TrendingUp className="h-6 w-6 text-green-600" />
|
| 440 |
+
</div>
|
| 441 |
+
<div>
|
| 442 |
+
<h3 className="font-bold text-lg text-green-900">Industry Skills</h3>
|
| 443 |
+
<p className="text-green-700 text-sm">Self-Learning Required</p>
|
| 444 |
+
</div>
|
| 445 |
+
</div>
|
| 446 |
+
<div className="p-6">
|
| 447 |
+
<ul className="space-y-5">
|
| 448 |
+
{currentRoadmap.externalSkills.map((skill, index) => (
|
| 449 |
+
<li key={index} className="group">
|
| 450 |
+
<div className="flex items-center gap-2 mb-1">
|
| 451 |
+
<ShieldCheck className="h-4 w-4 text-green-600" />
|
| 452 |
+
<span className="font-bold text-gray-900">{skill.name}</span>
|
| 453 |
+
</div>
|
| 454 |
+
<p className="text-gray-500 text-sm pl-6 leading-snug">{skill.detail}</p>
|
| 455 |
+
</li>
|
| 456 |
+
))}
|
| 457 |
+
</ul>
|
| 458 |
+
</div>
|
| 459 |
+
</div>
|
| 460 |
+
|
| 461 |
+
</div>
|
| 462 |
+
|
| 463 |
+
{/* Pro Tip Footer */}
|
| 464 |
+
<div className="mt-10 bg-gray-900 text-white rounded-2xl p-8 shadow-xl">
|
| 465 |
+
<h3 className="text-lg font-bold mb-2 flex items-center gap-2">
|
| 466 |
+
<GraduationCap className="h-5 w-5 text-yellow-400" />
|
| 467 |
+
Expert Advice
|
| 468 |
+
</h3>
|
| 469 |
+
<p className="opacity-90 leading-relaxed text-sm md:text-base">
|
| 470 |
+
A degree gets you the interview, but <strong>skills get you the job</strong>.
|
| 471 |
+
{selectedField === 'cs' && " Build a GitHub portfolio."}
|
| 472 |
+
{selectedField === 'design' && " Your Behance portfolio matters more than your GPA."}
|
| 473 |
+
{selectedField === 'medical' && " Clinical experience is just as vital as USMLE scores."}
|
| 474 |
+
{selectedField === 'law' && " Networking and internships are key in the legal world."}
|
| 475 |
+
</p>
|
| 476 |
+
</div>
|
| 477 |
+
|
| 478 |
+
</div>
|
| 479 |
+
</main>
|
| 480 |
+
</div>
|
| 481 |
+
);
|
| 482 |
+
}
|
next/src/app/dashboard/university/[id]/page.tsx
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { createClient } from '@supabase/supabase-js';
|
| 2 |
+
import Groq from 'groq-sdk';
|
| 3 |
+
import Link from 'next/link';
|
| 4 |
+
import { notFound } from 'next/navigation';
|
| 5 |
+
import { Suspense } from 'react';
|
| 6 |
+
|
| 7 |
+
// --- CONFIGURATION ---
|
| 8 |
+
const supabase = createClient(
|
| 9 |
+
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
| 10 |
+
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
|
| 11 |
+
);
|
| 12 |
+
|
| 13 |
+
const groq = new Groq({
|
| 14 |
+
apiKey: process.env.GROQ_API_KEY
|
| 15 |
+
});
|
| 16 |
+
|
| 17 |
+
// --- COMPONENT: The AI Analysis (With "Top Programs" Restored) ---
|
| 18 |
+
async function AIAnalysisSection({ uniName, country }: { uniName: string, country: string }) {
|
| 19 |
+
try {
|
| 20 |
+
// 1. Ask AI for specific details about THIS university
|
| 21 |
+
const chatCompletion = await groq.chat.completions.create({
|
| 22 |
+
messages: [{
|
| 23 |
+
role: 'user',
|
| 24 |
+
content: `Analyze "${uniName}" in "${country}".
|
| 25 |
+
Return valid JSON ONLY with these fields:
|
| 26 |
+
{
|
| 27 |
+
"admission_criteria": "Summarize requirements in one simple text string.",
|
| 28 |
+
"popular_programs": ["Program 1", "Program 2", "Program 3", "Program 4"],
|
| 29 |
+
"pros": ["Point 1", "Point 2"],
|
| 30 |
+
"cons": ["Point 1", "Point 2"]
|
| 31 |
+
}`
|
| 32 |
+
}],
|
| 33 |
+
model: 'llama-3.1-8b-instant',
|
| 34 |
+
response_format: { type: 'json_object' },
|
| 35 |
+
});
|
| 36 |
+
|
| 37 |
+
// 2. Parse the response safely
|
| 38 |
+
const content = chatCompletion.choices[0]?.message?.content || '{}';
|
| 39 |
+
let aiData;
|
| 40 |
+
try {
|
| 41 |
+
aiData = JSON.parse(content);
|
| 42 |
+
} catch (e) {
|
| 43 |
+
aiData = {};
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
// 🛡️ CRASH FIX: Ensure admission_criteria is ALWAYS a string
|
| 47 |
+
let safeCriteria = "Check official website for specific details.";
|
| 48 |
+
if (aiData.admission_criteria) {
|
| 49 |
+
if (typeof aiData.admission_criteria === 'string') {
|
| 50 |
+
safeCriteria = aiData.admission_criteria;
|
| 51 |
+
} else if (typeof aiData.admission_criteria === 'object') {
|
| 52 |
+
// If AI returns an object, join it into text
|
| 53 |
+
safeCriteria = Object.values(aiData.admission_criteria).join(". ");
|
| 54 |
+
}
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
// 🛡️ SAFETY: Ensure arrays exist for lists
|
| 58 |
+
const safePrograms = Array.isArray(aiData.popular_programs) ? aiData.popular_programs : ["General Sciences", "Arts", "Engineering"];
|
| 59 |
+
const safePros = Array.isArray(aiData.pros) ? aiData.pros : ["Strong academic reputation"];
|
| 60 |
+
const safeCons = Array.isArray(aiData.cons) ? aiData.cons : ["Competitive entry"];
|
| 61 |
+
|
| 62 |
+
return (
|
| 63 |
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 animate-in fade-in duration-700">
|
| 64 |
+
|
| 65 |
+
{/* 1. ADMISSION CRITERIA (Blue Card) */}
|
| 66 |
+
<div className="bg-white rounded-2xl p-8 shadow-sm border border-gray-100">
|
| 67 |
+
<h2 className="text-xl font-bold text-gray-800 mb-4">🎓 Admission Requirements</h2>
|
| 68 |
+
<div className="bg-blue-50 border-l-4 border-blue-500 p-4 rounded-r-lg">
|
| 69 |
+
<p className="text-blue-900 font-medium text-lg leading-relaxed">{safeCriteria}</p>
|
| 70 |
+
</div>
|
| 71 |
+
</div>
|
| 72 |
+
|
| 73 |
+
{/* 2. POPULAR PROGRAMS (Orange Card - NEW) */}
|
| 74 |
+
<div className="bg-white rounded-2xl p-8 shadow-sm border border-gray-100">
|
| 75 |
+
<h2 className="text-xl font-bold text-gray-800 mb-4">🔥 Top Programs</h2>
|
| 76 |
+
<div className="flex flex-wrap gap-2">
|
| 77 |
+
{safePrograms.map((prog: any, i: number) => (
|
| 78 |
+
<span key={i} className="bg-orange-50 text-orange-700 px-3 py-1 rounded-full text-sm font-semibold border border-orange-200">
|
| 79 |
+
{typeof prog === 'string' ? prog : "General Degree"}
|
| 80 |
+
</span>
|
| 81 |
+
))}
|
| 82 |
+
</div>
|
| 83 |
+
</div>
|
| 84 |
+
|
| 85 |
+
{/* 3. PROS (Green Card) */}
|
| 86 |
+
<div className="bg-white rounded-2xl p-6 shadow-sm border border-gray-100">
|
| 87 |
+
<h3 className="text-green-700 font-bold mb-4">✅ Why Study Here?</h3>
|
| 88 |
+
<ul className="space-y-3">
|
| 89 |
+
{safePros.map((pro: any, i: number) => (
|
| 90 |
+
<li key={i} className="flex items-start gap-2 text-gray-600 text-sm">
|
| 91 |
+
<span className="text-green-500 mt-1">●</span>
|
| 92 |
+
{typeof pro === 'string' ? pro : JSON.stringify(pro)}
|
| 93 |
+
</li>
|
| 94 |
+
))}
|
| 95 |
+
</ul>
|
| 96 |
+
</div>
|
| 97 |
+
|
| 98 |
+
{/* 4. CONS (Red Card) */}
|
| 99 |
+
<div className="bg-white rounded-2xl p-6 shadow-sm border border-gray-100">
|
| 100 |
+
<h3 className="text-red-600 font-bold mb-4">⚠️ Considerations</h3>
|
| 101 |
+
<ul className="space-y-3">
|
| 102 |
+
{safeCons.map((con: any, i: number) => (
|
| 103 |
+
<li key={i} className="flex items-start gap-2 text-gray-600 text-sm">
|
| 104 |
+
<span className="text-red-400 mt-1">●</span>
|
| 105 |
+
{typeof con === 'string' ? con : JSON.stringify(con)}
|
| 106 |
+
</li>
|
| 107 |
+
))}
|
| 108 |
+
</ul>
|
| 109 |
+
</div>
|
| 110 |
+
</div>
|
| 111 |
+
);
|
| 112 |
+
} catch (err) {
|
| 113 |
+
console.error("AI Error:", err);
|
| 114 |
+
return (
|
| 115 |
+
<div className="p-6 bg-red-50 text-red-600 rounded-lg border border-red-100">
|
| 116 |
+
<p><strong>AI Analysis Unavailable:</strong> We couldn't generate the report right now.</p>
|
| 117 |
+
</div>
|
| 118 |
+
);
|
| 119 |
+
}
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
// --- SKELETON: What to show while AI is thinking ---
|
| 123 |
+
function AISkeleton() {
|
| 124 |
+
return (
|
| 125 |
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 animate-pulse">
|
| 126 |
+
<div className="md:col-span-1 h-48 bg-gray-200 rounded-2xl"></div>
|
| 127 |
+
<div className="md:col-span-1 h-48 bg-gray-200 rounded-2xl"></div>
|
| 128 |
+
<div className="h-48 bg-gray-200 rounded-2xl"></div>
|
| 129 |
+
<div className="h-48 bg-gray-200 rounded-2xl"></div>
|
| 130 |
+
</div>
|
| 131 |
+
);
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
// --- MAIN PAGE ---
|
| 135 |
+
export default async function UniversityDetailsPage({ params }: { params: Promise<{ id: string }> }) {
|
| 136 |
+
const { id } = await params;
|
| 137 |
+
|
| 138 |
+
// 1. Fetch Main University Data
|
| 139 |
+
const { data: uni, error } = await supabase
|
| 140 |
+
.from('universities')
|
| 141 |
+
.select('*')
|
| 142 |
+
.eq('id', id)
|
| 143 |
+
.single();
|
| 144 |
+
|
| 145 |
+
if (error || !uni) notFound();
|
| 146 |
+
|
| 147 |
+
// 2. Fetch 3 Similar Universities (Same Country, Different ID)
|
| 148 |
+
const { data: similarUnis } = await supabase
|
| 149 |
+
.from('universities')
|
| 150 |
+
.select('id, university_name, rank, country, avg_tuition_usd')
|
| 151 |
+
.eq('country', uni.country) // Same Country
|
| 152 |
+
.neq('id', uni.id) // Not the current one
|
| 153 |
+
.limit(3); // Get 3
|
| 154 |
+
|
| 155 |
+
// Format Fee Helper
|
| 156 |
+
const formatFee = (amount: number) =>
|
| 157 |
+
new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }).format(amount);
|
| 158 |
+
|
| 159 |
+
const formattedTuition = uni.avg_tuition_usd ? formatFee(uni.avg_tuition_usd) : "Contact Uni";
|
| 160 |
+
|
| 161 |
+
return (
|
| 162 |
+
<div className="min-h-screen bg-gray-50 p-6 md:p-12">
|
| 163 |
+
<div className="max-w-5xl mx-auto space-y-8">
|
| 164 |
+
|
| 165 |
+
{/* BACK BUTTON */}
|
| 166 |
+
<Link href="/dashboard/university" className="inline-flex items-center text-gray-500 hover:text-blue-600 transition-colors font-medium">
|
| 167 |
+
← Back to List
|
| 168 |
+
</Link>
|
| 169 |
+
|
| 170 |
+
{/* HEADER */}
|
| 171 |
+
<div className="bg-white rounded-2xl p-8 shadow-sm border border-gray-100 flex flex-col md:flex-row justify-between items-center gap-6">
|
| 172 |
+
<div>
|
| 173 |
+
<div className="flex items-center gap-3 mb-2">
|
| 174 |
+
<span className="bg-blue-100 text-blue-700 text-xs font-bold px-3 py-1 rounded-full uppercase">{uni.country}</span>
|
| 175 |
+
<span className="text-gray-400 text-sm font-medium">Rank #{uni.rank}</span>
|
| 176 |
+
</div>
|
| 177 |
+
<h1 className="text-4xl font-extrabold text-gray-900">{uni.university_name}</h1>
|
| 178 |
+
<p className="text-gray-500 mt-2">Annual Fee: <span className="text-green-600 font-bold">{formattedTuition}</span></p>
|
| 179 |
+
</div>
|
| 180 |
+
<Link href={`https://www.google.com/search?q=apply+to+${uni.university_name}`} target="_blank" className="bg-blue-600 text-white px-8 py-3 rounded-xl font-bold shadow-lg hover:bg-blue-700 transition-transform hover:-translate-y-1">
|
| 181 |
+
Apply Now ↗
|
| 182 |
+
</Link>
|
| 183 |
+
</div>
|
| 184 |
+
|
| 185 |
+
{/* AI SECTION (Wrapped in Suspense) */}
|
| 186 |
+
<Suspense fallback={<AISkeleton />}>
|
| 187 |
+
<AIAnalysisSection uniName={uni.university_name} country={uni.country} />
|
| 188 |
+
</Suspense>
|
| 189 |
+
|
| 190 |
+
{/* SIMILAR UNIVERSITIES SECTION */}
|
| 191 |
+
{similarUnis && similarUnis.length > 0 && (
|
| 192 |
+
<div className="pt-12 border-t border-gray-200 mt-8">
|
| 193 |
+
<h3 className="text-2xl font-bold text-gray-900 mb-6">Explore other universities in {uni.country}</h3>
|
| 194 |
+
|
| 195 |
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
|
| 196 |
+
{similarUnis.map((sim) => (
|
| 197 |
+
<Link key={sim.id} href={`/dashboard/university/${sim.id}`} className="group block bg-white rounded-xl p-6 border border-gray-200 hover:border-blue-400 hover:shadow-md transition-all">
|
| 198 |
+
<div className="flex justify-between items-start mb-4">
|
| 199 |
+
<span className="bg-gray-100 text-gray-600 text-xs font-bold px-2 py-1 rounded">Rank #{sim.rank}</span>
|
| 200 |
+
</div>
|
| 201 |
+
<h4 className="text-lg font-bold text-gray-900 group-hover:text-blue-600 transition-colors truncate">{sim.university_name}</h4>
|
| 202 |
+
<p className="text-sm text-gray-500 mt-2">
|
| 203 |
+
Est. Fee: <span className="font-semibold text-green-600">{sim.avg_tuition_usd ? formatFee(sim.avg_tuition_usd) : "N/A"}</span>
|
| 204 |
+
</p>
|
| 205 |
+
</Link>
|
| 206 |
+
))}
|
| 207 |
+
</div>
|
| 208 |
+
</div>
|
| 209 |
+
)}
|
| 210 |
+
|
| 211 |
+
</div>
|
| 212 |
+
</div>
|
| 213 |
+
);
|
| 214 |
+
}
|
next/src/app/dashboard/university/page.tsx
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { createClient } from '@supabase/supabase-js';
|
| 2 |
+
import Link from 'next/link';
|
| 3 |
+
import UniversityFilters from '@/components/CountryFilter';
|
| 4 |
+
|
| 5 |
+
const supabase = createClient(
|
| 6 |
+
process.env.NEXT_PUBLIC_SUPABASE_URL!,
|
| 7 |
+
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
|
| 8 |
+
);
|
| 9 |
+
|
| 10 |
+
// ✅ 1. Paginated Country Fetcher (This fixes the dropdown limit)
|
| 11 |
+
async function getCountries() {
|
| 12 |
+
let allCountries: any[] = [];
|
| 13 |
+
let from = 0;
|
| 14 |
+
const pageSize = 1000;
|
| 15 |
+
let keepFetching = true;
|
| 16 |
+
|
| 17 |
+
while (keepFetching) {
|
| 18 |
+
const { data, error } = await supabase
|
| 19 |
+
.from('universities')
|
| 20 |
+
.select('country')
|
| 21 |
+
.not('country', 'is', null)
|
| 22 |
+
.order('country', { ascending: true })
|
| 23 |
+
.range(from, from + pageSize - 1);
|
| 24 |
+
|
| 25 |
+
if (error || !data || data.length === 0) {
|
| 26 |
+
keepFetching = false;
|
| 27 |
+
} else {
|
| 28 |
+
allCountries = [...allCountries, ...data];
|
| 29 |
+
from += pageSize;
|
| 30 |
+
if (data.length < pageSize) keepFetching = false;
|
| 31 |
+
}
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
return Array.from(new Set(allCountries.map(item => item.country)));
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
async function getUniversities(country: string | undefined, search: string | undefined) {
|
| 38 |
+
let query = supabase
|
| 39 |
+
.from('universities')
|
| 40 |
+
.select('*') // This fetches 'avg_tuition_usd' so we can show it
|
| 41 |
+
.order('rank', { ascending: true, nullsFirst: false })
|
| 42 |
+
.order('university_name', { ascending: true });
|
| 43 |
+
|
| 44 |
+
if (country && country !== "all") query = query.eq('country', country);
|
| 45 |
+
if (search) query = query.ilike('university_name', `%${search}%`);
|
| 46 |
+
if (!country && !search) query = query.limit(100);
|
| 47 |
+
|
| 48 |
+
const { data, error } = await query;
|
| 49 |
+
if (error) return [];
|
| 50 |
+
return data;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
export default async function UniversityListPage({
|
| 54 |
+
searchParams,
|
| 55 |
+
}: {
|
| 56 |
+
searchParams: Promise<{ country?: string; search?: string }>;
|
| 57 |
+
}) {
|
| 58 |
+
const params = await searchParams;
|
| 59 |
+
const selectedCountry = params.country;
|
| 60 |
+
const searchText = params.search;
|
| 61 |
+
|
| 62 |
+
const [universities, countries] = await Promise.all([
|
| 63 |
+
getUniversities(selectedCountry, searchText),
|
| 64 |
+
getCountries()
|
| 65 |
+
]);
|
| 66 |
+
|
| 67 |
+
// ✅ Helper to format currency nicely (e.g. 1500 -> $1,500)
|
| 68 |
+
const formatCurrency = (amount: number | null) => {
|
| 69 |
+
if (!amount) return "N/A";
|
| 70 |
+
return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }).format(amount);
|
| 71 |
+
};
|
| 72 |
+
|
| 73 |
+
return (
|
| 74 |
+
<div className="p-6 md:p-10 max-w-7xl mx-auto">
|
| 75 |
+
<div className="mb-8">
|
| 76 |
+
<h1 className="text-3xl md:text-4xl font-bold mb-2 text-blue-900">Find Your University</h1>
|
| 77 |
+
<p className="text-gray-600">Compare rankings, tuition, and admissions across 1,800+ institutions.</p>
|
| 78 |
+
</div>
|
| 79 |
+
|
| 80 |
+
<UniversityFilters countries={countries} />
|
| 81 |
+
|
| 82 |
+
<div className="overflow-hidden border border-gray-200 shadow-xl rounded-xl bg-white">
|
| 83 |
+
{universities?.length === 0 ? (
|
| 84 |
+
<div className="text-center py-16 px-6">
|
| 85 |
+
<h3 className="text-xl font-bold text-gray-800 mb-2">No universities found</h3>
|
| 86 |
+
<Link href="/dashboard/university" className="text-blue-600 hover:underline">Clear Filters</Link>
|
| 87 |
+
</div>
|
| 88 |
+
) : (
|
| 89 |
+
<table className="min-w-full">
|
| 90 |
+
<thead className="bg-blue-600 text-white">
|
| 91 |
+
<tr>
|
| 92 |
+
<th className="py-4 px-6 text-left hidden md:table-cell">Rank</th>
|
| 93 |
+
<th className="py-4 px-6 text-left">University</th>
|
| 94 |
+
{/* 👇 NEW COLUMN: This is what you were missing! */}
|
| 95 |
+
<th className="py-4 px-6 text-left">Est. Annual Fee</th>
|
| 96 |
+
<th className="py-4 px-6 text-left hidden sm:table-cell">Location</th>
|
| 97 |
+
<th className="py-4 px-6 text-left">Action</th>
|
| 98 |
+
</tr>
|
| 99 |
+
</thead>
|
| 100 |
+
<tbody className="divide-y divide-gray-100">
|
| 101 |
+
{universities?.map((uni) => (
|
| 102 |
+
<tr key={uni.id} className="hover:bg-blue-50 transition-colors">
|
| 103 |
+
|
| 104 |
+
{/* RANK */}
|
| 105 |
+
<td className="py-4 px-6 font-bold text-blue-600 hidden md:table-cell">
|
| 106 |
+
{uni.rank === "Unranked" ? <span className="text-gray-400 text-xs">N/A</span> : `#${uni.rank}`}
|
| 107 |
+
</td>
|
| 108 |
+
|
| 109 |
+
{/* UNIVERSITY NAME */}
|
| 110 |
+
<td className="py-4 px-6 font-medium text-gray-900">
|
| 111 |
+
<div className="flex flex-col">
|
| 112 |
+
<span className="text-base">{uni.university_name}</span>
|
| 113 |
+
<span className="md:hidden text-xs text-gray-500">{uni.country}</span>
|
| 114 |
+
</div>
|
| 115 |
+
</td>
|
| 116 |
+
|
| 117 |
+
{/* 👇 NEW FEE DATA: Shows the price nicely formatted */}
|
| 118 |
+
<td className="py-4 px-6">
|
| 119 |
+
<div className="flex flex-col">
|
| 120 |
+
<span className="font-bold text-green-700 text-base">
|
| 121 |
+
{formatCurrency(uni.avg_tuition_usd)}
|
| 122 |
+
</span>
|
| 123 |
+
{uni.avg_tuition_usd && (
|
| 124 |
+
<span className="text-[10px] uppercase tracking-wide text-gray-400 font-semibold">
|
| 125 |
+
Starting from
|
| 126 |
+
</span>
|
| 127 |
+
)}
|
| 128 |
+
</div>
|
| 129 |
+
</td>
|
| 130 |
+
|
| 131 |
+
{/* LOCATION */}
|
| 132 |
+
<td className="py-4 px-6 text-gray-600 hidden sm:table-cell">{uni.country}</td>
|
| 133 |
+
|
| 134 |
+
{/* ACTION */}
|
| 135 |
+
<td className="py-4 px-6">
|
| 136 |
+
<Link
|
| 137 |
+
href={`/dashboard/university/${uni.id}`}
|
| 138 |
+
className="px-4 py-2 bg-blue-100 text-blue-700 rounded-md hover:bg-blue-200 text-sm font-bold"
|
| 139 |
+
>
|
| 140 |
+
View
|
| 141 |
+
</Link>
|
| 142 |
+
</td>
|
| 143 |
+
</tr>
|
| 144 |
+
))}
|
| 145 |
+
</tbody>
|
| 146 |
+
</table>
|
| 147 |
+
)}
|
| 148 |
+
</div>
|
| 149 |
+
</div>
|
| 150 |
+
);
|
| 151 |
+
}
|
next/src/app/favicon.ico
ADDED
|
|
next/src/app/features/page.tsx
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
|
| 2 |
+
import { Badge } from "@/components/ui/badge"
|
| 3 |
+
import {
|
| 4 |
+
Users,
|
| 5 |
+
FileText,
|
| 6 |
+
Clock,
|
| 7 |
+
Shield,
|
| 8 |
+
Zap,
|
| 9 |
+
Bell,
|
| 10 |
+
Award,
|
| 11 |
+
BrainCircuit,
|
| 12 |
+
GraduationCap,
|
| 13 |
+
Map,
|
| 14 |
+
MessageSquare,
|
| 15 |
+
Search,
|
| 16 |
+
} from "lucide-react"
|
| 17 |
+
import { Navbar } from "@/components/navbar"
|
| 18 |
+
import { Footer } from "@/components/footer"
|
| 19 |
+
|
| 20 |
+
const features = [
|
| 21 |
+
{
|
| 22 |
+
icon: BrainCircuit,
|
| 23 |
+
title: "AI Interest Discovery",
|
| 24 |
+
description:
|
| 25 |
+
"Our core feature uses advanced psychometric testing and Machine Learning to create a unique profile vector, identifying your hidden talents and interests.",
|
| 26 |
+
category: "Recommendation Engine",
|
| 27 |
+
},
|
| 28 |
+
{
|
| 29 |
+
icon: Map,
|
| 30 |
+
title: "4-Year Career Roadmap",
|
| 31 |
+
description:
|
| 32 |
+
"Generates a year-by-year timeline suggesting major subjects, projects, internships, and certifications tailored to your chosen career path.",
|
| 33 |
+
category: "Guidance",
|
| 34 |
+
},
|
| 35 |
+
{
|
| 36 |
+
icon: Search,
|
| 37 |
+
title: "University Finder",
|
| 38 |
+
description:
|
| 39 |
+
"A centralized database allowing you to search and compare universities based on admission criteria, fee structures, and location.",
|
| 40 |
+
category: "Data Management",
|
| 41 |
+
},
|
| 42 |
+
{
|
| 43 |
+
icon: MessageSquare,
|
| 44 |
+
title: "Virtual Assistant",
|
| 45 |
+
description:
|
| 46 |
+
"An always-available NLP chatbot that answers career-related questions, explains complex field differences, and guides you through the platform.",
|
| 47 |
+
category: "Support",
|
| 48 |
+
},
|
| 49 |
+
{
|
| 50 |
+
icon: FileText, // Reusing FileText for "Market Trends" as BarChart was removed from imports to keep it clean, or add BarChart back if needed
|
| 51 |
+
title: "Market Trends Analysis",
|
| 52 |
+
description:
|
| 53 |
+
"Real-time visualization of local and global market demands, average salaries, and future growth scope for recommended careers.",
|
| 54 |
+
category: "Analytics",
|
| 55 |
+
},
|
| 56 |
+
{
|
| 57 |
+
icon: Shield,
|
| 58 |
+
title: "Secure Profile Management",
|
| 59 |
+
description:
|
| 60 |
+
"Enterprise-grade security ensures your psychometric data and personal profile are encrypted and protected from unauthorized access.",
|
| 61 |
+
category: "Security",
|
| 62 |
+
},
|
| 63 |
+
{
|
| 64 |
+
icon: GraduationCap,
|
| 65 |
+
title: "Degree Program Matching",
|
| 66 |
+
description:
|
| 67 |
+
"Automatically matches your interest profile with specific degree programs offered by top universities, ranked by compatibility score.",
|
| 68 |
+
category: "Recommendation Engine",
|
| 69 |
+
},
|
| 70 |
+
{
|
| 71 |
+
icon: FileText,
|
| 72 |
+
title: "Downloadable Reports",
|
| 73 |
+
description:
|
| 74 |
+
"Export your full career profile and 4-year roadmap as a professional PDF document for offline reference or printing.",
|
| 75 |
+
category: "Reporting",
|
| 76 |
+
},
|
| 77 |
+
{
|
| 78 |
+
icon: Bell,
|
| 79 |
+
title: "Deadline Reminders",
|
| 80 |
+
description:
|
| 81 |
+
"Smart notifications alert you about upcoming internship windows, admission deadlines, and critical roadmap milestones.",
|
| 82 |
+
category: "Communication",
|
| 83 |
+
},
|
| 84 |
+
{
|
| 85 |
+
icon: Zap,
|
| 86 |
+
title: "Instant Results",
|
| 87 |
+
description:
|
| 88 |
+
"Receive your personalized career recommendations and university matches within 5 seconds of completing the assessment.",
|
| 89 |
+
category: "Performance",
|
| 90 |
+
},
|
| 91 |
+
{
|
| 92 |
+
icon: Users,
|
| 93 |
+
title: "Supervisor & Admin Portal",
|
| 94 |
+
description:
|
| 95 |
+
"Dedicated interfaces for administrators to verify university data, update market trends, and retrain the AI model.",
|
| 96 |
+
category: "Administration",
|
| 97 |
+
},
|
| 98 |
+
{
|
| 99 |
+
icon: Award,
|
| 100 |
+
title: "Confidence Scoring",
|
| 101 |
+
description:
|
| 102 |
+
"Every recommendation comes with an AI confidence score, ensuring you know exactly how strong the match is before making a decision.",
|
| 103 |
+
category: "Recommendation Engine",
|
| 104 |
+
},
|
| 105 |
+
]
|
| 106 |
+
|
| 107 |
+
export default function FeaturesPage() {
|
| 108 |
+
return (
|
| 109 |
+
<div className="flex min-h-screen flex-col">
|
| 110 |
+
<Navbar />
|
| 111 |
+
{/* Hero Section */}
|
| 112 |
+
<section className="border-b bg-linear-to-b from-indigo-50 to-background py-20">
|
| 113 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 114 |
+
<div className="mx-auto max-w-3xl text-center">
|
| 115 |
+
<Badge className="mb-4 bg-indigo-100 text-indigo-600 hover:bg-indigo-100">AI-Powered Guidance</Badge>
|
| 116 |
+
<h1 className="mb-6 text-balance text-4xl font-bold tracking-tight sm:text-5xl">
|
| 117 |
+
Everything You Need to Find
|
| 118 |
+
<span className="text-indigo-600"> Your Perfect Career</span>
|
| 119 |
+
</h1>
|
| 120 |
+
<p className="text-pretty text-lg text-muted-foreground leading-relaxed">
|
| 121 |
+
From discovering your hidden interests to mapping out your entire 4-year degree journey, Edu Path AI provides the tools you need to succeed.
|
| 122 |
+
</p>
|
| 123 |
+
</div>
|
| 124 |
+
</div>
|
| 125 |
+
</section>
|
| 126 |
+
|
| 127 |
+
{/* Features Grid */}
|
| 128 |
+
<section className="py-20">
|
| 129 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 130 |
+
<div className="grid gap-8 md:grid-cols-2 lg:grid-cols-3">
|
| 131 |
+
{features.map((feature, index) => (
|
| 132 |
+
<Card key={index} className="transition-all hover:shadow-lg">
|
| 133 |
+
<CardHeader>
|
| 134 |
+
<div className="mb-4 flex h-12 w-12 items-center justify-center rounded-lg bg-indigo-100">
|
| 135 |
+
<feature.icon className="h-6 w-6 text-indigo-600" />
|
| 136 |
+
</div>
|
| 137 |
+
<Badge variant="outline" className="mb-2 w-fit text-xs">
|
| 138 |
+
{feature.category}
|
| 139 |
+
</Badge>
|
| 140 |
+
<CardTitle className="text-xl">{feature.title}</CardTitle>
|
| 141 |
+
</CardHeader>
|
| 142 |
+
<CardContent>
|
| 143 |
+
<CardDescription className="text-base leading-relaxed">{feature.description}</CardDescription>
|
| 144 |
+
</CardContent>
|
| 145 |
+
</Card>
|
| 146 |
+
))}
|
| 147 |
+
</div>
|
| 148 |
+
</div>
|
| 149 |
+
</section>
|
| 150 |
+
|
| 151 |
+
{/* Benefits Section */}
|
| 152 |
+
<section className="border-t bg-muted/50 py-20">
|
| 153 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 154 |
+
<div className="mx-auto max-w-3xl text-center">
|
| 155 |
+
<h2 className="mb-4 text-balance text-3xl font-bold tracking-tight">Built for Student Success</h2>
|
| 156 |
+
<p className="mb-12 text-pretty text-muted-foreground leading-relaxed">
|
| 157 |
+
Our platform is designed to eliminate confusion and help you make data-driven decisions about your future.
|
| 158 |
+
</p>
|
| 159 |
+
</div>
|
| 160 |
+
|
| 161 |
+
<div className="grid gap-8 md:grid-cols-3">
|
| 162 |
+
<Card>
|
| 163 |
+
<CardHeader>
|
| 164 |
+
<CardTitle className="flex items-center gap-2 text-indigo-600">
|
| 165 |
+
<Clock className="h-5 w-5" />
|
| 166 |
+
Save Time
|
| 167 |
+
</CardTitle>
|
| 168 |
+
</CardHeader>
|
| 169 |
+
<CardContent>
|
| 170 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 171 |
+
Stop spending weeks researching different universities. Get all the data you need in one place, instantly.
|
| 172 |
+
</p>
|
| 173 |
+
</CardContent>
|
| 174 |
+
</Card>
|
| 175 |
+
|
| 176 |
+
<Card>
|
| 177 |
+
<CardHeader>
|
| 178 |
+
<CardTitle className="flex items-center gap-2 text-indigo-600">
|
| 179 |
+
<Shield className="h-5 w-5" />
|
| 180 |
+
Reduce Risk
|
| 181 |
+
</CardTitle>
|
| 182 |
+
</CardHeader>
|
| 183 |
+
<CardContent>
|
| 184 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 185 |
+
Avoid choosing the wrong field due to pressure. Our AI ensures your choice aligns with your actual aptitude.
|
| 186 |
+
</p>
|
| 187 |
+
</CardContent>
|
| 188 |
+
</Card>
|
| 189 |
+
|
| 190 |
+
<Card>
|
| 191 |
+
<CardHeader>
|
| 192 |
+
<CardTitle className="flex items-center gap-2 text-indigo-600">
|
| 193 |
+
<Zap className="h-5 w-5" />
|
| 194 |
+
Stay Focused
|
| 195 |
+
</CardTitle>
|
| 196 |
+
</CardHeader>
|
| 197 |
+
<CardContent>
|
| 198 |
+
<p className="text-muted-foreground leading-relaxed">
|
| 199 |
+
With a clear 4-year roadmap, you'll always know what skills or internships to pursue next.
|
| 200 |
+
</p>
|
| 201 |
+
</CardContent>
|
| 202 |
+
</Card>
|
| 203 |
+
</div>
|
| 204 |
+
</div>
|
| 205 |
+
</section>
|
| 206 |
+
|
| 207 |
+
{/* CTA Section */}
|
| 208 |
+
<section className="py-20">
|
| 209 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 210 |
+
<Card className="border-indigo-200 bg-linear-to-br from-indigo-50 to-background">
|
| 211 |
+
<CardHeader className="text-center">
|
| 212 |
+
<CardTitle className="text-3xl">Ready to Find Your Path?</CardTitle>
|
| 213 |
+
<CardDescription className="text-base">
|
| 214 |
+
Join students who are taking control of their future with Edu Path AI.
|
| 215 |
+
</CardDescription>
|
| 216 |
+
</CardHeader>
|
| 217 |
+
<CardContent className="flex flex-col items-center gap-4 sm:flex-row sm:justify-center">
|
| 218 |
+
<a
|
| 219 |
+
href="/login"
|
| 220 |
+
className="inline-flex h-11 items-center justify-center rounded-md bg-indigo-600 px-8 text-sm font-medium text-white shadow transition-colors hover:bg-indigo-700 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-600"
|
| 221 |
+
>
|
| 222 |
+
Start Free Assessment
|
| 223 |
+
</a>
|
| 224 |
+
<a
|
| 225 |
+
href="/about"
|
| 226 |
+
className="inline-flex h-11 items-center justify-center rounded-md border border-input bg-background px-8 text-sm font-medium shadow-sm transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
| 227 |
+
>
|
| 228 |
+
Learn More
|
| 229 |
+
</a>
|
| 230 |
+
</CardContent>
|
| 231 |
+
</Card>
|
| 232 |
+
</div>
|
| 233 |
+
</section>
|
| 234 |
+
<Footer />
|
| 235 |
+
</div>
|
| 236 |
+
)
|
| 237 |
+
}
|
next/src/app/globals.css
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
@import "tailwindcss";
|
| 2 |
+
@import "tw-animate-css";
|
| 3 |
+
|
| 4 |
+
@custom-variant dark (&:is(.dark *));
|
| 5 |
+
|
| 6 |
+
:root {
|
| 7 |
+
--background: oklch(1 0 0);
|
| 8 |
+
--foreground: oklch(0.145 0 0);
|
| 9 |
+
--card: oklch(1 0 0);
|
| 10 |
+
--card-foreground: oklch(0.145 0 0);
|
| 11 |
+
--popover: oklch(1 0 0);
|
| 12 |
+
--popover-foreground: oklch(0.145 0 0);
|
| 13 |
+
/* Updated to indigo-600 theme color */
|
| 14 |
+
--primary: oklch(0.506 0.133 265.754); /* indigo-600 */
|
| 15 |
+
--primary-foreground: oklch(1 0 0);
|
| 16 |
+
--secondary: oklch(0.961 0.014 265.754); /* indigo-50 */
|
| 17 |
+
--secondary-foreground: oklch(0.145 0 0);
|
| 18 |
+
--muted: oklch(0.97 0 0);
|
| 19 |
+
--muted-foreground: oklch(0.556 0 0);
|
| 20 |
+
--accent: oklch(0.725 0.09 265.754); /* indigo-400 */
|
| 21 |
+
--accent-foreground: oklch(1 0 0);
|
| 22 |
+
--destructive: oklch(0.577 0.245 27.325);
|
| 23 |
+
--destructive-foreground: oklch(1 0 0);
|
| 24 |
+
--border: oklch(0.922 0 0);
|
| 25 |
+
--input: oklch(0.922 0 0);
|
| 26 |
+
--ring: oklch(0.506 0.133 265.754);
|
| 27 |
+
--chart-1: oklch(0.506 0.133 265.754);
|
| 28 |
+
--chart-2: oklch(0.6 0.118 184.704);
|
| 29 |
+
--chart-3: oklch(0.398 0.07 227.392);
|
| 30 |
+
--chart-4: oklch(0.828 0.189 84.429);
|
| 31 |
+
--chart-5: oklch(0.769 0.188 70.08);
|
| 32 |
+
--radius: 0.5rem;
|
| 33 |
+
--sidebar: oklch(0.985 0 0);
|
| 34 |
+
--sidebar-foreground: oklch(0.145 0 0);
|
| 35 |
+
--sidebar-primary: oklch(0.506 0.133 265.754);
|
| 36 |
+
--sidebar-primary-foreground: oklch(1 0 0);
|
| 37 |
+
--sidebar-accent: oklch(0.97 0 0);
|
| 38 |
+
--sidebar-accent-foreground: oklch(0.145 0 0);
|
| 39 |
+
--sidebar-border: oklch(0.922 0 0);
|
| 40 |
+
--sidebar-ring: oklch(0.708 0 0);
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
.dark {
|
| 44 |
+
--background: oklch(0.145 0 0);
|
| 45 |
+
--foreground: oklch(0.985 0 0);
|
| 46 |
+
--card: oklch(0.205 0 0);
|
| 47 |
+
--card-foreground: oklch(0.985 0 0);
|
| 48 |
+
--popover: oklch(0.205 0 0);
|
| 49 |
+
--popover-foreground: oklch(0.985 0 0);
|
| 50 |
+
/* Updated dark mode to complement indigo theme */
|
| 51 |
+
--primary: oklch(0.725 0.09 265.754); /* indigo-400 */
|
| 52 |
+
--primary-foreground: oklch(0.145 0 0);
|
| 53 |
+
--secondary: oklch(0.269 0.03 265.754);
|
| 54 |
+
--secondary-foreground: oklch(0.985 0 0);
|
| 55 |
+
--muted: oklch(0.269 0 0);
|
| 56 |
+
--muted-foreground: oklch(0.708 0 0);
|
| 57 |
+
--accent: oklch(0.506 0.133 265.754);
|
| 58 |
+
--accent-foreground: oklch(1 0 0);
|
| 59 |
+
--destructive: oklch(0.396 0.141 25.723);
|
| 60 |
+
--destructive-foreground: oklch(1 0 0);
|
| 61 |
+
--border: oklch(0.269 0 0);
|
| 62 |
+
--input: oklch(0.269 0 0);
|
| 63 |
+
--ring: oklch(0.725 0.09 265.754);
|
| 64 |
+
--chart-1: oklch(0.725 0.09 265.754);
|
| 65 |
+
--chart-2: oklch(0.696 0.17 162.48);
|
| 66 |
+
--chart-3: oklch(0.769 0.188 70.08);
|
| 67 |
+
--chart-4: oklch(0.627 0.265 303.9);
|
| 68 |
+
--chart-5: oklch(0.645 0.246 16.439);
|
| 69 |
+
--sidebar: oklch(0.205 0 0);
|
| 70 |
+
--sidebar-foreground: oklch(0.985 0 0);
|
| 71 |
+
--sidebar-primary: oklch(0.725 0.09 265.754);
|
| 72 |
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
| 73 |
+
--sidebar-accent: oklch(0.269 0 0);
|
| 74 |
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
| 75 |
+
--sidebar-border: oklch(0.269 0 0);
|
| 76 |
+
--sidebar-ring: oklch(0.439 0 0);
|
| 77 |
+
}
|
| 78 |
+
|
| 79 |
+
@theme inline {
|
| 80 |
+
--font-sans: "Inter", "Inter Fallback", system-ui, sans-serif;
|
| 81 |
+
--font-mono: "Geist Mono", "Geist Mono Fallback";
|
| 82 |
+
--color-background: var(--background);
|
| 83 |
+
--color-foreground: var(--foreground);
|
| 84 |
+
--color-card: var(--card);
|
| 85 |
+
--color-card-foreground: var(--card-foreground);
|
| 86 |
+
--color-popover: var(--popover);
|
| 87 |
+
--color-popover-foreground: var(--popover-foreground);
|
| 88 |
+
--color-primary: var(--primary);
|
| 89 |
+
--color-primary-foreground: var(--primary-foreground);
|
| 90 |
+
--color-secondary: var(--secondary);
|
| 91 |
+
--color-secondary-foreground: var(--secondary-foreground);
|
| 92 |
+
--color-muted: var(--muted);
|
| 93 |
+
--color-muted-foreground: var(--muted-foreground);
|
| 94 |
+
--color-accent: var(--accent);
|
| 95 |
+
--color-accent-foreground: var(--accent-foreground);
|
| 96 |
+
--color-destructive: var(--destructive);
|
| 97 |
+
--color-destructive-foreground: var(--destructive-foreground);
|
| 98 |
+
--color-border: var(--border);
|
| 99 |
+
--color-input: var(--input);
|
| 100 |
+
--color-ring: var(--ring);
|
| 101 |
+
--color-chart-1: var(--chart-1);
|
| 102 |
+
--color-chart-2: var(--chart-2);
|
| 103 |
+
--color-chart-3: var(--chart-3);
|
| 104 |
+
--color-chart-4: var(--chart-4);
|
| 105 |
+
--color-chart-5: var(--chart-5);
|
| 106 |
+
--radius-sm: calc(var(--radius) - 4px);
|
| 107 |
+
--radius-md: calc(var(--radius) - 2px);
|
| 108 |
+
--radius-lg: var(--radius);
|
| 109 |
+
--radius-xl: calc(var(--radius) + 4px);
|
| 110 |
+
--color-sidebar: var(--sidebar);
|
| 111 |
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
| 112 |
+
--color-sidebar-primary: var(--sidebar-primary);
|
| 113 |
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
| 114 |
+
--color-sidebar-accent: var(--sidebar-accent);
|
| 115 |
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
| 116 |
+
--color-sidebar-border: var(--sidebar-border);
|
| 117 |
+
--color-sidebar-ring: var(--sidebar-ring);
|
| 118 |
+
}
|
| 119 |
+
|
| 120 |
+
@layer base {
|
| 121 |
+
* {
|
| 122 |
+
@apply border-border outline-ring/50;
|
| 123 |
+
}
|
| 124 |
+
body {
|
| 125 |
+
@apply bg-background text-foreground;
|
| 126 |
+
}
|
| 127 |
+
}
|
next/src/app/layout.tsx
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import type { Metadata } from "next";
|
| 2 |
+
import { Geist, Geist_Mono } from "next/font/google";
|
| 3 |
+
import "./globals.css";
|
| 4 |
+
import { Toaster } from "@/components/ui/sonner"
|
| 5 |
+
|
| 6 |
+
const geistSans = Geist({
|
| 7 |
+
variable: "--font-geist-sans",
|
| 8 |
+
subsets: ["latin"],
|
| 9 |
+
});
|
| 10 |
+
|
| 11 |
+
const geistMono = Geist_Mono({
|
| 12 |
+
variable: "--font-geist-mono",
|
| 13 |
+
subsets: ["latin"],
|
| 14 |
+
});
|
| 15 |
+
|
| 16 |
+
export const metadata: Metadata = {
|
| 17 |
+
title: "Edu Path AI - University Workflow Automation",
|
| 18 |
+
description:
|
| 19 |
+
"Centralized university workflow automation platform for Final Year Project management and Student Degree Clearance.",
|
| 20 |
+
generator: "v0.app",
|
| 21 |
+
icons: {
|
| 22 |
+
icon: [
|
| 23 |
+
{
|
| 24 |
+
url: "/icon-light-32x32.png",
|
| 25 |
+
media: "(prefers-color-scheme: light)",
|
| 26 |
+
},
|
| 27 |
+
{
|
| 28 |
+
url: "/icon-dark-32x32.png",
|
| 29 |
+
media: "(prefers-color-scheme: dark)",
|
| 30 |
+
},
|
| 31 |
+
{
|
| 32 |
+
url: "/icon.svg",
|
| 33 |
+
type: "image/svg+xml",
|
| 34 |
+
},
|
| 35 |
+
],
|
| 36 |
+
apple: "/apple-icon.png",
|
| 37 |
+
},
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
export default function RootLayout({
|
| 41 |
+
children,
|
| 42 |
+
}: Readonly<{
|
| 43 |
+
children: React.ReactNode;
|
| 44 |
+
}>) {
|
| 45 |
+
return (
|
| 46 |
+
<html lang="en">
|
| 47 |
+
<body
|
| 48 |
+
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
|
| 49 |
+
>
|
| 50 |
+
{children}
|
| 51 |
+
<Toaster />
|
| 52 |
+
</body>
|
| 53 |
+
</html>
|
| 54 |
+
);
|
| 55 |
+
}
|
next/src/app/login/page.tsx
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"use client"
|
| 2 |
+
|
| 3 |
+
import { useState } from "react"
|
| 4 |
+
import { useRouter } from "next/navigation"
|
| 5 |
+
import { useForm } from "react-hook-form"
|
| 6 |
+
import { zodResolver } from "@hookform/resolvers/zod"
|
| 7 |
+
import { loginSchema, LoginSchema } from "@/lib/validations/login"
|
| 8 |
+
import Link from "next/link"
|
| 9 |
+
|
| 10 |
+
import { Button } from "@/components/ui/button"
|
| 11 |
+
import { Input } from "@/components/ui/input"
|
| 12 |
+
import {
|
| 13 |
+
Form,
|
| 14 |
+
FormControl,
|
| 15 |
+
FormField,
|
| 16 |
+
FormItem,
|
| 17 |
+
FormLabel,
|
| 18 |
+
FormMessage,
|
| 19 |
+
} from "@/components/ui/form"
|
| 20 |
+
import { Card, CardHeader, CardTitle, CardContent, CardDescription, CardFooter } from "@/components/ui/card"
|
| 21 |
+
|
| 22 |
+
export default function LoginPage() {
|
| 23 |
+
const [loading, setLoading] = useState(false)
|
| 24 |
+
const router = useRouter()
|
| 25 |
+
|
| 26 |
+
const form = useForm<LoginSchema>({
|
| 27 |
+
resolver: zodResolver(loginSchema),
|
| 28 |
+
defaultValues: {
|
| 29 |
+
email: "",
|
| 30 |
+
password: "",
|
| 31 |
+
},
|
| 32 |
+
})
|
| 33 |
+
|
| 34 |
+
async function onSubmit(data: LoginSchema) {
|
| 35 |
+
setLoading(true)
|
| 36 |
+
const response = await fetch("/api/auth/login", {
|
| 37 |
+
method: "POST",
|
| 38 |
+
headers: { "Content-Type": "application/json" },
|
| 39 |
+
body: JSON.stringify(data),
|
| 40 |
+
})
|
| 41 |
+
|
| 42 |
+
const result = await response.json()
|
| 43 |
+
setLoading(false)
|
| 44 |
+
|
| 45 |
+
if (!response.ok) {
|
| 46 |
+
alert(result.error)
|
| 47 |
+
return
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
router.push("/dashboard") // Redirect to main app after login
|
| 51 |
+
router.refresh()
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
return (
|
| 55 |
+
<div className="flex min-h-screen flex-col items-center justify-center bg-gray-50 px-4">
|
| 56 |
+
{/* BRANDING */}
|
| 57 |
+
<div className="mb-8 text-center">
|
| 58 |
+
<h1 className="text-3xl font-bold text-indigo-600">EduPath AI</h1>
|
| 59 |
+
<p className="text-sm text-gray-500">Your personalized learning journey</p>
|
| 60 |
+
</div>
|
| 61 |
+
|
| 62 |
+
<Card className="w-full max-w-sm shadow-lg">
|
| 63 |
+
<CardHeader className="space-y-1">
|
| 64 |
+
<CardTitle className="text-2xl font-bold">Sign In</CardTitle>
|
| 65 |
+
<CardDescription>Enter your email and password to access your account.</CardDescription>
|
| 66 |
+
</CardHeader>
|
| 67 |
+
<CardContent>
|
| 68 |
+
<Form {...form}>
|
| 69 |
+
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
|
| 70 |
+
|
| 71 |
+
<FormField
|
| 72 |
+
control={form.control}
|
| 73 |
+
name="email"
|
| 74 |
+
render={({ field }) => (
|
| 75 |
+
<FormItem>
|
| 76 |
+
<FormLabel>Email</FormLabel>
|
| 77 |
+
<FormControl>
|
| 78 |
+
<Input placeholder=" " {...field} />
|
| 79 |
+
</FormControl>
|
| 80 |
+
<FormMessage />
|
| 81 |
+
</FormItem>
|
| 82 |
+
)}
|
| 83 |
+
/>
|
| 84 |
+
|
| 85 |
+
<FormField
|
| 86 |
+
control={form.control}
|
| 87 |
+
name="password"
|
| 88 |
+
render={({ field }) => (
|
| 89 |
+
<FormItem>
|
| 90 |
+
<FormLabel>Password</FormLabel>
|
| 91 |
+
<FormControl>
|
| 92 |
+
<Input type="password" placeholder=" " {...field} />
|
| 93 |
+
</FormControl>
|
| 94 |
+
<FormMessage />
|
| 95 |
+
</FormItem>
|
| 96 |
+
)}
|
| 97 |
+
/>
|
| 98 |
+
|
| 99 |
+
<Button type="submit" className="w-full bg-indigo-600 hover:bg-indigo-700" disabled={loading}>
|
| 100 |
+
{loading ? "Signing in..." : "Sign In"}
|
| 101 |
+
</Button>
|
| 102 |
+
</form>
|
| 103 |
+
</Form>
|
| 104 |
+
</CardContent>
|
| 105 |
+
|
| 106 |
+
{/* FOOTER: Link to Register */}
|
| 107 |
+
<CardFooter className="justify-center border-t p-4">
|
| 108 |
+
<p className="text-sm text-gray-600">
|
| 109 |
+
Don't have an account?{" "}
|
| 110 |
+
<Link href="/register" className="font-semibold text-indigo-600 hover:underline">
|
| 111 |
+
Sign up
|
| 112 |
+
</Link>
|
| 113 |
+
</p>
|
| 114 |
+
</CardFooter>
|
| 115 |
+
</Card>
|
| 116 |
+
</div>
|
| 117 |
+
)
|
| 118 |
+
}
|
next/src/app/page.tsx
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import Link from "next/link"
|
| 2 |
+
import { Button } from "@/components/ui/button"
|
| 3 |
+
import { Card, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
|
| 4 |
+
import { Navbar } from "@/components/navbar"
|
| 5 |
+
import { Footer } from "@/components/footer"
|
| 6 |
+
import { GraduationCap, FileText, Users, CheckCircle2, ArrowRight, Sparkles, Shield, Zap } from "lucide-react"
|
| 7 |
+
|
| 8 |
+
export default function HomePage() {
|
| 9 |
+
return (
|
| 10 |
+
<div className="min-h-screen flex flex-col">
|
| 11 |
+
<Navbar />
|
| 12 |
+
|
| 13 |
+
<main className="flex-1">
|
| 14 |
+
{/* Hero Section */}
|
| 15 |
+
<section className="relative py-20 md:py-32 overflow-hidden">
|
| 16 |
+
<div className="absolute inset-0 bg-linear-to-br from-primary/5 via-transparent to-accent/5" />
|
| 17 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8 relative">
|
| 18 |
+
<div className="max-w-4xl mx-auto text-center space-y-8">
|
| 19 |
+
<div className="inline-flex items-center gap-2 px-4 py-2 rounded-full border bg-secondary/50 text-sm font-medium text-primary">
|
| 20 |
+
<Sparkles className="h-4 w-4" />
|
| 21 |
+
<span>AI-Powered Career Guidance</span>
|
| 22 |
+
</div>
|
| 23 |
+
<h1 className="text-4xl md:text-5xl lg:text-6xl font-bold tracking-tight text-balance">
|
| 24 |
+
{"Discover Your Perfect Career Path with "}
|
| 25 |
+
<span className="text-primary">Intelligent AI</span>
|
| 26 |
+
</h1>
|
| 27 |
+
<p className="text-lg md:text-xl text-muted-foreground leading-relaxed text-pretty max-w-2xl mx-auto">
|
| 28 |
+
Stop guessing your future. Our AI recommendation system analyzes your interests through psychometric tests
|
| 29 |
+
to suggest the best degrees and universities for you.
|
| 30 |
+
</p>
|
| 31 |
+
<div className="flex flex-col sm:flex-row gap-4 justify-center">
|
| 32 |
+
<Button size="lg" asChild>
|
| 33 |
+
<Link href="/login">
|
| 34 |
+
Get Started <ArrowRight className="ml-2 h-4 w-4" />
|
| 35 |
+
</Link>
|
| 36 |
+
</Button>
|
| 37 |
+
<Button size="lg" variant="outline" asChild>
|
| 38 |
+
<Link href="/about">Learn More</Link>
|
| 39 |
+
</Button>
|
| 40 |
+
</div>
|
| 41 |
+
</div>
|
| 42 |
+
</div>
|
| 43 |
+
</section>
|
| 44 |
+
|
| 45 |
+
{/* Stats Section */}
|
| 46 |
+
<section className="py-12 bg-card border-y">
|
| 47 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 48 |
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 text-center">
|
| 49 |
+
<div className="space-y-2">
|
| 50 |
+
<p className="text-4xl font-bold text-primary">85%</p>
|
| 51 |
+
<p className="text-sm text-muted-foreground">Match Accuracy</p>
|
| 52 |
+
</div>
|
| 53 |
+
<div className="space-y-2">
|
| 54 |
+
<p className="text-4xl font-bold text-primary">30+</p>
|
| 55 |
+
<p className="text-sm text-muted-foreground">Career Clusters</p>
|
| 56 |
+
</div>
|
| 57 |
+
<div className="space-y-2">
|
| 58 |
+
<p className="text-4xl font-bold text-primary">100+</p>
|
| 59 |
+
<p className="text-sm text-muted-foreground">Universities Indexed</p>
|
| 60 |
+
</div>
|
| 61 |
+
</div>
|
| 62 |
+
</div>
|
| 63 |
+
</section>
|
| 64 |
+
|
| 65 |
+
{/* Features Section */}
|
| 66 |
+
<section className="py-20 md:py-32">
|
| 67 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 68 |
+
<div className="text-center max-w-3xl mx-auto mb-16 space-y-4">
|
| 69 |
+
<h2 className="text-3xl md:text-4xl font-bold text-balance">
|
| 70 |
+
{"Complete Platform for "}
|
| 71 |
+
<span className="text-primary">Future Success</span>
|
| 72 |
+
</h2>
|
| 73 |
+
<p className="text-lg text-muted-foreground leading-relaxed">
|
| 74 |
+
Everything you need to make informed decisions about your education and career in one powerful platform.
|
| 75 |
+
</p>
|
| 76 |
+
</div>
|
| 77 |
+
|
| 78 |
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
| 79 |
+
<Card className="border-2 hover:border-primary/50 transition-colors">
|
| 80 |
+
<CardHeader>
|
| 81 |
+
<div className="h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center mb-4">
|
| 82 |
+
<FileText className="h-6 w-6 text-primary" />
|
| 83 |
+
</div>
|
| 84 |
+
<CardTitle>Psychometric Testing</CardTitle>
|
| 85 |
+
<CardDescription>
|
| 86 |
+
Take our comprehensive test to discover your hidden talents. Our AI analyzes your aptitude and
|
| 87 |
+
interests to generate a unique profile vector for accurate career matching.
|
| 88 |
+
</CardDescription>
|
| 89 |
+
</CardHeader>
|
| 90 |
+
</Card>
|
| 91 |
+
|
| 92 |
+
<Card className="border-2 hover:border-primary/50 transition-colors">
|
| 93 |
+
<CardHeader>
|
| 94 |
+
<div className="h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center mb-4">
|
| 95 |
+
<CheckCircle2 className="h-6 w-6 text-primary" />
|
| 96 |
+
</div>
|
| 97 |
+
<CardTitle>University Finder</CardTitle>
|
| 98 |
+
<CardDescription>
|
| 99 |
+
Compare admission criteria, fee structures, and course outlines across different universities
|
| 100 |
+
to find the institution that best fits your needs and budget.
|
| 101 |
+
</CardDescription>
|
| 102 |
+
</CardHeader>
|
| 103 |
+
</Card>
|
| 104 |
+
|
| 105 |
+
<Card className="border-2 hover:border-primary/50 transition-colors">
|
| 106 |
+
<CardHeader>
|
| 107 |
+
<div className="h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center mb-4">
|
| 108 |
+
<Users className="h-6 w-6 text-primary" />
|
| 109 |
+
</div>
|
| 110 |
+
<CardTitle>Virtual Assistant</CardTitle>
|
| 111 |
+
<CardDescription>
|
| 112 |
+
Have questions about a specific field? Our NLP-powered chatbot is available 24/7 to explain
|
| 113 |
+
complex career differences and guide you through the platform.
|
| 114 |
+
</CardDescription>
|
| 115 |
+
</CardHeader>
|
| 116 |
+
</Card>
|
| 117 |
+
|
| 118 |
+
<Card className="border-2 hover:border-primary/50 transition-colors">
|
| 119 |
+
<CardHeader>
|
| 120 |
+
<div className="h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center mb-4">
|
| 121 |
+
<GraduationCap className="h-6 w-6 text-primary" />
|
| 122 |
+
</div>
|
| 123 |
+
<CardTitle>4-Year Career Roadmap</CardTitle>
|
| 124 |
+
<CardDescription>
|
| 125 |
+
Get a year-by-year plan tailored to your chosen field. We outline major subjects, projects,
|
| 126 |
+
skills, and internships you need to focus on to succeed.
|
| 127 |
+
</CardDescription>
|
| 128 |
+
</CardHeader>
|
| 129 |
+
</Card>
|
| 130 |
+
|
| 131 |
+
<Card className="border-2 hover:border-primary/50 transition-colors">
|
| 132 |
+
<CardHeader>
|
| 133 |
+
<div className="h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center mb-4">
|
| 134 |
+
<Zap className="h-6 w-6 text-primary" />
|
| 135 |
+
</div>
|
| 136 |
+
<CardTitle>Market Trends</CardTitle>
|
| 137 |
+
<CardDescription>
|
| 138 |
+
Stay ahead of the curve with real-time insights into local and global market demands,
|
| 139 |
+
average salaries, and future growth scope for various careers.
|
| 140 |
+
</CardDescription>
|
| 141 |
+
</CardHeader>
|
| 142 |
+
</Card>
|
| 143 |
+
|
| 144 |
+
<Card className="border-2 hover:border-primary/50 transition-colors">
|
| 145 |
+
<CardHeader>
|
| 146 |
+
<div className="h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center mb-4">
|
| 147 |
+
<Shield className="h-6 w-6 text-primary" />
|
| 148 |
+
</div>
|
| 149 |
+
<CardTitle>Secure & Private</CardTitle>
|
| 150 |
+
<CardDescription>
|
| 151 |
+
Your personal data and test results are encrypted and stored securely. We prioritize your privacy
|
| 152 |
+
while helping you build your future.
|
| 153 |
+
</CardDescription>
|
| 154 |
+
</CardHeader>
|
| 155 |
+
</Card>
|
| 156 |
+
</div>
|
| 157 |
+
</div>
|
| 158 |
+
</section>
|
| 159 |
+
|
| 160 |
+
{/* CTA Section */}
|
| 161 |
+
<section className="py-20 bg-primary text-primary-foreground">
|
| 162 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 163 |
+
<div className="max-w-3xl mx-auto text-center space-y-6">
|
| 164 |
+
<h2 className="text-3xl md:text-4xl font-bold text-balance">
|
| 165 |
+
Ready to Find Your True Calling?
|
| 166 |
+
</h2>
|
| 167 |
+
<p className="text-lg text-primary-foreground/90 leading-relaxed">
|
| 168 |
+
Join thousands of students using Edu Path AI to make data-driven decisions about their education
|
| 169 |
+
and future careers.
|
| 170 |
+
</p>
|
| 171 |
+
<div className="flex flex-col sm:flex-row gap-4 justify-center pt-4">
|
| 172 |
+
<Button size="lg" variant="secondary" asChild>
|
| 173 |
+
<Link href="/login">
|
| 174 |
+
Start Assessment <ArrowRight className="ml-2 h-4 w-4" />
|
| 175 |
+
</Link>
|
| 176 |
+
</Button>
|
| 177 |
+
<Button
|
| 178 |
+
size="lg"
|
| 179 |
+
variant="outline"
|
| 180 |
+
className="bg-transparent border-primary-foreground text-primary-foreground hover:bg-primary-foreground/10"
|
| 181 |
+
asChild
|
| 182 |
+
>
|
| 183 |
+
<Link href="/about">Learn More</Link>
|
| 184 |
+
</Button>
|
| 185 |
+
</div>
|
| 186 |
+
</div>
|
| 187 |
+
</div>
|
| 188 |
+
</section>
|
| 189 |
+
</main>
|
| 190 |
+
|
| 191 |
+
<Footer />
|
| 192 |
+
</div>
|
| 193 |
+
)
|
| 194 |
+
}
|
next/src/app/register/page.tsx
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"use client"
|
| 2 |
+
|
| 3 |
+
import { useState } from "react"
|
| 4 |
+
import { useRouter } from "next/navigation"
|
| 5 |
+
import { useForm } from "react-hook-form"
|
| 6 |
+
import { zodResolver } from "@hookform/resolvers/zod"
|
| 7 |
+
import { z } from "zod"
|
| 8 |
+
import Link from "next/link"
|
| 9 |
+
|
| 10 |
+
import { Button } from "@/components/ui/button"
|
| 11 |
+
import { Input } from "@/components/ui/input"
|
| 12 |
+
import {
|
| 13 |
+
Form,
|
| 14 |
+
FormControl,
|
| 15 |
+
FormField,
|
| 16 |
+
FormItem,
|
| 17 |
+
FormLabel,
|
| 18 |
+
FormMessage,
|
| 19 |
+
} from "@/components/ui/form"
|
| 20 |
+
import { Card, CardHeader, CardTitle, CardContent, CardDescription, CardFooter } from "@/components/ui/card"
|
| 21 |
+
|
| 22 |
+
// --- 1. DEFINE SCHEMA HERE (Eliminates import errors) ---
|
| 23 |
+
const registerSchema = z.object({
|
| 24 |
+
name: z.string().min(3, { message: "Name must be at least 3 characters." }),
|
| 25 |
+
email: z.string().email({ message: "Please enter a valid email address." }),
|
| 26 |
+
password: z.string().min(6, { message: "Password must be at least 6 characters." }),
|
| 27 |
+
// This is the strict part:
|
| 28 |
+
role: z.enum(["STUDENT", "ADMIN"]),
|
| 29 |
+
})
|
| 30 |
+
|
| 31 |
+
// --- 2. INFER THE TYPE AUTOMATICALLY ---
|
| 32 |
+
type RegisterFormValues = z.infer<typeof registerSchema>
|
| 33 |
+
|
| 34 |
+
export default function RegisterPage() {
|
| 35 |
+
const [loading, setLoading] = useState(false)
|
| 36 |
+
const router = useRouter()
|
| 37 |
+
|
| 38 |
+
// --- 3. THE FIX: Explicitly tell useForm what the type is ---
|
| 39 |
+
const form = useForm<RegisterFormValues>({
|
| 40 |
+
resolver: zodResolver(registerSchema),
|
| 41 |
+
defaultValues: {
|
| 42 |
+
name: "",
|
| 43 |
+
email: "",
|
| 44 |
+
password: "",
|
| 45 |
+
// THE MAGIC FIX: 'as const' tells TS this is the Enum value, not just a string
|
| 46 |
+
role: "STUDENT" as const,
|
| 47 |
+
},
|
| 48 |
+
})
|
| 49 |
+
|
| 50 |
+
async function onSubmit(data: RegisterFormValues) {
|
| 51 |
+
setLoading(true)
|
| 52 |
+
|
| 53 |
+
try {
|
| 54 |
+
const response = await fetch("/api/auth/register", {
|
| 55 |
+
method: "POST",
|
| 56 |
+
headers: { "Content-Type": "application/json" },
|
| 57 |
+
body: JSON.stringify(data),
|
| 58 |
+
})
|
| 59 |
+
|
| 60 |
+
const result = await response.json()
|
| 61 |
+
|
| 62 |
+
if (!response.ok) {
|
| 63 |
+
alert(result.error || "Something went wrong")
|
| 64 |
+
console.log(result)
|
| 65 |
+
return
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
alert("Account created successfully! Please login.")
|
| 69 |
+
router.push("/login")
|
| 70 |
+
|
| 71 |
+
} catch (error) {
|
| 72 |
+
alert("Something went wrong")
|
| 73 |
+
} finally {
|
| 74 |
+
setLoading(false)
|
| 75 |
+
}
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
return (
|
| 79 |
+
<div className="flex min-h-screen flex-col items-center justify-center bg-gray-50 px-4">
|
| 80 |
+
<div className="mb-8 text-center">
|
| 81 |
+
<h1 className="text-3xl font-bold text-indigo-600">EduPath AI</h1>
|
| 82 |
+
<p className="text-sm text-gray-500">Join us to start your career journey</p>
|
| 83 |
+
</div>
|
| 84 |
+
|
| 85 |
+
<Card className="w-full max-w-sm shadow-lg">
|
| 86 |
+
<CardHeader className="space-y-1">
|
| 87 |
+
<CardTitle className="text-2xl font-bold">Create Account</CardTitle>
|
| 88 |
+
<CardDescription>Enter your details below to create your account.</CardDescription>
|
| 89 |
+
</CardHeader>
|
| 90 |
+
<CardContent>
|
| 91 |
+
<Form {...form}>
|
| 92 |
+
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
|
| 93 |
+
|
| 94 |
+
<FormField
|
| 95 |
+
control={form.control}
|
| 96 |
+
name="name"
|
| 97 |
+
render={({ field }) => (
|
| 98 |
+
<FormItem>
|
| 99 |
+
<FormLabel>Full Name</FormLabel>
|
| 100 |
+
<FormControl>
|
| 101 |
+
<Input placeholder=" " {...field} />
|
| 102 |
+
</FormControl>
|
| 103 |
+
<FormMessage />
|
| 104 |
+
</FormItem>
|
| 105 |
+
)}
|
| 106 |
+
/>
|
| 107 |
+
|
| 108 |
+
<FormField
|
| 109 |
+
control={form.control}
|
| 110 |
+
name="email"
|
| 111 |
+
render={({ field }) => (
|
| 112 |
+
<FormItem>
|
| 113 |
+
<FormLabel>Email</FormLabel>
|
| 114 |
+
<FormControl>
|
| 115 |
+
<Input placeholder=" " {...field} />
|
| 116 |
+
</FormControl>
|
| 117 |
+
<FormMessage />
|
| 118 |
+
</FormItem>
|
| 119 |
+
)}
|
| 120 |
+
/>
|
| 121 |
+
|
| 122 |
+
<FormField
|
| 123 |
+
control={form.control}
|
| 124 |
+
name="password"
|
| 125 |
+
render={({ field }) => (
|
| 126 |
+
<FormItem>
|
| 127 |
+
<FormLabel>Password</FormLabel>
|
| 128 |
+
<FormControl>
|
| 129 |
+
<Input type="password" placeholder=" " {...field} />
|
| 130 |
+
</FormControl>
|
| 131 |
+
<FormMessage />
|
| 132 |
+
</FormItem>
|
| 133 |
+
)}
|
| 134 |
+
/>
|
| 135 |
+
|
| 136 |
+
<Button type="submit" className="w-full bg-indigo-600 hover:bg-indigo-700" disabled={loading}>
|
| 137 |
+
{loading ? "Creating Account..." : "Sign Up"}
|
| 138 |
+
</Button>
|
| 139 |
+
</form>
|
| 140 |
+
</Form>
|
| 141 |
+
</CardContent>
|
| 142 |
+
|
| 143 |
+
<CardFooter className="justify-center border-t p-4">
|
| 144 |
+
<p className="text-sm text-gray-600">
|
| 145 |
+
Already have an account?{" "}
|
| 146 |
+
<Link href="/login" className="font-semibold text-indigo-600 hover:underline">
|
| 147 |
+
Sign in
|
| 148 |
+
</Link>
|
| 149 |
+
</p>
|
| 150 |
+
</CardFooter>
|
| 151 |
+
</Card>
|
| 152 |
+
</div>
|
| 153 |
+
)
|
| 154 |
+
}
|
next/src/components/CountryFilter.tsx
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"use client"
|
| 2 |
+
|
| 3 |
+
import { useRouter, useSearchParams } from 'next/navigation';
|
| 4 |
+
|
| 5 |
+
export default function CountryFilter({ countries }: { countries: string[] }) {
|
| 6 |
+
const router = useRouter();
|
| 7 |
+
const searchParams = useSearchParams();
|
| 8 |
+
const selectedCountry = searchParams.get('country') || "";
|
| 9 |
+
|
| 10 |
+
const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
|
| 11 |
+
const country = e.target.value;
|
| 12 |
+
|
| 13 |
+
// 👇 CRITICAL CHANGE: Updated paths to /dashboard/university
|
| 14 |
+
if (country === "all") {
|
| 15 |
+
router.push('/dashboard/university');
|
| 16 |
+
} else {
|
| 17 |
+
router.push(`/dashboard/university?country=${country}`);
|
| 18 |
+
}
|
| 19 |
+
};
|
| 20 |
+
|
| 21 |
+
return (
|
| 22 |
+
<div className="mb-8">
|
| 23 |
+
<label className="block text-sm font-medium text-gray-700 mb-2">
|
| 24 |
+
Filter by Country
|
| 25 |
+
</label>
|
| 26 |
+
<div className="relative">
|
| 27 |
+
<select
|
| 28 |
+
value={selectedCountry}
|
| 29 |
+
onChange={handleChange}
|
| 30 |
+
className="block w-full max-w-xs pl-3 pr-10 py-3 text-base border-gray-300 focus:outline-none focus:ring-blue-500 focus:border-blue-500 sm:text-sm rounded-md shadow-sm bg-white text-gray-900 cursor-pointer"
|
| 31 |
+
>
|
| 32 |
+
<option value="all">All Countries</option>
|
| 33 |
+
{countries.map((country) => (
|
| 34 |
+
<option key={country} value={country}>
|
| 35 |
+
{country}
|
| 36 |
+
</option>
|
| 37 |
+
))}
|
| 38 |
+
</select>
|
| 39 |
+
</div>
|
| 40 |
+
</div>
|
| 41 |
+
);
|
| 42 |
+
}
|
next/src/components/UniversityCard.tsx
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import Link from 'next/link';
|
| 2 |
+
|
| 3 |
+
interface University {
|
| 4 |
+
id: string;
|
| 5 |
+
name: string;
|
| 6 |
+
location: string;
|
| 7 |
+
ranking?: number;
|
| 8 |
+
feeStructure?: number;
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
// Function to generate a consistent color based on the university name
|
| 12 |
+
// This ensures "Harvard" is always the same color on refresh.
|
| 13 |
+
const getGradient = (name: string) => {
|
| 14 |
+
const colors = [
|
| 15 |
+
'from-blue-500 to-cyan-400',
|
| 16 |
+
'from-purple-600 to-indigo-500',
|
| 17 |
+
'from-emerald-500 to-teal-400',
|
| 18 |
+
'from-orange-500 to-amber-400',
|
| 19 |
+
'from-rose-500 to-pink-500',
|
| 20 |
+
'from-slate-700 to-slate-600',
|
| 21 |
+
];
|
| 22 |
+
let hash = 0;
|
| 23 |
+
for (let i = 0; i < name.length; i++) {
|
| 24 |
+
hash = name.charCodeAt(i) + ((hash << 5) - hash);
|
| 25 |
+
}
|
| 26 |
+
return colors[Math.abs(hash) % colors.length];
|
| 27 |
+
};
|
| 28 |
+
|
| 29 |
+
export default function UniversityCard({ uni }: { uni: University }) {
|
| 30 |
+
const gradient = getGradient(uni.name);
|
| 31 |
+
|
| 32 |
+
return (
|
| 33 |
+
<Link
|
| 34 |
+
href={`/university/${uni.id}`}
|
| 35 |
+
className="group bg-white rounded-xl border border-gray-200 shadow-sm hover:shadow-xl hover:-translate-y-1 transition-all duration-300 overflow-hidden flex flex-col h-full"
|
| 36 |
+
>
|
| 37 |
+
{/* 1. Header with Gradient & Initial (Visual Interest) */}
|
| 38 |
+
<div className={`h-32 bg-linear-to-br ${gradient} p-4 flex items-start justify-between relative`}>
|
| 39 |
+
<div className="bg-white/20 backdrop-blur-sm p-2 rounded-lg text-white">
|
| 40 |
+
{/* Use the first letter as a logo placeholder */}
|
| 41 |
+
<span className="text-2xl font-bold font-serif">{uni.name.charAt(0)}</span>
|
| 42 |
+
</div>
|
| 43 |
+
|
| 44 |
+
{/* Ranking Badge */}
|
| 45 |
+
{uni.ranking && uni.ranking > 0 && (
|
| 46 |
+
<span className="bg-black/30 backdrop-blur-md text-white text-xs font-semibold px-3 py-1 rounded-full border border-white/20">
|
| 47 |
+
#{uni.ranking} Global Rank
|
| 48 |
+
</span>
|
| 49 |
+
)}
|
| 50 |
+
</div>
|
| 51 |
+
|
| 52 |
+
{/* 2. Content Body */}
|
| 53 |
+
<div className="p-5 flex-1 flex flex-col">
|
| 54 |
+
<h3 className="text-xl font-bold text-gray-900 group-hover:text-blue-600 transition-colors line-clamp-2 mb-2">
|
| 55 |
+
{uni.name}
|
| 56 |
+
</h3>
|
| 57 |
+
|
| 58 |
+
<div className="flex items-center text-gray-500 text-sm mb-4">
|
| 59 |
+
<svg className="w-4 h-4 mr-1" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"></path><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"></path></svg>
|
| 60 |
+
{uni.location}
|
| 61 |
+
</div>
|
| 62 |
+
|
| 63 |
+
{/* Spacer to push footer down */}
|
| 64 |
+
<div className="flex-1"></div>
|
| 65 |
+
|
| 66 |
+
{/* 3. Footer Stats */}
|
| 67 |
+
<div className="pt-4 border-t border-gray-100 flex items-center justify-between mt-2">
|
| 68 |
+
<div>
|
| 69 |
+
<p className="text-xs text-gray-400 uppercase font-semibold">Tuition</p>
|
| 70 |
+
<p className="text-green-600 font-bold">
|
| 71 |
+
{uni.feeStructure
|
| 72 |
+
? `$${uni.feeStructure.toLocaleString()}`
|
| 73 |
+
: 'Check website'}
|
| 74 |
+
</p>
|
| 75 |
+
</div>
|
| 76 |
+
<span className="text-blue-600 text-sm font-medium group-hover:translate-x-1 transition-transform flex items-center">
|
| 77 |
+
View <span className="ml-1">→</span>
|
| 78 |
+
</span>
|
| 79 |
+
</div>
|
| 80 |
+
</div>
|
| 81 |
+
</Link>
|
| 82 |
+
);
|
| 83 |
+
}
|
next/src/components/dashboard-sidebar.tsx
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"use client"
|
| 2 |
+
|
| 3 |
+
import Link from "next/link"
|
| 4 |
+
import { usePathname } from "next/navigation"
|
| 5 |
+
import {
|
| 6 |
+
Home, Info, Sparkles, BookOpen, Mail, User,
|
| 7 |
+
LayoutDashboard, GraduationCap, Map
|
| 8 |
+
} from "lucide-react"
|
| 9 |
+
import {
|
| 10 |
+
Sidebar, SidebarContent, SidebarFooter, SidebarHeader,
|
| 11 |
+
SidebarMenu, SidebarMenuButton, SidebarMenuItem,
|
| 12 |
+
SidebarRail, SidebarGroup, SidebarGroupContent
|
| 13 |
+
} from "@/components/ui/sidebar"
|
| 14 |
+
import { Avatar, AvatarFallback } from "@/components/ui/avatar"
|
| 15 |
+
|
| 16 |
+
// Define Menu Items Globally
|
| 17 |
+
const menuItems = [
|
| 18 |
+
{ title: "Dashboard", url: "/dashboard", icon: LayoutDashboard },
|
| 19 |
+
{ title: "Universities", url: "/university", icon: GraduationCap },
|
| 20 |
+
{ title: "Degree Roadmap", url: "/dashboard/roadmap", icon: Map },
|
| 21 |
+
{ title: "Home", url: "/", icon: Home },
|
| 22 |
+
{ title: "About", url: "/about-us", icon: Info },
|
| 23 |
+
{ title: "Features", url: "/features", icon: Sparkles },
|
| 24 |
+
{ title: "Blogs", url: "/blogs", icon: BookOpen },
|
| 25 |
+
{ title: "Contact Us", url: "/contact-us", icon: Mail },
|
| 26 |
+
]
|
| 27 |
+
|
| 28 |
+
export function DashboardSidebar() {
|
| 29 |
+
const pathname = usePathname();
|
| 30 |
+
|
| 31 |
+
return (
|
| 32 |
+
<Sidebar collapsible="icon" className="border-r bg-white">
|
| 33 |
+
<SidebarHeader className="border-b p-4">
|
| 34 |
+
<SidebarMenu>
|
| 35 |
+
<SidebarMenuItem>
|
| 36 |
+
<SidebarMenuButton size="lg">
|
| 37 |
+
<Avatar className="h-8 w-8 rounded-lg border-2 border-indigo-600">
|
| 38 |
+
<AvatarFallback className="bg-indigo-600 text-white">
|
| 39 |
+
<User className="h-4 w-4" />
|
| 40 |
+
</AvatarFallback>
|
| 41 |
+
</Avatar>
|
| 42 |
+
<div className="grid flex-1 text-left text-sm leading-tight">
|
| 43 |
+
<span className="truncate font-semibold">Welcome back!</span>
|
| 44 |
+
<span className="truncate text-xs text-muted-foreground">Student</span>
|
| 45 |
+
</div>
|
| 46 |
+
</SidebarMenuButton>
|
| 47 |
+
</SidebarMenuItem>
|
| 48 |
+
</SidebarMenu>
|
| 49 |
+
</SidebarHeader>
|
| 50 |
+
|
| 51 |
+
<SidebarContent className="p-2">
|
| 52 |
+
<SidebarGroup>
|
| 53 |
+
<SidebarGroupContent>
|
| 54 |
+
<SidebarMenu className="space-y-1">
|
| 55 |
+
{menuItems.map((item) => (
|
| 56 |
+
<SidebarMenuItem key={item.title}>
|
| 57 |
+
<SidebarMenuButton
|
| 58 |
+
asChild
|
| 59 |
+
isActive={pathname === item.url}
|
| 60 |
+
tooltip={item.title}
|
| 61 |
+
className="hover:bg-indigo-50 hover:text-indigo-600 transition-colors data-[active=true]:bg-indigo-50 data-[active=true]:text-indigo-600"
|
| 62 |
+
>
|
| 63 |
+
<Link href={item.url}>
|
| 64 |
+
<item.icon className="h-5 w-5" />
|
| 65 |
+
<span className="font-medium">{item.title}</span>
|
| 66 |
+
</Link>
|
| 67 |
+
</SidebarMenuButton>
|
| 68 |
+
</SidebarMenuItem>
|
| 69 |
+
))}
|
| 70 |
+
</SidebarMenu>
|
| 71 |
+
</SidebarGroupContent>
|
| 72 |
+
</SidebarGroup>
|
| 73 |
+
</SidebarContent>
|
| 74 |
+
|
| 75 |
+
<SidebarFooter className="border-t p-4">
|
| 76 |
+
<div className="text-center text-xs text-muted-foreground group-data-[collapsible=icon]:hidden">
|
| 77 |
+
© 2025 Edu Path AI
|
| 78 |
+
</div>
|
| 79 |
+
</SidebarFooter>
|
| 80 |
+
<SidebarRail />
|
| 81 |
+
</Sidebar>
|
| 82 |
+
)
|
| 83 |
+
}
|
next/src/components/footer.tsx
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import Link from "next/link"
|
| 2 |
+
import { GraduationCap, Mail, Phone, MapPin } from "lucide-react"
|
| 3 |
+
|
| 4 |
+
export function Footer() {
|
| 5 |
+
return (
|
| 6 |
+
<footer className="border-t bg-card">
|
| 7 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8 py-12">
|
| 8 |
+
<div className="grid grid-cols-1 gap-8 md:grid-cols-2 lg:grid-cols-4">
|
| 9 |
+
{/* Brand */}
|
| 10 |
+
<div className="space-y-4">
|
| 11 |
+
<Link href="/" className="flex items-center gap-2 font-semibold text-lg">
|
| 12 |
+
<div className="flex h-10 w-10 items-center justify-center rounded-lg bg-primary">
|
| 13 |
+
<GraduationCap className="h-6 w-6 text-primary-foreground" />
|
| 14 |
+
</div>
|
| 15 |
+
<span>Edu Path AI</span>
|
| 16 |
+
</Link>
|
| 17 |
+
<p className="text-sm text-muted-foreground leading-relaxed">
|
| 18 |
+
Empowering students with AI-driven career guidance and personalized university recommendations for a brighter future.
|
| 19 |
+
</p>
|
| 20 |
+
</div>
|
| 21 |
+
|
| 22 |
+
{/* Quick Links */}
|
| 23 |
+
<div>
|
| 24 |
+
<h3 className="font-semibold mb-4">Quick Links</h3>
|
| 25 |
+
<ul className="space-y-3 text-sm">
|
| 26 |
+
<li>
|
| 27 |
+
<Link href="/" className="text-muted-foreground hover:text-primary transition-colors">
|
| 28 |
+
Home
|
| 29 |
+
</Link>
|
| 30 |
+
</li>
|
| 31 |
+
<li>
|
| 32 |
+
<Link href="/about" className="text-muted-foreground hover:text-primary transition-colors">
|
| 33 |
+
About Us
|
| 34 |
+
</Link>
|
| 35 |
+
</li>
|
| 36 |
+
<li>
|
| 37 |
+
<Link href="/blog" className="text-muted-foreground hover:text-primary transition-colors">
|
| 38 |
+
Career Blog
|
| 39 |
+
</Link>
|
| 40 |
+
</li>
|
| 41 |
+
<li>
|
| 42 |
+
<Link href="/contact" className="text-muted-foreground hover:text-primary transition-colors">
|
| 43 |
+
Contact
|
| 44 |
+
</Link>
|
| 45 |
+
</li>
|
| 46 |
+
</ul>
|
| 47 |
+
</div>
|
| 48 |
+
|
| 49 |
+
{/* Solutions */}
|
| 50 |
+
<div>
|
| 51 |
+
<h3 className="font-semibold mb-4">Our Services</h3>
|
| 52 |
+
<ul className="space-y-3 text-sm">
|
| 53 |
+
<li className="text-muted-foreground">Psychometric Testing</li>
|
| 54 |
+
<li className="text-muted-foreground">University Finder</li>
|
| 55 |
+
<li className="text-muted-foreground">4-Year Roadmap</li>
|
| 56 |
+
<li className="text-muted-foreground">Market Trend Analysis</li>
|
| 57 |
+
</ul>
|
| 58 |
+
</div>
|
| 59 |
+
|
| 60 |
+
{/* Contact Info */}
|
| 61 |
+
<div>
|
| 62 |
+
<h3 className="font-semibold mb-4">Contact Us</h3>
|
| 63 |
+
<ul className="space-y-3 text-sm">
|
| 64 |
+
<li className="flex items-start gap-2 text-muted-foreground">
|
| 65 |
+
<Mail className="h-4 w-4 mt-0.5 shrink-0" />
|
| 66 |
+
<span>support@edupathai.com</span>
|
| 67 |
+
</li>
|
| 68 |
+
<li className="flex items-start gap-2 text-muted-foreground">
|
| 69 |
+
<Phone className="h-4 w-4 mt-0.5 shrink-0" />
|
| 70 |
+
<span>+92 (334) 061-5582</span>
|
| 71 |
+
</li>
|
| 72 |
+
<li className="flex items-start gap-2 text-muted-foreground">
|
| 73 |
+
<MapPin className="h-4 w-4 mt-0.5 shrink-0" />
|
| 74 |
+
<span>Lahore Garrison University, Lahore</span>
|
| 75 |
+
</li>
|
| 76 |
+
</ul>
|
| 77 |
+
</div>
|
| 78 |
+
</div>
|
| 79 |
+
|
| 80 |
+
<div className="mt-12 pt-8 border-t text-center text-sm text-muted-foreground">
|
| 81 |
+
<p>© {new Date().getFullYear()} Edu Path AI. All rights reserved.</p>
|
| 82 |
+
</div>
|
| 83 |
+
</div>
|
| 84 |
+
</footer>
|
| 85 |
+
)
|
| 86 |
+
}
|
next/src/components/navbar.tsx
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"use client"
|
| 2 |
+
|
| 3 |
+
import Link from "next/link"
|
| 4 |
+
import { usePathname } from "next/navigation"
|
| 5 |
+
import { Button } from "@/components/ui/button"
|
| 6 |
+
import { GraduationCap, Menu, X } from "lucide-react"
|
| 7 |
+
import { useState } from "react"
|
| 8 |
+
import { cn } from "@/lib/utils"
|
| 9 |
+
|
| 10 |
+
export function Navbar() {
|
| 11 |
+
const pathname = usePathname()
|
| 12 |
+
const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
|
| 13 |
+
|
| 14 |
+
const navItems = [
|
| 15 |
+
{ href: "/", label: "Home" },
|
| 16 |
+
{ href: "/about-us", label: "About" },
|
| 17 |
+
{ href: "/features", label: "Features" },
|
| 18 |
+
{ href: "/blogs", label: "Blog" },
|
| 19 |
+
{ href: "/contact-us", label: "Contact" },
|
| 20 |
+
]
|
| 21 |
+
|
| 22 |
+
return (
|
| 23 |
+
<nav className="sticky top-0 z-50 border-b bg-background/95 backdrop-blur supports-backdrop-filter:bg-background/60">
|
| 24 |
+
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
| 25 |
+
<div className="flex h-16 items-center justify-between">
|
| 26 |
+
{/* Logo */}
|
| 27 |
+
<Link href="/" className="flex items-center gap-2 font-semibold text-lg">
|
| 28 |
+
<div className="flex h-10 w-10 items-center justify-center rounded-lg bg-primary">
|
| 29 |
+
<GraduationCap className="h-6 w-6 text-primary-foreground" />
|
| 30 |
+
</div>
|
| 31 |
+
<span className="text-foreground">Edu Path AI</span>
|
| 32 |
+
</Link>
|
| 33 |
+
|
| 34 |
+
{/* Desktop Navigation */}
|
| 35 |
+
<div className="hidden md:flex md:items-center md:gap-8">
|
| 36 |
+
{navItems.map((item) => (
|
| 37 |
+
<Link
|
| 38 |
+
key={item.href}
|
| 39 |
+
href={item.href}
|
| 40 |
+
className={cn(
|
| 41 |
+
"text-sm font-medium transition-colors hover:text-primary",
|
| 42 |
+
pathname === item.href ? "text-primary" : "text-muted-foreground",
|
| 43 |
+
)}
|
| 44 |
+
>
|
| 45 |
+
{item.label}
|
| 46 |
+
</Link>
|
| 47 |
+
))}
|
| 48 |
+
</div>
|
| 49 |
+
|
| 50 |
+
{/* CTA Button */}
|
| 51 |
+
<div className="hidden md:block">
|
| 52 |
+
<Button asChild>
|
| 53 |
+
<Link href="/login">Get Started</Link>
|
| 54 |
+
</Button>
|
| 55 |
+
</div>
|
| 56 |
+
|
| 57 |
+
{/* Mobile Menu Button */}
|
| 58 |
+
<button className="md:hidden" onClick={() => setMobileMenuOpen(!mobileMenuOpen)} aria-label="Toggle menu">
|
| 59 |
+
{mobileMenuOpen ? <X className="h-6 w-6" /> : <Menu className="h-6 w-6" />}
|
| 60 |
+
</button>
|
| 61 |
+
</div>
|
| 62 |
+
|
| 63 |
+
{/* Mobile Navigation */}
|
| 64 |
+
{mobileMenuOpen && (
|
| 65 |
+
<div className="border-t py-4 md:hidden">
|
| 66 |
+
<div className="flex flex-col gap-4">
|
| 67 |
+
{navItems.map((item) => (
|
| 68 |
+
<Link
|
| 69 |
+
key={item.href}
|
| 70 |
+
href={item.href}
|
| 71 |
+
onClick={() => setMobileMenuOpen(false)}
|
| 72 |
+
className={cn(
|
| 73 |
+
"text-sm font-medium transition-colors hover:text-primary",
|
| 74 |
+
pathname === item.href ? "text-primary" : "text-muted-foreground",
|
| 75 |
+
)}
|
| 76 |
+
>
|
| 77 |
+
{item.label}
|
| 78 |
+
</Link>
|
| 79 |
+
))}
|
| 80 |
+
<Button asChild className="w-full">
|
| 81 |
+
<Link href="/login" onClick={() => setMobileMenuOpen(false)}>
|
| 82 |
+
Get Started
|
| 83 |
+
</Link>
|
| 84 |
+
</Button>
|
| 85 |
+
</div>
|
| 86 |
+
</div>
|
| 87 |
+
)}
|
| 88 |
+
</div>
|
| 89 |
+
</nav>
|
| 90 |
+
)
|
| 91 |
+
}
|
next/src/components/ui/avatar.tsx
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"use client"
|
| 2 |
+
|
| 3 |
+
import * as React from "react"
|
| 4 |
+
import * as AvatarPrimitive from "@radix-ui/react-avatar"
|
| 5 |
+
|
| 6 |
+
import { cn } from "@/lib/utils"
|
| 7 |
+
|
| 8 |
+
function Avatar({
|
| 9 |
+
className,
|
| 10 |
+
...props
|
| 11 |
+
}: React.ComponentProps<typeof AvatarPrimitive.Root>) {
|
| 12 |
+
return (
|
| 13 |
+
<AvatarPrimitive.Root
|
| 14 |
+
data-slot="avatar"
|
| 15 |
+
className={cn(
|
| 16 |
+
"relative flex size-8 shrink-0 overflow-hidden rounded-full",
|
| 17 |
+
className
|
| 18 |
+
)}
|
| 19 |
+
{...props}
|
| 20 |
+
/>
|
| 21 |
+
)
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
function AvatarImage({
|
| 25 |
+
className,
|
| 26 |
+
...props
|
| 27 |
+
}: React.ComponentProps<typeof AvatarPrimitive.Image>) {
|
| 28 |
+
return (
|
| 29 |
+
<AvatarPrimitive.Image
|
| 30 |
+
data-slot="avatar-image"
|
| 31 |
+
className={cn("aspect-square size-full", className)}
|
| 32 |
+
{...props}
|
| 33 |
+
/>
|
| 34 |
+
)
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
function AvatarFallback({
|
| 38 |
+
className,
|
| 39 |
+
...props
|
| 40 |
+
}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {
|
| 41 |
+
return (
|
| 42 |
+
<AvatarPrimitive.Fallback
|
| 43 |
+
data-slot="avatar-fallback"
|
| 44 |
+
className={cn(
|
| 45 |
+
"bg-muted flex size-full items-center justify-center rounded-full",
|
| 46 |
+
className
|
| 47 |
+
)}
|
| 48 |
+
{...props}
|
| 49 |
+
/>
|
| 50 |
+
)
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
export { Avatar, AvatarImage, AvatarFallback }
|
next/src/components/ui/badge.tsx
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import * as React from "react"
|
| 2 |
+
import { Slot } from "@radix-ui/react-slot"
|
| 3 |
+
import { cva, type VariantProps } from "class-variance-authority"
|
| 4 |
+
|
| 5 |
+
import { cn } from "@/lib/utils"
|
| 6 |
+
|
| 7 |
+
const badgeVariants = cva(
|
| 8 |
+
"inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
|
| 9 |
+
{
|
| 10 |
+
variants: {
|
| 11 |
+
variant: {
|
| 12 |
+
default:
|
| 13 |
+
"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
|
| 14 |
+
secondary:
|
| 15 |
+
"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
|
| 16 |
+
destructive:
|
| 17 |
+
"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
|
| 18 |
+
outline:
|
| 19 |
+
"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
|
| 20 |
+
},
|
| 21 |
+
},
|
| 22 |
+
defaultVariants: {
|
| 23 |
+
variant: "default",
|
| 24 |
+
},
|
| 25 |
+
}
|
| 26 |
+
)
|
| 27 |
+
|
| 28 |
+
function Badge({
|
| 29 |
+
className,
|
| 30 |
+
variant,
|
| 31 |
+
asChild = false,
|
| 32 |
+
...props
|
| 33 |
+
}: React.ComponentProps<"span"> &
|
| 34 |
+
VariantProps<typeof badgeVariants> & { asChild?: boolean }) {
|
| 35 |
+
const Comp = asChild ? Slot : "span"
|
| 36 |
+
|
| 37 |
+
return (
|
| 38 |
+
<Comp
|
| 39 |
+
data-slot="badge"
|
| 40 |
+
className={cn(badgeVariants({ variant }), className)}
|
| 41 |
+
{...props}
|
| 42 |
+
/>
|
| 43 |
+
)
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
export { Badge, badgeVariants }
|