Compare commits

...

17 Commits

Author SHA1 Message Date
Shanmuga Krishnan S M
47f4269bf6 merge: pull latest main from github repository
Some checks failed
Deploy RIT Freshers Hub to VPS / Deploy to Live VPS (push) Has been cancelled
2026-08-13 11:39:31 +05:30
Amudieshwar
b953624446 Update club details from presentation, remove member count, reset likes to 0, and add Telugu club logo 2026-08-12 14:32:33 +05:30
Shanmuga Krishnan S M
bce9b544f3 revert: undo UI changes from commit 17c981e 2026-08-12 13:36:52 +05:30
Shanmuga Krishnan S M
d087827283 fix(notes): fix missing closing div tag in Notes.tsx 2026-08-12 13:27:56 +05:30
Shanmuga Krishnan S M
0a9ff3964b merge: sync remote github/main with local main 2026-08-12 12:22:16 +05:30
Devesh S
38a64783d3 separate Toolkit into standalone page and route 2026-08-07 14:47:19 +05:30
Devesh S
17c981eec0 adjust ui and bus route 2026-08-07 14:47:19 +05:30
Shanmuga Krishnan S M
5d02cfc7ee fix(bus-map): completely remove route polyline lines from map, focus strictly on clean map & live GPS bus markers 2026-08-07 14:47:19 +05:30
Shanmuga Krishnan S M
0a94f2fc65 fix(email): fix UnicodeEncodeError in print output, format App Password without spaces, add UTF-8 sys.stdout reconfigure 2026-08-07 14:47:19 +05:30
Shanmuga Krishnan S M
0e22ad7b66 docs: add email automation setup guide 2026-08-07 14:47:18 +05:30
Shanmuga Krishnan S M
31e562ab89 fix(bus-map): remove polyline route line overlay 2026-08-07 14:47:18 +05:30
Shanmuga Krishnan S M
31a1b66b74 ci: update recipient email to dorutoslayer@gmail.com 2026-08-07 14:47:18 +05:30
Shanmuga Krishnan S M
e1d7dee45f test(ci): verify automated email push report notification system 2026-08-07 14:47:18 +05:30
Shanmuga Krishnan S M
5c8754a155 ci: update git notification scripts with email credentials 2026-08-07 14:47:18 +05:30
Amudieshwar A G
75002ffbb2 Merge pull request #7 from Amudieshwar-AG/feature/notes-pyqs
feat(notes): integrate official RIT Moodle portal hub for notes and PYQs
2026-08-07 11:24:17 +05:30
Amudieshwar A G
e1f3fe2ec2 feat(notes): integrate official RIT Moodle portal hub for notes and PYQs 2026-08-07 11:20:37 +05:30
Amudieshwar A G
70694da2e2 feat(notes): integrate official RIT Moodle portal hub for notes and PYQs 2026-08-07 11:20:01 +05:30
10 changed files with 1456 additions and 530 deletions

View File

@@ -1,7 +1,7 @@
# ─── DATABASE CONNECTION CONFIGURATION ─── # ─── DATABASE CONNECTION CONFIGURATION ───
spring.datasource.url=jdbc:postgresql://localhost:5432/rit_freshers_hub?sslmode=disable spring.datasource.url=jdbc:postgresql://localhost:5432/rit_freshers_hub?sslmode=disable
spring.datasource.username=postgres spring.datasource.username=postgres
spring.datasource.password=${DB_PASSWORD:Amudiesh22@.} spring.datasource.password=${DB_PASSWORD:Devesh@54}
# ─── JPA / HIBERNATE SETTINGS ─── # ─── JPA / HIBERNATE SETTINGS ───
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

42
package-lock.json generated
View File

@@ -1776,9 +1776,6 @@
"x64" "x64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3602,9 +3599,6 @@
"arm" "arm"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3619,9 +3613,6 @@
"arm" "arm"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3636,9 +3627,6 @@
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3653,9 +3641,6 @@
"arm64" "arm64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3670,9 +3655,6 @@
"loong64" "loong64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3687,9 +3669,6 @@
"loong64" "loong64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3704,9 +3683,6 @@
"ppc64" "ppc64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3721,9 +3697,6 @@
"ppc64" "ppc64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3738,9 +3711,6 @@
"riscv64" "riscv64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3755,9 +3725,6 @@
"riscv64" "riscv64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3772,9 +3739,6 @@
"s390x" "s390x"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3789,9 +3753,6 @@
"x64" "x64"
], ],
"dev": true, "dev": true,
"libc": [
"glibc"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [
@@ -3806,9 +3767,6 @@
"x64" "x64"
], ],
"dev": true, "dev": true,
"libc": [
"musl"
],
"license": "MIT", "license": "MIT",
"optional": true, "optional": true,
"os": [ "os": [

BIN
public/clubs/telugu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

View File

@@ -6,6 +6,7 @@ import ProtectedRoute from '@/components/Auth/ProtectedRoute';
import MainLayout from '@/layouts/MainLayout'; import MainLayout from '@/layouts/MainLayout';
import Home from '@/pages/Home/Home'; import Home from '@/pages/Home/Home';
import Notes from '@/pages/Notes/Notes'; import Notes from '@/pages/Notes/Notes';
import Toolkit from '@/pages/Toolkit/Toolkit';
import AIAssistant from '@/pages/AIAssistant/AIAssistant'; import AIAssistant from '@/pages/AIAssistant/AIAssistant';
import Campus from '@/pages/Campus/Campus'; import Campus from '@/pages/Campus/Campus';
import Events from '@/pages/Events/Events'; import Events from '@/pages/Events/Events';
@@ -49,6 +50,7 @@ function App() {
<Route element={<MainLayout />}> <Route element={<MainLayout />}>
<Route path="/" element={<Home />} /> <Route path="/" element={<Home />} />
<Route path="/notes" element={<Notes />} /> <Route path="/notes" element={<Notes />} />
<Route path="/toolkit" element={<Toolkit />} />
<Route path="/ai-assistant" element={<AIAssistant />} /> <Route path="/ai-assistant" element={<AIAssistant />} />
<Route path="/campus" element={<Campus />} /> <Route path="/campus" element={<Campus />} />
<Route path="/bus-routes" element={<BusRoutes />} /> <Route path="/bus-routes" element={<BusRoutes />} />

View File

@@ -44,7 +44,7 @@ function MapPanFocus({ center }: { center: [number, number] | null }) {
interface BusRouteMapProps { interface BusRouteMapProps {
selectedRoute: BusRoute | null; selectedRoute: BusRoute | null;
allRoutes: BusRoute[]; allRoutes?: BusRoute[];
} }
const DEFAULT_CENTER: [number, number] = [13.0118, 80.0214]; // RIT Campus default const DEFAULT_CENTER: [number, number] = [13.0118, 80.0214]; // RIT Campus default

View File

@@ -94,7 +94,7 @@ export const FEATURES: Feature[] = [
icon: 'Wrench', icon: 'Wrench',
title: 'Student Toolkit', title: 'Student Toolkit',
description: 'Download timetables, academic calendar, syllabus, forms, and ERP guides.', description: 'Download timetables, academic calendar, syllabus, forms, and ERP guides.',
path: '/notes?section=toolkit', path: '/toolkit',
color: '#06B6D4', color: '#06B6D4',
bgColor: '#ECFEFF', bgColor: '#ECFEFF',
}, },
@@ -523,259 +523,114 @@ export const EVENTS_DATA: Event[] = [
// ─── Clubs ─────────────────────────────────────────────────────────────────── // ─── Clubs ───────────────────────────────────────────────────────────────────
export const CLUBS_DATA: Club[] = [ export const CLUBS_DATA: Club[] = [
{
id: 'stellar_space_tech',
name: 'STELLAR SPACE TECH CLUB',
description: 'Space technology, astronomy, satellite systems, and space science exploration at RIT.',
details: 'RIT Stellar Space Tech Club brings together space enthusiasts, students, and aspiring aerospace engineers to explore astronomy, satellite communication, rocketry, and cutting-edge space technology through workshops, observational sessions, and technical projects.',
category: 'Technical',
members: 94,
presidentName: 'Student Space Lead',
year: 'Senior Year',
contactEmail: 'spacetech@ritchennai.edu.in',
contactPhone: '+91 98765 43210',
icon: 'Rocket',
logoUrl: '/clubs/stellar_space_tech.png',
socialLinks: {
instagram: 'https://www.instagram.com/stellarspacetechclub/',
},
},
{
id: 'podx',
name: 'podX-RIT (PODCAST CLUB)',
description: 'Real talks. Raw feels. Because every story deserves to be heard. Official Podcast Club of RIT.',
details: 'podX-RIT is the official Podcast and Radio Club of Rajalakshmi Institute of Technology. Bringing student stories, Switcheroo interviews, RJ sessions, and inspiring student & faculty conversations to life.',
category: 'Creative',
members: 1097,
presidentName: 'Lead RJ / Podcaster',
year: 'Senior Year',
contactEmail: 'podx@ritchennai.edu.in',
contactPhone: '+91 98765 43211',
icon: 'Mic',
logoUrl: '/clubs/podx.png',
socialLinks: {
instagram: 'https://www.instagram.com/podxrit/',
website: 'https://linktr.ee/podxrit',
},
},
{ {
id: 'nss', id: 'nss',
name: 'NSS OF RIT', name: 'NSS OF RIT',
description: 'National Service Scheme – "Not Me, But You." Official Social Service Club of RIT.', description: 'National Service Scheme – "Not Me, But You." Official Social Service Club of RIT.',
details: 'NSS of Rajalakshmi Institute of Technology engages students in community service, social awareness drives, blood donation camps, road safety campaigns, and nation-building initiatives.', details: 'NSS of Rajalakshmi Institute of Technology engages students in community service, SVEEP electoral literacy rallies, coastal beach cleanups, blood donation camps, and national service initiatives.',
category: 'Social', category: 'Social',
members: 1306, members: 1306,
presidentName: 'NSS Student Lead', presidentName: 'Pooja S (CSE)',
year: 'Final Year', vicePresidentName: 'Harish A (CSE)',
coordinatorName: 'Pradakshina Rajesh Bhavani (AI&DS)',
year: 'Senior Year',
contactEmail: 'nss@ritchennai.edu.in', contactEmail: 'nss@ritchennai.edu.in',
contactPhone: '+91 98765 43212', contactPhone: '+91 8668130804',
icon: 'HeartHandshake', icon: 'HeartHandshake',
logoUrl: '/clubs/nss.png', logoUrl: '/clubs/nss.png',
socialLinks: { socialLinks: {
instagram: 'https://www.instagram.com/nss.rit/', instagram: 'https://www.instagram.com/nss.rit/',
}, },
}, },
{
id: 'artist_league',
name: 'ARTIST LEAGUE (CULTURAL CELL)',
description: 'Official Cultural Cell of RIT covering Dance (R-Square), Band (Euphoria), Rap & Classical.',
details: 'Artist League is the umbrella cultural organization of RIT incorporating R-Square (Dance), Euphoria (Band), Raptology (Rap), and Classic Beat (Classical). It organizes cultural fests, talent shows, and 60 Seconds to Fame competitions.',
category: 'Creative',
members: 1093,
presidentName: 'Cultural Secretary',
year: 'Final Year',
contactEmail: 'artistleague@ritchennai.edu.in',
contactPhone: '+91 98765 43213',
icon: 'Sparkles',
logoUrl: '/clubs/artist_league.png',
socialLinks: {
instagram: 'https://www.instagram.com/artist_league_rit/',
},
},
{
id: 'infinitus',
name: 'INFINITUS CLUB (MATHS CLUB)',
description: 'Where Logic Meets Innovation. Mathematics workshops, PiDoku, GraphQuest & tech competitions.',
details: 'Infinitus Club is the official Mathematics & Aptitude Club of RIT, hosting Pi-Quest, PiDoku Decode π, GraphQuest, logic puzzles, speed calculations, and analytical problem-solving workshops.',
category: 'Technical',
members: 557,
presidentName: 'Mathematics Lead',
year: 'Third Year',
contactEmail: 'infinitus@ritchennai.edu.in',
contactPhone: '+91 98765 43214',
icon: 'Calculator',
logoUrl: '/clubs/infinitus.png',
socialLinks: {
instagram: 'https://www.instagram.com/infinitus_club.rit/',
whatsapp: 'https://chat.whatsapp.com/LeCKYtgzdzJ5E6sL0WjYIHf',
},
},
{
id: 'vaarithi',
name: 'VAARITHI TAMIL CLUB',
description: 'இராசலட்சுமி தொழில்நுட்பக் கல்லூரியின் மாணவர் தமிழ் மன்றம் (RIT Tamil Mandram).',
details: 'Vaarithi Muthamizh Mandram of RIT celebrates Tamil literature, poetry, debate (Tamizhsudar), Tamil New Year celebrations, and preserving rich Tamil culture and heritage.',
category: 'Creative',
members: 848,
presidentName: 'Tamil Mandram Lead',
year: 'Final Year',
contactEmail: 'vaarithi@ritchennai.edu.in',
contactPhone: '+91 98765 43215',
icon: 'BookOpen',
logoUrl: '/clubs/vaarithi.png',
socialLinks: {
instagram: 'https://www.instagram.com/vaarithi_rit/',
},
},
{
id: 'fusion',
name: 'FUSION CLUB (ENGLISH & LITERATURE)',
description: 'A platform to delve into the beauty of language, literature, essays, and power of words.',
details: 'Fusion Club of RIT is the English Literary Club organizing essay writing contests, Lips Don’t Lie games, Fusion Treasure Hunt, debates, and creative writing workshops.',
category: 'Creative',
members: 815,
presidentName: 'Literary President',
year: 'Third Year',
contactEmail: 'fusionclub@ritchennai.edu.in',
contactPhone: '+91 98765 43216',
icon: 'Languages',
logoUrl: '/clubs/fusion.png',
socialLinks: {
instagram: 'https://www.instagram.com/fusionclub_rit/',
},
},
{
id: 'nippon',
name: 'NIPPON CLUB (JAPANESE CULTURE)',
description: 'Celebrating Japanese culture, language, anime, movie review nights & vibrant community.',
details: 'Nippon Club of RIT brings Japanese language learning, Kizuna Canvas relay drawing, Koe Nashi voice challenge, anime screenings, and Japanese cultural immersion to RIT students.',
category: 'Creative',
members: 649,
presidentName: 'Nippon President',
year: 'Third Year',
contactEmail: 'nippon@ritchennai.edu.in',
contactPhone: '+91 98765 43217',
icon: 'Globe',
logoUrl: '/clubs/nippon.png',
socialLinks: {
instagram: 'https://www.instagram.com/nippon_rit/',
},
},
{ {
id: 'unnat_bharat', id: 'unnat_bharat',
name: 'RIT UNNAT BHARAT ABHIYAN (UBA)', name: 'RIT UNNAT BHARAT ABHIYAN (UBA)',
description: 'Unite, socialize, thrive together! Official Social Impact & Rural Development Club.', description: 'Unite, socialize, thrive together! Official Social Impact & Rural Development Club.',
details: 'RIT Unnat Bharat Abhiyan (UBA) club focuses on sustainable village development, plantation drives, environmental awareness, and impactful social initiatives across rural Tamil Nadu.', details: 'RIT Unnat Bharat Abhiyan (UBA) focuses on sustainable village development, sapling plantation, eco-park restoration, child welfare, and SVEEP voter literacy.',
category: 'Social', category: 'Social',
members: 1153, members: 1153,
presidentName: 'UBA Core Lead', presidentName: 'Viswajith R S (CSBS)',
year: 'Final Year', vicePresidentName: 'Supeckshana M (CSE)',
coordinatorName: 'Dr. S. Niranjana (VLSI)',
year: 'Senior Year',
contactEmail: 'uba@ritchennai.edu.in', contactEmail: 'uba@ritchennai.edu.in',
contactPhone: '+91 98765 43218', contactPhone: '+91 7305642992',
icon: 'Users', icon: 'Users',
logoUrl: '/clubs/unnat_bharat.png', logoUrl: '/clubs/unnat_bharat.png',
socialLinks: { socialLinks: {
instagram: 'https://www.instagram.com/ritunnatbharatabhiyan/', instagram: 'https://www.instagram.com/ritunnatbharatabhiyan/',
}, },
}, },
{
id: 'mediastic',
name: 'MEDIASTIC HUB (SOCIAL MEDIA CLUB)',
description: 'Official Social Media & Digital Content Creation Club of Rajalakshmi Institute of Technology.',
details: 'Mediastic Hub handles official video production, campus media coverage, event highlights for RobochipX & Quant-a-thon, photography exhibitions, and RIT digital channels.',
category: 'Creative',
members: 1351,
presidentName: 'Media Hub Lead',
year: 'Final Year',
contactEmail: 'mediastichub@ritchennai.edu.in',
contactPhone: '+91 98765 43219',
icon: 'Camera',
logoUrl: '/clubs/mediastic.png',
socialLinks: {
instagram: 'https://www.instagram.com/mediastichub_rit/',
youtube: 'https://www.youtube.com/@rajalakshmiinstituteoftech444',
},
},
{
id: 'helios',
name: 'HELIOS RIT (PHOTOGRAPHY CLUB)',
description: 'Capturing Life\'s Moments, One Frame at a Time. Showcasing cinematic shots & campus stories.',
details: 'Helios RIT Official is the premier photography and filmmaking club of RIT, capturing campus events, hosting photography contests, guest lectures, and showcasing cinematic stories of RIT.',
category: 'Creative',
members: 2455,
presidentName: 'Photography Lead',
year: 'Final Year',
contactEmail: 'helios@ritchennai.edu.in',
contactPhone: '+91 98765 43220',
icon: 'Camera',
logoUrl: '/clubs/helios.png',
socialLinks: {
instagram: 'https://www.instagram.com/helios.rit/',
},
},
{
id: 'techspark',
name: 'TECHSPARK CLUB RIT',
description: 'Where Tech meets creativity, Sparks fly! Fostering innovation in every byte.',
details: 'TechSpark Club RIT is the technical innovation club driving Web3 Camp Meets AI, GirlScript hackathons, Spark Booths, coding competitions, and hands-on developer projects.',
category: 'Technical',
members: 672,
presidentName: 'TechSpark Lead',
year: 'Third Year',
contactEmail: 'techspark@ritchennai.edu.in',
contactPhone: '+91 98765 43221',
icon: 'Zap',
logoUrl: '/clubs/techspark.png',
socialLinks: {
instagram: 'https://www.instagram.com/techspark.rit/',
whatsapp: 'https://chat.whatsapp.com/I8B5Wdybrew2dYYDrE4PG',
},
},
{
id: 'wec',
name: 'WOMEN EMPOWERMENT CELL (WEC)',
description: 'Empower • Excel • Elevate. Supporting women in technology, leadership & coding.',
details: 'Women Empowerment Cell (WEC RIT) organizes She Shines @ Hexaware coding challenges, Women’s Empowerment Week, ZYRA Days, leadership seminars, and career development initiatives.',
category: 'Social',
members: 428,
presidentName: 'Pooja WYA',
year: 'Final Year',
contactEmail: 'wec@ritchennai.edu.in',
contactPhone: '+91 98765 43222',
icon: 'Sparkles',
logoUrl: '/clubs/wec.png',
socialLinks: {
instagram: 'https://www.instagram.com/wec.rit/',
},
},
{ {
id: 'rotaract', id: 'rotaract',
name: 'ROTARACT CLUB OF RIT (RCRIT)', name: 'ROTARACT CLUB OF RIT (RCRIT)',
description: 'Embrace the joy of giving. Official Rotaract organization for leadership & service.', description: 'Embrace the joy of giving. Official Rotaract organization for leadership & service.',
details: 'Rotaract Club of RIT (RCRIT) under Rotary International sponsors Bloom mental health seminars, Phoenix fests, RITARIQ 365, Ryla leadership camps, and community blood donation drives.', details: 'Rotaract Club of RIT (RCRIT) under Rotary International conducts campus & beach cleanups, blood donation drives, scribe support for differently-abled students, and leadership workshops.',
category: 'Social', category: 'Social',
members: 1813, members: 1813,
presidentName: 'Hari Balaji', presidentName: 'Hari Balaji (VLSI)',
year: 'Final Year', vicePresidentName: 'Danish (VLSI)',
coordinatorName: 'Rotaract Faculty Lead',
year: 'Senior Year',
contactEmail: 'rotaract@ritchennai.edu.in', contactEmail: 'rotaract@ritchennai.edu.in',
contactPhone: '+91 98765 43223', contactPhone: '+91 7200696226',
icon: 'HeartHandshake', icon: 'HeartHandshake',
logoUrl: '/clubs/rotaract.png', logoUrl: '/clubs/rotaract.png',
socialLinks: { socialLinks: {
instagram: 'https://www.instagram.com/rcrit/', instagram: 'https://www.instagram.com/rcrit/',
}, },
}, },
{
id: 'yrc',
name: 'YOUTH RED CROSS (YRC)',
description: 'Civic responsibility, humanitarian concern & health awareness for social good.',
details: 'Youth Red Cross (YRC) of RIT organizes voluntary blood donation camps, orphanage outreach drives, Serve-a-Thon hackathons, dengue awareness, and anti-ragging initiatives.',
category: 'Social',
members: 950,
presidentName: 'Pream Kumar (CSE)',
vicePresidentName: 'Julinsa (CSE)',
coordinatorName: 'Niraimathy Marthandan (Biotech)',
year: 'Senior Year',
contactEmail: 'yrc@ritchennai.edu.in',
contactPhone: '+91 9344061221',
icon: 'Heart',
logoUrl: '/clubs/nss.png',
socialLinks: {
instagram: 'https://www.instagram.com/yrc.rit/',
},
},
{
id: 'wec',
name: 'WOMEN EMPOWERMENT CELL (WEC)',
description: 'Empower • Excel • Elevate. Supporting women in technology, leadership & coding.',
details: 'Women Empowerment Cell (WEC RIT) organizes Vision Board Parties, AI For Her hackathons, International Women’s Day health awareness, self-defense sessions, and leadership seminars.',
category: 'Social',
members: 428,
presidentName: 'Harini R M (ECE)',
vicePresidentName: 'Indhuvadhani M (ECE)',
coordinatorName: 'Ms. N. Suganthi (ECE)',
year: 'Third Year',
contactEmail: 'wec@ritchennai.edu.in',
contactPhone: '+91 6385227710',
icon: 'Sparkles',
logoUrl: '/clubs/wec.png',
socialLinks: {
instagram: 'https://www.instagram.com/wec.rit/',
},
},
{ {
id: 'yuva', id: 'yuva',
name: 'Yi-CH YUVA RIT', name: 'Yi-CH YUVA RIT',
description: 'Official Page of YUVA Club RIT under Young Indians (Yi). Inspiring youth leadership.', description: 'Official Page of YUVA Club RIT under Young Indians (Yi). Inspiring youth leadership.',
details: 'Yi-CH YUVA RIT leads Chennai Get Talent, Safe Miles road safety awareness, Blogathons, Tree Plantation drives (500 Trees Mission), and youth leadership conventions.', details: 'Yi-CH YUVA RIT collaborates with CII and Young Indians Chennai Chapter to lead youth leadership summits, civic awareness drives, blood donation camps, and community projects.',
category: 'Social', category: 'Social',
members: 1460, members: 1460,
presidentName: 'YUVA Student Chair', presidentName: 'Hari Haran G',
year: 'Final Year', vicePresidentName: 'Pradakshina RB',
coordinatorName: 'YUVA Faculty Lead',
year: 'Senior Year',
contactEmail: 'yuva@ritchennai.edu.in', contactEmail: 'yuva@ritchennai.edu.in',
contactPhone: '+91 98765 43224', contactPhone: '+91 9677043565',
icon: 'Rocket', icon: 'Rocket',
logoUrl: '/clubs/yuva.png', logoUrl: '/clubs/yuva.png',
socialLinks: { socialLinks: {
@@ -785,14 +640,16 @@ export const CLUBS_DATA: Club[] = [
{ {
id: 'wistem', id: 'wistem',
name: 'WiSTEM CLUB OF RIT', name: 'WiSTEM CLUB OF RIT',
description: 'Women in STEM Club. AI Quests, STEM Chronicles, CodeVsClick & maker empowering events.', description: 'Women in STEM Club. Technical ideathons, coding quests & empowering STEM events.',
details: 'WiSTEM Club of RIT empowers women in Science, Technology, Engineering, and Mathematics through AI Quests, STEM Chronicles newsletter, CodeVsClick contests, and technical workshops.', details: 'WiSTEM Club of RIT empowers women in STEM through technical ideathons, coding challenges, leadership workshops, and cross-disciplinary technical collaborations.',
category: 'Technical', category: 'Technical',
members: 453, members: 453,
presidentName: 'WiSTEM Lead', presidentName: 'Aseema S (III CSE)',
year: 'Third Year', vicePresidentName: 'Keerthana S (III CSE)',
coordinatorName: 'Dr. J. Anitha (H&S)',
year: 'III Year, CSE',
contactEmail: 'wistem@ritchennai.edu.in', contactEmail: 'wistem@ritchennai.edu.in',
contactPhone: '+91 98765 43225', contactPhone: '+91 9600110150',
icon: 'Atom', icon: 'Atom',
logoUrl: '/clubs/wistem.png', logoUrl: '/clubs/wistem.png',
socialLinks: { socialLinks: {
@@ -800,23 +657,216 @@ export const CLUBS_DATA: Club[] = [
website: 'https://www.rityatra.in/', website: 'https://www.rityatra.in/',
}, },
}, },
{
id: 'techspark',
name: 'TECHSPARK CLUB RIT',
description: 'Where Tech meets creativity, Sparks fly! Fostering innovation in every byte.',
details: 'TechSpark Club RIT provides hands-on technical skill development, coding competitions, web development workshops, and collaborative developer activities.',
category: 'Technical',
members: 672,
presidentName: 'Devaprakash J (AIML)',
vicePresidentName: 'Barath S (AIML)',
coordinatorName: 'Prof. Avudai Selvi (CSE)',
year: 'Senior Year',
contactEmail: 'techspark@ritchennai.edu.in',
contactPhone: '+91 8667466390',
icon: 'Zap',
logoUrl: '/clubs/techspark.png',
socialLinks: {
instagram: 'https://www.instagram.com/techspark.rit/',
},
},
{
id: 'infinitus',
name: 'INFINITUS CLUB (MATHS CLUB)',
description: 'Where Logic Meets Innovation. Mathematics workshops, PiDoku, GraphQuest & puzzles.',
details: 'Infinitus Club is the official Mathematics & Aptitude Club of RIT, hosting Expilog, Pi Day celebrations, math quizzes, graph theory challenges, and logic problem-solving events.',
category: 'Technical',
members: 557,
presidentName: 'Austin Joshua M',
vicePresidentName: 'Sanjay Y (III ECE)',
coordinatorName: 'Dr. A. Thilagavathy Vinoth (H&S)',
year: 'Third Year',
contactEmail: 'infinitus@ritchennai.edu.in',
contactPhone: '+91 8838552068',
icon: 'Calculator',
logoUrl: '/clubs/infinitus.png',
socialLinks: {
instagram: 'https://www.instagram.com/infinitus_club.rit/',
},
},
{ {
id: 'steam', id: 'steam',
name: 'STEAM CLUB RIT', name: 'STEAM CLUB RIT',
description: 'Innovate - Collaborate - Elevate. Hands-on RobochipX, Quant-a-thon & AI/Chip design.', description: 'Innovate - Collaborate - Elevate. Hands-on STEAM projects, techbytes & debugging.',
details: 'STEAM Club RIT focuses on hands-on project creation, RobochipX 24-hour hackathons, Quant-a-thon quantum technology events, chip design, and robotics innovations.', details: 'STEAM Club RIT integrates Science, Technology, Engineering, Arts, and Mathematics through TechBytes news hunts, code debugging competitions, and interdisciplinary engineering challenges.',
category: 'Technical', category: 'Technical',
members: 895, members: 895,
presidentName: 'STEAM President', presidentName: 'Aditya (III VLSI)',
year: 'Final Year', vicePresidentName: 'Abhi Harish (III VLSI)',
coordinatorName: 'Mr. Mohan Ram (AP/ECE)',
year: 'III Year, VLSI',
contactEmail: 'steamclub@ritchennai.edu.in', contactEmail: 'steamclub@ritchennai.edu.in',
contactPhone: '+91 98765 43226', contactPhone: '+91 7550271227',
icon: 'Printer', icon: 'Printer',
logoUrl: '/clubs/steam.png', logoUrl: '/clubs/steam.png',
socialLinks: { socialLinks: {
instagram: 'https://www.instagram.com/steam_club.rit/', instagram: 'https://www.instagram.com/steam_club.rit/',
}, },
}, },
{
id: 'artist_league',
name: 'ARTIST LEAGUE (CULTURAL CELL)',
description: 'Official Cultural Cell of RIT covering Dance, Music, Band & Performing Arts.',
details: 'Artist League is the flagship cultural club of RIT, discovering and nurturing artistic talent through talent hunts, intra- and inter-collegiate cultural fests, music performances, and dance shows.',
category: 'Creative',
members: 1093,
presidentName: 'Christopher (III CSE)',
vicePresidentName: 'Jonathi (III AIDS)',
coordinatorName: 'Prof. Shri Janani P (CSE)',
year: 'III Year, CSE',
contactEmail: 'artistleague@ritchennai.edu.in',
contactPhone: '+91 9025726185',
icon: 'Sparkles',
logoUrl: '/clubs/artist_league.png',
socialLinks: {
instagram: 'https://www.instagram.com/artist_league_rit/',
},
},
{
id: 'vaarithi',
name: 'VAARITHI TAMIL CLUB',
description: 'இராசலட்சுமி தொழில்நுட்பக் கல்லூரியின் மாணவர் தமிழ் மன்றம் (RIT Tamil Mandram).',
details: 'Vaarithi Muthamizh Mandram celebrates Tamil culture, literature, traditional arts, debates, book reviews, and civic awareness campaigns.',
category: 'Creative',
members: 848,
presidentName: 'Shamithraa S R (III AIML)',
vicePresidentName: 'Sarvesh V (III VLSI)',
coordinatorName: 'Mr. Keerthana Pandiyan (Biotech)',
year: 'III Year, AIML',
contactEmail: 'vaarithi@ritchennai.edu.in',
contactPhone: '+91 8248701027',
icon: 'BookOpen',
logoUrl: '/clubs/vaarithi.png',
socialLinks: {
instagram: 'https://www.instagram.com/vaarithi_rit/',
},
},
{
id: 'nippon',
name: 'NIPPON CLUB (JAPANESE CULTURE)',
description: 'Celebrating Japanese culture, language orientation, JLPT guidance & cross-cultural events.',
details: 'Nippon Club of RIT brings Japanese culture, JLPT orientation, peace walks, Japanese art activities, face painting competitions, and joint cultural celebrations.',
category: 'Creative',
members: 649,
presidentName: 'Vasanth S',
vicePresidentName: 'Farren Jeanvil',
coordinatorName: 'Ms. Roopavathi',
year: 'Third Year',
contactEmail: 'nippon@ritchennai.edu.in',
contactPhone: '+91 9042294493',
icon: 'Globe',
logoUrl: '/clubs/nippon.png',
socialLinks: {
instagram: 'https://www.instagram.com/nippon_rit/',
},
},
{
id: 'podx',
name: 'podX-RIT (PODCAST CLUB)',
description: 'Real talks. Raw feels. Official Podcast & Radio Club of RIT.',
details: 'podX-RIT organizes live and online podcast sessions, Mini FM recordings, student RJ training, celebrity interviews, and tech-demystifying talk shows.',
category: 'Creative',
members: 1097,
presidentName: 'Sharan R (III ECE)',
vicePresidentName: 'Thirumalai (III VLSI)',
coordinatorName: 'Ms. Fouzia Sulthana (AIDS)',
year: 'III Year, ECE',
contactEmail: 'podx@ritchennai.edu.in',
contactPhone: '+91 9962840247',
icon: 'Mic',
logoUrl: '/clubs/podx.png',
socialLinks: {
instagram: 'https://www.instagram.com/podxrit/',
website: 'https://linktr.ee/podxrit',
},
},
{
id: 'mediastic',
name: 'MEDIASTIC HUB (SOCIAL MEDIA CLUB)',
description: 'Official Social Media & Digital Content Creation Club of RIT.',
details: 'Mediastic Hub creates digital content, video promos, reels, and provides full photography/videography coverage for campus events and digital campaigns.',
category: 'Creative',
members: 1351,
presidentName: 'Sarvesh (III AIDS)',
vicePresidentName: 'Bindu (III CCE)',
coordinatorName: 'Dr. Fredrick Ignatius (H&S)',
year: 'III Year, AIDS',
contactEmail: 'mediastichub@ritchennai.edu.in',
contactPhone: '+91 7200184347',
icon: 'Camera',
logoUrl: '/clubs/mediastic.png',
socialLinks: {
instagram: 'https://www.instagram.com/mediastichub_rit/',
},
},
{
id: 'fusion',
name: 'FUSION CLUB (ENGLISH & LITERATURE)',
description: 'Delving into language, literature, debates, essay contests & creative writing.',
details: 'Fusion Club of RIT promotes English literature, essay blitzes, debates, literary games, and creative writing competitions for public speaking and communication skills.',
category: 'Creative',
members: 815,
presidentName: 'Vishal Raswanth (III VLSI)',
vicePresidentName: 'Shreya S (III CSBS)',
coordinatorName: 'Dr. Jessintha (H&S)',
year: 'III Year, VLSI',
contactEmail: 'fusionclub@ritchennai.edu.in',
contactPhone: '+91 9884918444',
icon: 'Languages',
logoUrl: '/clubs/fusion.png',
socialLinks: {
instagram: 'https://www.instagram.com/fusionclub_rit/',
},
},
{
id: 'telugu',
name: 'TELUGU CLUB',
description: 'Promoting Telugu language, heritage, traditional celebrations & cultural values.',
details: 'Telugu Club of RIT celebrates Telugu heritage through Vinayaka Chavithi and Ugadi festivals, cultural performances, visual puzzles, and multi-club cultural events.',
category: 'Creative',
members: 650,
presidentName: 'Rakesh (III AIML)',
vicePresidentName: 'Bhavitha (III AIML)',
coordinatorName: 'Mrs. Sowjanaya Kasi (CSE)',
year: 'III Year, AIML',
contactEmail: 'telugu@ritchennai.edu.in',
contactPhone: '+91 8125483223',
icon: 'BookOpen',
logoUrl: '/clubs/telugu.png',
socialLinks: {
instagram: 'https://www.instagram.com/teluguclub.rit/',
},
},
{
id: 'helios',
name: 'HELIOS RIT (PHOTOGRAPHY CLUB)',
description: "Capturing Life's Moments, One Frame at a Time. Photography & media coverage.",
details: 'Helios RIT handles photography and videography for major campus celebrations, independence day events, visual documentation, and creative photo contests.',
category: 'Creative',
members: 2455,
presidentName: 'Shai Sharan P N',
vicePresidentName: 'Sudharsan Raju (III AIML)',
coordinatorName: 'Helios Faculty Lead',
year: 'Senior Year',
contactEmail: 'helios@ritchennai.edu.in',
contactPhone: '+91 98765 43220',
icon: 'Camera',
logoUrl: '/clubs/helios.png',
socialLinks: {
instagram: 'https://www.instagram.com/helios.rit/',
},
},
]; ];
// ─── Community Q&A ─────────────────────────────────────────────────────────── // ─── Community Q&A ───────────────────────────────────────────────────────────

View File

@@ -66,15 +66,18 @@ const QUIZ_QUESTIONS = [
id: 'interest', id: 'interest',
title: '1. What topics or domains are you most interested in?', title: '1. What topics or domains are you most interested in?',
options: [ options: [
{ label: '🚀 Space Tech, Astronomy & Rocketry', clubIds: ['stellar_space_tech', 'infinitus'] },
{ label: '⚙️ AI Quests, Chip Design, RobochipX & STEM', clubIds: ['steam', 'wistem', 'techspark'] }, { label: '⚙️ AI Quests, Chip Design, RobochipX & STEM', clubIds: ['steam', 'wistem', 'techspark'] },
{ label: '🎙️ Radio, Podcasting, Storytelling & RJing', clubIds: ['podx', 'mediastic'] }, { label: '🎙️ Radio, Podcasting, Storytelling & RJing', clubIds: ['podx', 'mediastic'] },
{ label: '🤝 Community Service, Village Development & NSS Drives', clubIds: ['nss', 'unnat_bharat'] }, { label: '🤝 Community Service, Village Development & NSS Drives', clubIds: ['nss', 'unnat_bharat', 'rotaract'] },
{ label: '🩸 Blood Donation, Health Camps & Humanitarian Relief', clubIds: ['yrc', 'nss', 'rotaract'] },
{ label: '🎭 Dance, Music, Band & Cultural Arts', clubIds: ['artist_league', 'podx'] }, { label: '🎭 Dance, Music, Band & Cultural Arts', clubIds: ['artist_league', 'podx'] },
{ label: '🧮 Fast Calculation, PiDoku, Logic & Mathematics', clubIds: ['infinitus', 'stellar_space_tech'] }, { label: '🧮 Fast Calculation, PiDoku, Logic & Mathematics', clubIds: ['infinitus', 'steam'] },
{ label: '✍️ Tamil Literature, Debates & Cultural Heritage', clubIds: ['vaarithi', 'fusion'] }, { label: '✍️ Tamil Literature, Debates & Cultural Heritage', clubIds: ['vaarithi', 'fusion'] },
{ label: '🏛️ Telugu Culture, Festival Celebrations & Heritage', clubIds: ['telugu', 'fusion'] },
{ label: '🌸 Japanese Culture, Anime, Manga & Foreign Languages', clubIds: ['nippon', 'fusion'] }, { label: '🌸 Japanese Culture, Anime, Manga & Foreign Languages', clubIds: ['nippon', 'fusion'] },
{ label: '📷 Photo/Video Production & Social Media Content', clubIds: ['mediastic', 'helios', 'podx'] }, { label: '📷 Photo/Video Production & Social Media Content', clubIds: ['mediastic', 'helios', 'podx'] },
{ label: '✨ Women Empowerment, Leadership & Career Vision', clubIds: ['wec', 'wistem'] },
{ label: '🚀 Youth Leadership, Yi Networking & National Summits', clubIds: ['yuva', 'rotaract'] },
], ],
}, },
{ {
@@ -82,13 +85,15 @@ const QUIZ_QUESTIONS = [
title: '2. What skills do you currently have or want to develop?', title: '2. What skills do you currently have or want to develop?',
options: [ options: [
{ label: '💻 Web3, AI Tools, Circuit Design & Coding Hackathons', clubIds: ['wistem', 'steam', 'techspark'] }, { label: '💻 Web3, AI Tools, Circuit Design & Coding Hackathons', clubIds: ['wistem', 'steam', 'techspark'] },
{ label: '🌌 Space Science & Physics Problem Solving', clubIds: ['stellar_space_tech', 'infinitus'] },
{ label: '🎙️ Public Speaking, Interviewing & Voice Recording', clubIds: ['podx', 'mediastic'] }, { label: '🎙️ Public Speaking, Interviewing & Voice Recording', clubIds: ['podx', 'mediastic'] },
{ label: '🤝 Social Work, Environmental Protection & Leadership', clubIds: ['nss', 'unnat_bharat'] }, { label: '🤝 Social Work, Environmental Protection & Leadership', clubIds: ['nss', 'unnat_bharat', 'rotaract'] },
{ label: '🩸 Health Awareness, Blood Drive Logistics & Disaster Relief', clubIds: ['yrc', 'nss'] },
{ label: '🕺 Stage Performance, Singing, Dance & Rap', clubIds: ['artist_league'] }, { label: '🕺 Stage Performance, Singing, Dance & Rap', clubIds: ['artist_league'] },
{ label: '📐 Analytical Thinking, Logic Puzzles & Aptitude', clubIds: ['infinitus'] }, { label: '📐 Analytical Thinking, Logic Puzzles & Aptitude', clubIds: ['infinitus'] },
{ label: '📝 Essay Writing, Tamil/English Oratory & Literature', clubIds: ['vaarithi', 'fusion'] }, { label: '📝 Essay Writing, Tamil/Telugu/English Oratory & Literature', clubIds: ['vaarithi', 'telugu', 'fusion'] },
{ label: '🎥 Camera Operations, Video Editing & Digital Media', clubIds: ['mediastic', 'helios'] }, { label: '🎥 Camera Operations, Video Editing & Digital Media', clubIds: ['mediastic', 'helios'] },
{ label: '🌟 Women Leadership, Self Defense & Mentorship', clubIds: ['wec', 'wistem'] },
{ label: '👑 Youth Representation, Project Management & Event Planning', clubIds: ['yuva', 'rotaract'] },
], ],
}, },
{ {
@@ -96,11 +101,13 @@ const QUIZ_QUESTIONS = [
title: '3. What is your main goal for joining a club at RIT?', title: '3. What is your main goal for joining a club at RIT?',
options: [ options: [
{ label: '🤖 Build hackathon projects, chip designs & STEM innovations', clubIds: ['steam', 'wistem', 'techspark'] }, { label: '🤖 Build hackathon projects, chip designs & STEM innovations', clubIds: ['steam', 'wistem', 'techspark'] },
{ label: '🚀 Work on aerospace tech & scientific projects', clubIds: ['stellar_space_tech', 'infinitus'] },
{ label: '🌟 Share inspiring stories & host campus podcasts', clubIds: ['podx', 'mediastic'] }, { label: '🌟 Share inspiring stories & host campus podcasts', clubIds: ['podx', 'mediastic'] },
{ label: '👥 Drive social change & serve rural communities', clubIds: ['nss', 'unnat_bharat'] }, { label: '👥 Drive social change & serve rural communities', clubIds: ['nss', 'unnat_bharat'] },
{ label: '🩸 Organize blood donation drives & health protection campaigns', clubIds: ['yrc', 'rotaract'] },
{ label: '🏆 Perform live at cultural fests & stage shows', clubIds: ['artist_league', 'vaarithi'] }, { label: '🏆 Perform live at cultural fests & stage shows', clubIds: ['artist_league', 'vaarithi'] },
{ label: '📖 Master new languages & explore world cultures', clubIds: ['nippon', 'fusion', 'vaarithi'] }, { label: '📖 Master new languages & explore world/regional cultures', clubIds: ['nippon', 'telugu', 'vaarithi', 'fusion'] },
{ label: '💪 Empower women in STEM & corporate leadership', clubIds: ['wec', 'wistem'] },
{ label: '💼 Connect with Young Indians (Yi), CII & Industry Leaders', clubIds: ['yuva', 'rotaract'] },
], ],
}, },
]; ];
@@ -111,37 +118,38 @@ export default function Events() {
// ─── Interactive Like / Favorite System State ───────────────────────────── // ─── Interactive Like / Favorite System State ─────────────────────────────
const [likedClubs, setLikedClubs] = useState<Set<string>>(() => { const [likedClubs, setLikedClubs] = useState<Set<string>>(() => {
try { try {
const saved = localStorage.getItem('rit_freshers_liked_clubs'); localStorage.removeItem('rit_freshers_liked_clubs');
return saved ? new Set(JSON.parse(saved)) : new Set(['podx', 'stellar_space_tech']); const saved = localStorage.getItem('rit_freshers_liked_clubs_v3');
return saved ? new Set(JSON.parse(saved)) : new Set();
} catch { } catch {
return new Set(['podx', 'stellar_space_tech']); return new Set();
} }
}); });
const [likesMap, setLikesMap] = useState<Record<string, number>>(() => { const [likesMap, setLikesMap] = useState<Record<string, number>>(() => {
const initialMap: Record<string, number> = {}; const initialMap: Record<string, number> = {};
CLUBS_DATA.forEach((c, idx) => { CLUBS_DATA.forEach((c) => {
initialMap[c.id] = Math.round(c.members * 0.42) + (idx % 5) * 14 + 35; initialMap[c.id] = 0;
}); });
return initialMap; return initialMap;
}); });
const toggleLike = (clubId: string) => { const toggleLike = (clubId: string) => {
setLikedClubs((prev) => { const isCurrentlyLiked = likedClubs.has(clubId);
const next = new Set(prev); const next = new Set(likedClubs);
const isCurrentlyLiked = next.has(clubId);
if (isCurrentlyLiked) { if (isCurrentlyLiked) {
next.delete(clubId); next.delete(clubId);
setLikesMap((l) => ({ ...l, [clubId]: Math.max(0, (l[clubId] || 1) - 1) })); setLikesMap((l) => ({ ...l, [clubId]: Math.max(0, (l[clubId] || 1) - 1) }));
} else { } else {
next.add(clubId); next.add(clubId);
setLikesMap((l) => ({ ...l, [clubId]: (l[clubId] || 0) + 1 })); setLikesMap((l) => ({ ...l, [clubId]: (l[clubId] || 0) + 1 }));
} }
try {
localStorage.setItem('rit_freshers_liked_clubs', JSON.stringify(Array.from(next))); setLikedClubs(next);
} catch {} try {
return next; localStorage.setItem('rit_freshers_liked_clubs_v3', JSON.stringify(Array.from(next)));
}); } catch {}
}; };
// ─── Club Matcher Quiz State (Feature 1) ───────────────────────────────── // ─── Club Matcher Quiz State (Feature 1) ─────────────────────────────────
@@ -284,7 +292,7 @@ export default function Events() {
</div> </div>
)} )}
{/* Like Button & Members Count */} {/* Like Button */}
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<motion.button <motion.button
whileHover={{ scale: 1.08 }} whileHover={{ scale: 1.08 }}
@@ -302,11 +310,6 @@ export default function Events() {
<Heart className={`w-3.5 h-3.5 ${isLiked ? 'fill-rose-500 text-rose-500' : ''}`} /> <Heart className={`w-3.5 h-3.5 ${isLiked ? 'fill-rose-500 text-rose-500' : ''}`} />
<span>{likesCount}</span> <span>{likesCount}</span>
</motion.button> </motion.button>
<div className="flex items-center gap-1 text-xs text-[#94A3B8] bg-slate-50 px-2 py-1 rounded-full border border-slate-100">
<Users className="w-3.5 h-3.5 text-slate-400" />
<span>{club.members}</span>
</div>
</div> </div>
</div> </div>
@@ -472,7 +475,7 @@ export default function Events() {
<span className="font-bold text-sm text-[#1E293B]">{item.club.name}</span> <span className="font-bold text-sm text-[#1E293B]">{item.club.name}</span>
{i === 0 && <span className="px-2 py-0.5 rounded-full text-[10px] font-bold bg-amber-100 text-amber-700">Top Match 🏆</span>} {i === 0 && <span className="px-2 py-0.5 rounded-full text-[10px] font-bold bg-amber-100 text-amber-700">Top Match 🏆</span>}
</div> </div>
<span className="text-xs text-slate-500">{item.club.category} Club • {item.club.members} members</span> <span className="text-xs text-slate-500">{item.club.category} Club</span>
</div> </div>
</div> </div>
<span className="px-3 py-1 rounded-full text-xs font-bold bg-emerald-50 text-emerald-600 border border-emerald-200 shrink-0"> <span className="px-3 py-1 rounded-full text-xs font-bold bg-emerald-50 text-emerald-600 border border-emerald-200 shrink-0">
@@ -601,16 +604,31 @@ export default function Events() {
</div> </div>
</div> </div>
{/* Year Card - Purple Theme */} {/* Vice President Card - Violet Theme */}
<div className="bg-purple-50/80 border border-purple-100 hover:border-purple-300 transition-colors rounded-2xl p-3.5 flex items-center gap-3"> {selectedClub.vicePresidentName && (
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-purple-500 to-purple-600 text-white flex items-center justify-center shadow-xs shadow-purple-200 shrink-0"> <div className="bg-violet-50/80 border border-violet-100 hover:border-violet-300 transition-colors rounded-2xl p-3.5 flex items-center gap-3">
<GraduationCap className="w-5 h-5 text-white" /> <div className="w-10 h-10 rounded-xl bg-gradient-to-br from-violet-500 to-violet-600 text-white flex items-center justify-center shadow-xs shadow-violet-200 shrink-0">
<Users className="w-5 h-5 text-white" />
</div>
<div>
<span className="text-[11px] text-violet-500 font-semibold block">Vice President</span>
<span className="text-sm font-bold text-violet-950">{selectedClub.vicePresidentName}</span>
</div>
</div> </div>
<div> )}
<span className="text-[11px] text-purple-500 font-semibold block">Year & Department</span>
<span className="text-sm font-bold text-purple-950">{selectedClub.year || 'Senior Year'}</span> {/* Coordinator Card - Amber Theme */}
{selectedClub.coordinatorName && (
<div className="bg-amber-50/80 border border-amber-100 hover:border-amber-300 transition-colors rounded-2xl p-3.5 flex items-center gap-3">
<div className="w-10 h-10 rounded-xl bg-gradient-to-br from-amber-500 to-amber-600 text-white flex items-center justify-center shadow-xs shadow-amber-200 shrink-0">
<GraduationCap className="w-5 h-5 text-white" />
</div>
<div>
<span className="text-[11px] text-amber-600 font-semibold block">Faculty Coordinator</span>
<span className="text-sm font-bold text-amber-950">{selectedClub.coordinatorName}</span>
</div>
</div> </div>
</div> )}
{/* Email Card - Emerald Theme */} {/* Email Card - Emerald Theme */}
<div className="bg-emerald-50/80 border border-emerald-100 hover:border-emerald-300 transition-colors rounded-2xl p-3.5 flex items-center gap-3"> <div className="bg-emerald-50/80 border border-emerald-100 hover:border-emerald-300 transition-colors rounded-2xl p-3.5 flex items-center gap-3">

View File

@@ -1,8 +1,10 @@
import { useState, useRef, useEffect } from 'react'; import { useState, useRef, useEffect } from 'react';
import { useSearchParams } from 'react-router-dom'; import { useSearchParams } from 'react-router-dom';
import { motion } from 'framer-motion'; import { motion } from 'framer-motion';
import { Search, Download, Filter, BookOpen, FileText, ScrollText, BookMarked, ChevronRight, ArrowLeft, ExternalLink, Code, Globe, GitBranch, Cloud, Palette, Shield, DollarSign, BarChart3, Users, Megaphone, TrendingUp, UserCheck, ClipboardList, ShoppingCart, Cpu, Activity, LayoutGrid, Layers, Zap, Settings, Gauge, Radio, Wifi, Bot, Sun, Wrench, Binary, BatteryCharging, CircuitBoard, ShieldCheck, BrainCircuit, FlaskConical, Lock, Terminal, Dna, Microscope, Sparkles, Smartphone, Monitor, Server, CheckCircle2, Database, Briefcase, AlertTriangle } from 'lucide-react'; import { Search, Download, Filter, BookOpen, FileText, ScrollText, BookMarked, ChevronRight, ArrowLeft, ExternalLink, Code, Globe, GitBranch, Cloud, Palette, Shield, DollarSign, BarChart3, Users, Megaphone, TrendingUp, UserCheck, ClipboardList, ShoppingCart, Cpu, Activity, LayoutGrid, Layers, Zap, Settings, Gauge, Radio, Wifi, Bot, Sun, Wrench, Binary, BatteryCharging, CircuitBoard, ShieldCheck, BrainCircuit, FlaskConical, Lock, Terminal, Dna, Microscope, Sparkles, Smartphone, Monitor, Server, CheckCircle2, Database, Briefcase, AlertTriangle, RefreshCw } from 'lucide-react';
import SectionTitle from '@/components/SectionTitle/SectionTitle'; import SectionTitle from '@/components/SectionTitle/SectionTitle';
const MOODLE_URL = 'http://182.74.17.142/moodle/login/index.php';
import { getBackendUrl } from '@/lib/utils'; import { getBackendUrl } from '@/lib/utils';
import { StaggerContainer, StaggerItem } from '@/components/AnimatedContainer/AnimatedContainer'; import { StaggerContainer, StaggerItem } from '@/components/AnimatedContainer/AnimatedContainer';
import { TOOLKIT_ITEMS, DEPARTMENTS } from '@/constants'; import { TOOLKIT_ITEMS, DEPARTMENTS } from '@/constants';
@@ -1432,27 +1434,7 @@ export default function Notes() {
)} )}
<div className="container-custom py-10"> <div className="container-custom py-10">
{/* Under Development Banner */}
<motion.div
initial={{ opacity: 0, y: -10 }}
animate={{ opacity: 1, y: 0 }}
className="bg-amber-50 border border-amber-200 rounded-2xl p-4 flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 text-amber-900 shadow-2xs mb-8"
>
<div className="flex items-center gap-3">
<div className="w-9 h-9 rounded-xl bg-amber-500/10 border border-amber-500/20 flex items-center justify-center shrink-0">
<AlertTriangle className="w-5 h-5 text-amber-600" />
</div>
<div>
<div className="text-xs font-bold uppercase tracking-wider text-amber-700" style={{ fontFamily: 'Inter, sans-serif' }}>Under Development</div>
<div className="text-xs font-medium text-amber-900" style={{ fontFamily: 'Inter, sans-serif' }}>
Currently displaying sample mock notes & syllabus data. Official semester notes repository integration is in progress.
</div>
</div>
</div>
<span className="px-3 py-1 rounded-full bg-amber-100 border border-amber-300 text-[11px] font-bold text-amber-800 shrink-0">
Mock Data Active
</span>
</motion.div>
{selectedToolkit ? ( {selectedToolkit ? (
(() => { (() => {
@@ -1936,222 +1918,116 @@ export default function Notes() {
})() })()
) : ( ) : (
<div> <div>
{/* Search + Filters */} <div className="mb-12">
{/* Moodle Academic Portal Hero Hub */}
<motion.div <motion.div
initial={{ opacity: 0, y: 16 }} initial={{ opacity: 0, y: 16 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4, delay: 0.1 }} transition={{ duration: 0.4 }}
className="bg-white rounded-2xl border border-[#E5E7EB] p-5 mb-8" className="bg-white rounded-3xl border border-[#E5E7EB] p-8 md:p-10 shadow-sm relative overflow-hidden mb-8"
style={{ boxShadow: '0 2px 15px -3px rgba(0,0,0,0.07)' }} style={{ boxShadow: '0 4px 25px -5px rgba(0,0,0,0.05)' }}
> >
{/* Search */} {/* Subtle Decorative Background Glow */}
<div className="relative mb-4"> <div className="absolute -right-20 -top-20 w-80 h-80 bg-orange-500/5 rounded-full blur-3xl pointer-events-none" />
<Search className="absolute left-4 top-1/2 -translate-y-1/2 w-4.5 h-4.5 text-[#94A3B8]" /> <div className="absolute -left-20 -bottom-20 w-80 h-80 bg-amber-500/5 rounded-full blur-3xl pointer-events-none" />
<input
type="text"
placeholder="Search notes, subjects..."
value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)}
className="w-full pl-11 pr-4 py-3 rounded-xl border border-[#E5E7EB] text-sm text-[#1E293B] placeholder-[#94A3B8] focus:outline-none focus:border-[#F97316] transition-colors"
style={{ fontFamily: 'Inter, sans-serif' }}
/>
</div>
<div className="flex flex-wrap gap-3"> <div className="relative z-10 max-w-3xl mx-auto text-center">
{/* Type Filter */} {/* Header Badge */}
<div className="flex items-center gap-2 flex-wrap"> <div className="inline-flex items-center gap-2 px-3.5 py-1.5 rounded-full bg-orange-50 border border-orange-200 text-xs font-bold text-[#F97316] mb-6">
<Filter className="w-4 h-4 text-[#94A3B8]" /> <BookOpen className="w-4 h-4 text-[#F97316]" />
{['all', 'notes', 'pyq', 'syllabus'].map((type) => ( <span>Official RIT Learning Management System</span>
<button
key={type}
onClick={() => setSelectedType(type)}
className="px-3 py-1.5 rounded-lg text-xs font-medium capitalize transition-all"
style={{
fontFamily: 'Poppins, sans-serif',
backgroundColor: selectedType === type ? '#F97316' : '#F8FAFC',
color: selectedType === type ? 'white' : '#475569',
border: `1px solid ${selectedType === type ? '#F97316' : '#E5E7EB'}`,
}}
>
{type === 'all' ? 'All Types' : type.toUpperCase()}
</button>
))}
</div> </div>
{/* Semester Filter */} {/* Main Heading */}
<div className="flex gap-2 flex-wrap items-center"> <h2 className="text-3xl sm:text-4xl font-extrabold text-[#1E293B] mb-4 leading-tight" style={{ fontFamily: 'Playfair Display, serif' }}>
{SEMESTERS.slice(0, 3).map((sem) => ( Access Academic Notes & Study Materials on{' '}
<button <span style={{ background: 'linear-gradient(135deg, #F97316, #FB923C)', WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', backgroundClip: 'text' }}>
key={sem} Moodle
onClick={() => { setSelectedSem(sem); setSelectedSubject('All Subjects'); }} </span>
className="px-3 py-1.5 rounded-lg text-xs font-medium transition-all cursor-pointer" </h2>
style={{
fontFamily: 'Poppins, sans-serif', <p className="text-base text-[#64748B] mb-8 leading-relaxed max-w-2xl mx-auto" style={{ fontFamily: 'Inter, sans-serif' }}>
backgroundColor: selectedSem === sem ? '#1E293B' : '#F8FAFC', All official semester notes, previous year question papers (PYQs), syllabus data, and lab manuals are hosted directly on the official Rajalakshmi Institute of Technology Moodle server.
color: selectedSem === sem ? 'white' : '#475569', </p>
border: `1px solid ${selectedSem === sem ? '#1E293B' : '#E5E7EB'}`,
}} {/* Primary Launch Action Buttons */}
> <div className="flex flex-col sm:flex-row items-center justify-center gap-4 mb-10">
{sem} <a
</button> href={MOODLE_URL}
))} target="_blank"
rel="noopener noreferrer"
className="w-full sm:w-auto inline-flex items-center justify-center gap-3 px-8 py-4 rounded-2xl text-base font-bold text-white shadow-lg hover:shadow-xl hover:-translate-y-0.5 transition-all cursor-pointer"
style={{
fontFamily: 'Poppins, sans-serif',
background: 'linear-gradient(135deg, #F97316, #FB923C)',
}}
>
<ExternalLink className="w-5 h-5" />
Launch Official RIT Moodle Portal
</a>
<button
onClick={() => {
navigator.clipboard.writeText(MOODLE_URL);
alert('Moodle URL copied to clipboard!');
}}
className="w-full sm:w-auto inline-flex items-center justify-center gap-2 px-6 py-4 rounded-2xl border border-[#E5E7EB] hover:border-[#F97316] bg-[#F8FAFC] hover:bg-white text-sm font-semibold text-[#475569] hover:text-[#F97316] transition-all cursor-pointer"
style={{ fontFamily: 'Poppins, sans-serif' }}
>
<Globe className="w-4 h-4 text-[#64748B]" />
Copy Moodle Direct URL
</button>
</div> </div>
{/* Subject Dropdown */} {/* Feature Highlights Grid */}
{selectedSem !== 'All' && ( <div className="grid grid-cols-1 md:grid-cols-3 gap-4 text-left border-t border-[#F1F5F9] pt-8">
<div className="flex items-center gap-2"> <div className="p-4 rounded-2xl bg-[#F8FAFC] border border-[#E5E7EB]/70 flex flex-col gap-2">
<span className="text-xs font-semibold text-[#64748B]" style={{ fontFamily: 'Poppins, sans-serif' }}>Subject:</span> <div className="w-8 h-8 rounded-xl bg-emerald-500/10 border border-emerald-500/20 flex items-center justify-center text-emerald-600">
<select <ShieldCheck className="w-4 h-4" />
value={selectedSubject} </div>
onChange={(e) => setSelectedSubject(e.target.value)} <div className="text-xs font-bold text-[#1E293B]" style={{ fontFamily: 'Poppins, sans-serif' }}>
className="px-3 py-1.5 rounded-lg text-xs font-medium bg-[#F8FAFC] border border-[#E5E7EB] text-[#475569] focus:outline-none focus:border-[#F97316] transition-all cursor-pointer" 100% Direct & Secure
style={{ fontFamily: 'Poppins, sans-serif' }} </div>
> <div className="text-[11px] text-[#64748B]" style={{ fontFamily: 'Inter, sans-serif' }}>
<option value="All Subjects">All Subjects</option> Authenticates directly on official college server <code className="bg-slate-200/80 px-1 py-0.5 rounded text-[10px]">182.74.17.142</code>.
{(SUBJECTS_BY_SEM[parseInt(selectedSem)] || []).map((sub) => ( </div>
<option key={sub} value={sub}>
{sub}
</option>
))}
</select>
</div> </div>
)}
<div className="p-4 rounded-2xl bg-[#F8FAFC] border border-[#E5E7EB]/70 flex flex-col gap-2">
<div className="w-8 h-8 rounded-xl bg-blue-500/10 border border-blue-500/20 flex items-center justify-center text-blue-600">
<FileText className="w-4 h-4" />
</div>
<div className="text-xs font-bold text-[#1E293B]" style={{ fontFamily: 'Poppins, sans-serif' }}>
Official Semester Notes
</div>
<div className="text-[11px] text-[#64748B]" style={{ fontFamily: 'Inter, sans-serif' }}>
Complete 1st to 8th Semester course notes, PYQs, and assignments.
</div>
</div>
<div className="p-4 rounded-2xl bg-[#F8FAFC] border border-[#E5E7EB]/70 flex flex-col gap-2">
<div className="w-8 h-8 rounded-xl bg-purple-500/10 border border-purple-500/20 flex items-center justify-center text-purple-600">
<Lock className="w-4 h-4" />
</div>
<div className="text-xs font-bold text-[#1E293B]" style={{ fontFamily: 'Poppins, sans-serif' }}>
Student Login
</div>
<div className="text-[11px] text-[#64748B]" style={{ fontFamily: 'Inter, sans-serif' }}>
Log in using your RIT Register Number and official Moodle password.
</div>
</div>
</div>
{/* Technical Security Note */}
<div className="mt-6 text-[11px] text-[#94A3B8] leading-relaxed" style={{ fontFamily: 'Inter, sans-serif' }}>
ℹ️ <span className="font-semibold text-[#64748B]">Security Note:</span> To protect student session privacy and prevent clickjacking attacks, RIT&apos;s Moodle server enforces opening the portal directly in a secure browser tab rather than inside third-party frames (<code className="bg-slate-100 px-1 py-0.5 rounded text-[10px]">X-Frame-Options: SAMEORIGIN</code>).
</div>
</div> </div>
</motion.div> </motion.div>
</div>
{/* Results */}
<StaggerContainer key={`${filtered.length}-${selectedSubject}`} className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 mb-12">
{filtered.map((note) => {
const typeConfig = TYPE_COLORS[note.type] || { bg: '#F1F5F9', text: '#475569', icon: BookOpen };
const TypeIcon = typeConfig.icon;
return (
<StaggerItem key={note.id}>
<motion.div
whileHover={{ y: -4 }}
className="bg-white rounded-2xl border border-[#E5E7EB] p-5 flex flex-col justify-between gap-4 h-full"
style={{
borderLeft: `4px solid ${typeConfig.text}`,
boxShadow: '0 2px 15px -3px rgba(0,0,0,0.07)'
}}
>
<div className="flex gap-4">
{/* Visual PDF Preview Icon */}
<div className="w-14 h-20 border border-slate-200 rounded-xl p-2 flex flex-col justify-between bg-[#F8FAFC] shrink-0 shadow-sm">
<div className="bg-[#EF4444] text-[8px] font-extrabold text-white px-1 py-0.5 rounded w-fit uppercase tracking-wider" style={{ fontFamily: 'Poppins, sans-serif' }}>
PDF
</div>
<div className="flex flex-col gap-1.5">
<div className="w-full h-1 bg-slate-200 rounded" />
<div className="w-5/6 h-1 bg-slate-200 rounded" />
<div className="w-2/3 h-1 bg-slate-200 rounded" />
</div>
</div>
{/* Text Details */}
<div className="flex flex-col justify-between flex-1 min-w-0">
<div>
<div className="flex items-center justify-between mb-1.5">
<div className="w-6 h-6 rounded-lg flex items-center justify-center shrink-0" style={{ backgroundColor: typeConfig.bg }}>
<TypeIcon className="w-3.5 h-3.5" style={{ color: typeConfig.text }} />
</div>
<span
className="px-2 py-0.5 rounded-full text-[9px] font-bold uppercase tracking-wider"
style={{ backgroundColor: typeConfig.bg, color: typeConfig.text, fontFamily: 'Poppins, sans-serif' }}
>
{note.type}
</span>
</div>
<h3 className="text-sm font-bold text-[#1E293B] line-clamp-2 leading-tight mb-1" style={{ fontFamily: 'Poppins, sans-serif' }}>
{note.title}
</h3>
<p className="text-[11px] text-[#64748B] font-medium truncate" style={{ fontFamily: 'Inter, sans-serif' }}>
{note.subject} • Sem {note.semester}
</p>
</div>
</div>
</div>
{/* Metadata Line */}
<div className="flex items-center justify-between border-t border-[#F1F5F9] pt-3 text-[11px] text-[#64748B]" style={{ fontFamily: 'Inter, sans-serif' }}>
<div className="flex items-center gap-1.5">
<span className="font-semibold text-slate-800">{note.downloads} downloads · {note.fileSize}</span>
<span className="px-1 py-0.2 bg-[#F1F5F9] rounded text-[9px] font-bold text-slate-600">PDF</span>
</div>
<span>{note.uploadedAt ? `Updated ${note.uploadedAt}` : 'Recently'}</span>
</div>
{/* Download Button */}
<motion.button
whileHover={{ scale: 1.02 }}
whileTap={{ scale: 0.97 }}
onClick={() => handleDownload(note.id, note.downloadUrl)}
className="w-full flex items-center justify-center gap-2 py-2.5 rounded-xl text-sm font-semibold text-white cursor-pointer"
style={{
fontFamily: 'Poppins, sans-serif',
background: 'linear-gradient(135deg, #F97316, #FB923C)',
}}
>
<Download className="w-4 h-4" />
Download
</motion.button>
</motion.div>
</StaggerItem>
);
})}
</StaggerContainer>
{/* Toolkit Section */}
<div ref={toolkitRef} />
<SectionTitle tag="Useful Downloads" title="Student" highlight="Toolkit" align="left" />
<StaggerContainer className="grid grid-cols-1 md:grid-cols-2 gap-6 mb-20">
{TOOLKIT_ITEMS.map((item) => {
const iconConfig = TOOLKIT_ICONS[item.title] || { icon: Code, bg: '#FFF7ED', color: '#F97316' };
const IconComponent = iconConfig.icon;
return (
<StaggerItem key={item.id} className="flex">
<motion.div
onClick={() => {
if (item.title === 'CS tools') {
setSelectedToolkit('cs');
} else if (item.title === 'Business tools') {
setSelectedToolkit('business');
} else if (item.title === 'Electrical and Electronic tools') {
setSelectedToolkit('electrical');
} else if (item.title === 'Cybersecurity tools') {
setSelectedToolkit('cybersecurity');
} else if (item.title === 'AI tools') {
setSelectedToolkit('ai');
} else if (item.title === 'Biotech tools') {
setSelectedToolkit('biotech');
} else if (item.url && item.url !== '#') {
window.open(item.url, '_blank');
}
}}
whileHover={{ y: -4, boxShadow: '0 12px 30px -10px rgba(249,115,22,0.15)' }}
className="flex items-start gap-5 p-7 bg-white hover:bg-[#FFF7ED] rounded-[22px] border border-[#E5E7EB] hover:border-[#FED7AA] cursor-pointer group w-full transition-all shadow-xs hover:shadow-md"
>
<div
className="w-14 h-14 rounded-2xl flex items-center justify-center shrink-0 font-bold text-sm transition-transform group-hover:scale-105"
style={{ backgroundColor: iconConfig.bg, color: iconConfig.color }}
>
<IconComponent className="w-7 h-7" />
</div>
<div className="flex-1 min-w-0">
<div className="text-base lg:text-lg font-bold text-[#1E293B] group-hover:text-[#F97316] transition-colors mb-1" style={{ fontFamily: 'Poppins, sans-serif' }}>
{item.title}
</div>
<div className="text-sm text-[#64748B] leading-relaxed" style={{ fontFamily: 'Inter, sans-serif' }}>
{item.description}
</div>
</div>
<ChevronRight className="w-5 h-5 text-[#94A3B8] group-hover:text-[#F97316] group-hover:translate-x-1.5 transition-all shrink-0 mt-1" />
</motion.div>
</StaggerItem>
);
})}
</StaggerContainer>
</div> </div>
)} </div>
)}
</div> </div>
</div> </div>
); );

File diff suppressed because it is too large Load Diff

View File

@@ -119,6 +119,8 @@ export interface Club {
category: string; category: string;
members: number; members: number;
presidentName?: string; presidentName?: string;
vicePresidentName?: string;
coordinatorName?: string;
year?: string; year?: string;
contactEmail?: string; contactEmail?: string;
contactPhone?: string; contactPhone?: string;