Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 41 additions & 12 deletions src/components/faq.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from "react";
import { Plus, Mail } from "lucide-react";
import { Plus, Mail, MessageSquare, MapPin } from "lucide-react";
import { motion, AnimatePresence } from "framer-motion";

const faqData = [
Expand All @@ -8,10 +8,8 @@ const faqData = [
{ question: "What is the registration deadline?", answer: "Registration closes on 30th April 2026 at 3:00 PM IST. No registrations will be accepted after this deadline.",},

Copilot AI Apr 22, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The FAQ states the registration deadline is "30th April 2026 at 3:00 PM IST", but the timeline (src/components/timeline.jsx event "Registration Closes") still says no entries after 11:59 PM / midnight. Please align these two user-facing sources to the same cutoff time to avoid conflicting information.

Suggested change
{ question: "What is the registration deadline?", answer: "Registration closes on 30th April 2026 at 3:00 PM IST. No registrations will be accepted after this deadline.",},
{ question: "What is the registration deadline?", answer: "Registration closes on 30th April 2026 at 11:59 PM IST. No registrations will be accepted after this deadline.",},

Copilot uses AI. Check for mistakes.
{ question: "Can we use open-source libraries and APIs?", answer: "Yes. Open-source tools, libraries, frameworks, and APIs are permitted. The core idea and implementation must be original and built during the hackathon." },
{ question: "Can team members be from different colleges?", answer: "Yes. Cross-college teams are allowed as long as all members are enrolled students who meet the eligibility criteria.",},
// { question: "What are the hackathon tracks?", answer: "AI, Cybersecurity, Blockchain, Smart India & Sustainability, and Open Innovation." },
{ question: "What is the duration?", answer: "36 hours of continuous development including evaluation rounds and final presentations." },
{ question: "What should I bring?", answer: "Bring your own laptop, charger, and a valid college ID card. ID is mandatory for entry and accommodation."},
// { question: "How are projects evaluated?", answer: "Projects go through internal shortlisting followed by final jury evaluation based on innovation, technical depth, and usability." },
{ question: "Is accommodation available for outstation participants?", answer: "Yes. Separate accommodation for male and female participants is available on campus with ID verification. Contact codex.club@quantumeducation.in or +91 9897301104 for availability and charges.", },
{ question: "How are projects evaluated?", answer: "Projects are shortlisted in Round 1, and top teams present in the Final Round on 9th May. Judging is based on innovation, technical depth, real-world relevance, feasibility, and presentation quality." },
{ question: "What are the prizes?", answer: "Winner: β‚Ή15,000 cash + Trophy + Certificate + Goodies. 1st Runner-Up: β‚Ή10,000 cash + Trophy + Certificate + Goodies. 2nd Runner-Up: β‚Ή5,000 cash + Trophy + Certificate + Goodies. All participants receive goodies (notebook, stickers, pens, bookmark), a free .xyz domain, and a participation certificate." },
Expand Down Expand Up @@ -84,10 +82,10 @@ const FAQ = () => {
id="faq"
className="py-20 sm:py-32 px-4 sm:px-6 relative bg-transparent overflow-hidden"
>
<div className="max-w-7xl mx-auto flex flex-col lg:flex-row gap-12 lg:gap-20 items-start">
<div className="max-w-7xl mx-auto flex flex-col lg:flex-row gap-12 lg:gap-16 items-start">

{/*left side*/}
<div className="w-full lg:w-[40%] lg:sticky lg:top-32">
{/* Left Side */}
<div className="w-full lg:w-[35%] lg:sticky lg:top-32 flex flex-col gap-5">
<motion.div
initial={{ opacity: 0, x: -30 }}
whileInView={{ opacity: 1, x: 0 }}
Expand All @@ -104,8 +102,6 @@ const FAQ = () => {
<p className="text-base sm:text-lg mb-8 text-(--text-muted) text-center lg:text-left">
Everything you need to know about participating in Q-Hackathon 2026. Can't find the answer you're looking for?
</p>

{/*supportbox*/}
<div className="p-6 rounded-2xl border border-(--border-soft) bg-(--bg-card-dark) shadow-sm flex items-start gap-4">
<div className="w-12 h-12 rounded-xl flex items-center justify-center shrink-0" style={{ background: "var(--secondary)" }}>
<Mail size={24} style={{ color: "var(--primary)" }} />
Expand All @@ -118,15 +114,48 @@ const FAQ = () => {
className="text-sm font-bold hover:underline transition-all"
style={{ color: "var(--primary)" }}
>
codex.club@quantumeducation.in &rarr;
codex.club@quantumeducation.in β†’
</a>
</div>
</div>
<div className="mt-5 p-6 rounded-2xl border border-(--border-soft) bg-(--bg-card-dark) shadow-sm flex items-start gap-4">
<div className="w-12 h-12 rounded-xl flex items-center justify-center shrink-0" style={{ background: "var(--secondary)" }}>
<MessageSquare size={24} style={{ color: "var(--primary)" }} />
</div>
<div>
<h4 className="font-bold text-(--text-light) mb-1">Unstop Portal</h4>
<p className="text-sm text-(--text-muted) mb-2">Visit the Unstop Page for More Information.</p>
<a
href="https://unstop.com/p/qhackathon-2026-quantum-university-roorkee-1663126"
className="text-sm font-bold hover:underline transition-all"
style={{ color: "var(--primary)" }}
>
Unstop β†’
</a>
</div>
</div>
<div className="mt-5 p-6 rounded-2xl border border-(--border-soft) bg-(--bg-card-dark) shadow-sm flex items-start gap-4">
<div className="w-12 h-12 rounded-xl flex items-center justify-center shrink-0" style={{ background: "var(--secondary)" }}>
<MapPin size={24} style={{ color: "var(--primary)" }} />
</div>
<div>
<h4 className="font-bold text-(--text-light) mb-1">Hackathon Venue</h4>
<p className="text-sm text-(--text-muted) mb-2">Quantum University Campus, Roorkee, Uttarakhand.</p>
<a
href="https://maps.app.goo.gl/aCz5xghw61opyN84A"
target="_blank"
rel="noopener noreferrer"
className="text-sm font-bold hover:underline transition-all"
style={{ color: "var(--primary)" }}
>
Get Directions β†’
</a>
</div>
</div>

</motion.div>
</div>

{/*right side*/}
<div className="w-full lg:w-[60%] flex flex-col gap-4">
<div className="w-full lg:w-[65%] flex flex-col gap-4">
{faqData.map((item, i) => (
<FAQItem key={item.question} {...item} index={i} />
))}
Expand Down
137 changes: 85 additions & 52 deletions src/components/timeline.jsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { useRef } from "react";
import { useState, useRef } from "react";
import {
ClipboardList, ClipboardX, PartyPopper, ScanSearch,
Trophy, CheckCircle2, Target, BookOpen
Trophy, CheckCircle2, Target, BookOpen, ChevronDown
} from "lucide-react";
import { motion, useScroll, useSpring, useMotionValue, useTransform } from "framer-motion";
import { motion, AnimatePresence, useScroll, useSpring, useMotionValue, useTransform } from "framer-motion";

const events = [
{
Expand Down Expand Up @@ -81,6 +81,8 @@ const events = [
];

const PipelineCard = ({ title, description, instructions, deliverables, evaluation, Icon }) => {
const [isOpen, setIsOpen] = useState(false);

const x = useMotionValue(0);
const y = useMotionValue(0);
const mouseXSpring = useSpring(x, { stiffness: 150, damping: 15 });
Expand All @@ -94,6 +96,8 @@ const PipelineCard = ({ title, description, instructions, deliverables, evaluati
y.set((e.clientY - rect.top) / rect.height - 0.5);
};

const hasDetails = instructions || deliverables || evaluation;

return (
<motion.div
style={{ perspective: 1000 }}
Expand All @@ -103,55 +107,84 @@ const PipelineCard = ({ title, description, instructions, deliverables, evaluati
>
<motion.div
style={{ rotateX, rotateY, transformStyle: "preserve-3d" }}
className="roadmap-card relative overflow-hidden rounded-2xl border shadow-sm hover:shadow-lg p-6 sm:p-7 transition-all duration-500 text-left"
onClick={() => setIsOpen(!isOpen)}
className="roadmap-card relative overflow-hidden rounded-2xl border shadow-sm hover:shadow-lg p-6 sm:p-7 transition-all duration-500 text-left cursor-pointer bg-white"

Copilot AI Apr 22, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PipelineCard hard-codes bg-white on the .roadmap-card container, which overrides the theme-specific .roadmap-card background defined in globals.css (and will render a white card in dark mode). Remove the bg-white class and rely on the existing .roadmap-card styles or use a CSS variable-based background that adapts to both themes.

Suggested change
className="roadmap-card relative overflow-hidden rounded-2xl border shadow-sm hover:shadow-lg p-6 sm:p-7 transition-all duration-500 text-left cursor-pointer bg-white"
className="roadmap-card relative overflow-hidden rounded-2xl border shadow-sm hover:shadow-lg p-6 sm:p-7 transition-all duration-500 text-left cursor-pointer"

Copilot uses AI. Check for mistakes.
Comment on lines 108 to +111

Copilot AI Apr 22, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The accordion toggle is implemented by attaching onClick to a non-interactive div without keyboard handlers or ARIA state. For accessibility, use a button element (or add role="button", tabIndex={0}, onKeyDown for Enter/Space) and expose aria-expanded / aria-controls tied to the collapsible region so keyboard and screen-reader users can operate it.

Copilot uses AI. Check for mistakes.
>
<div className="flex items-start gap-4" style={{ transform: "translateZ(30px)" }}>
<div className="roadmap-card-icon shrink-0 w-12 h-12 rounded-xl flex items-center justify-center shadow-inner">
<div className="roadmap-card-icon shrink-0 w-12 h-12 rounded-xl flex items-center justify-center shadow-inner" style={{ background: "var(--secondary)" }}>
<Icon size={24} className="text-(--primary)" strokeWidth={2.5} />
</div>
<div className="flex-1">
<h3 className="roadmap-card-title text-lg sm:text-xl font-black mb-1">{title}</h3>
<p className="roadmap-card-desc text-sm font-medium mb-4">{description}</p>

{/* Details are now permanently visible */}
<div className="roadmap-card-divider space-y-4 border-t pt-4 mt-2">
{instructions && (
<div className="space-y-2">
<div className="flex items-center gap-2 text-(--primary) font-bold text-xs uppercase tracking-tighter">
<BookOpen size={14} /> Guidelines
</div>
{instructions.map((item, i) => (
<div key={i} className="roadmap-card-detail flex gap-2 text-xs sm:text-sm">
<CheckCircle2 size={14} className="shrink-0 mt-0.5 text-green-500" /> {item}
</div>
))}
</div>
)}
{deliverables && (
<div className="space-y-2">
<div className="flex items-center gap-2 text-blue-600 font-bold text-xs uppercase tracking-tighter">
<Target size={14} /> Deliverables
</div>
{deliverables.map((item, i) => (
<div key={i} className="roadmap-card-detail flex gap-2 text-xs sm:text-sm italic">
β€’ {item}
</div>
))}
</div>

<div className="flex-1 w-full">
<div className="flex justify-between items-start gap-3">
<div>
<h3 className="roadmap-card-title text-lg sm:text-xl font-black mb-1">{title}</h3>
<p className="roadmap-card-desc text-sm font-medium text-(--text-muted)">{description}</p>
</div>

{hasDetails && (
<motion.div
animate={{ rotate: isOpen ? 180 : 0 }}
transition={{ type: "spring", stiffness: 200, damping: 20 }}
className="shrink-0 mt-1 p-1 rounded-full bg-(--bg-light) text-(--primary)"
>
<ChevronDown size={20} />
</motion.div>
)}
{evaluation && (
<div className="roadmap-card-eval p-3 border shadow-sm rounded-lg space-y-2 mt-2">
<div className="roadmap-card-eval-title font-bold text-xs uppercase tracking-tighter flex items-center gap-2">
<ScanSearch size={14} /> Evaluation Criteria
</div>
{evaluation.map((item, i) => (
<div key={i} className="roadmap-card-eval-item text-xs sm:text-sm flex items-center gap-2">
<div className="w-1.5 h-1.5 rounded-full bg-(--primary) shrink-0" /> {item}
</div>
))}
</div>

{/* Smooth height accordion for details */}
<AnimatePresence>
{isOpen && hasDetails && (
<motion.div
initial={{ opacity: 0, height: 0 }}
animate={{ opacity: 1, height: "auto" }}
exit={{ opacity: 0, height: 0 }}
transition={{ opacity: { duration: 0.2 }, height: { type: "spring", stiffness: 100, damping: 15 } }}
className="overflow-hidden"
>
<div className="roadmap-card-divider space-y-4 border-t pt-4 mt-4">
{instructions && (
<div className="space-y-2">
<div className="flex items-center gap-2 text-(--primary) font-bold text-xs uppercase tracking-tighter">
<BookOpen size={14} /> Guidelines
</div>
{instructions.map((item, i) => (
<div key={i} className="roadmap-card-detail flex gap-2 text-xs sm:text-sm text-(--text-dark)">
<CheckCircle2 size={14} className="shrink-0 mt-0.5 text-green-500" /> {item}
</div>
Comment on lines +152 to +155

Copilot AI Apr 22, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The detail rows force text-(--text-dark), which overrides the existing .roadmap-card-detail theme styles from globals.css and will reduce contrast in dark mode (since --text-dark is a dark color). Drop the explicit text-(--text-dark) utility and let .roadmap-card-detail control the color per theme (or use a theme-safe token like --text-body).

Copilot uses AI. Check for mistakes.
))}
</div>
)}
{deliverables && (
<div className="space-y-2">
<div className="flex items-center gap-2 text-blue-600 font-bold text-xs uppercase tracking-tighter">
<Target size={14} /> Deliverables
</div>
{deliverables.map((item, i) => (
<div key={i} className="roadmap-card-detail flex gap-2 text-xs sm:text-sm italic text-(--text-dark)">
β€’ {item}
</div>
))}
</div>
)}
{evaluation && (
<div className="roadmap-card-eval p-3 border shadow-sm rounded-lg space-y-2 mt-2 bg-(--bg-card-dark)">
<div className="roadmap-card-eval-title font-bold text-xs uppercase tracking-tighter flex items-center gap-2">
<ScanSearch size={14} /> Evaluation Criteria
</div>
{evaluation.map((item, i) => (
<div key={i} className="roadmap-card-eval-item text-xs sm:text-sm flex items-center gap-2 text-(--text-dark)">
Comment on lines +172 to +177

Copilot AI Apr 22, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The evaluation panel adds bg-(--bg-card-dark) and forces text-(--text-dark) on items, which overrides .roadmap-card-eval / .roadmap-card-eval-item theme-specific styles in globals.css and can break dark-mode readability. Prefer relying on the existing roadmap card palette classes (or use theme-aware tokens that match both modes).

Suggested change
<div className="roadmap-card-eval p-3 border shadow-sm rounded-lg space-y-2 mt-2 bg-(--bg-card-dark)">
<div className="roadmap-card-eval-title font-bold text-xs uppercase tracking-tighter flex items-center gap-2">
<ScanSearch size={14} /> Evaluation Criteria
</div>
{evaluation.map((item, i) => (
<div key={i} className="roadmap-card-eval-item text-xs sm:text-sm flex items-center gap-2 text-(--text-dark)">
<div className="roadmap-card-eval p-3 border shadow-sm rounded-lg space-y-2 mt-2">
<div className="roadmap-card-eval-title font-bold text-xs uppercase tracking-tighter flex items-center gap-2">
<ScanSearch size={14} /> Evaluation Criteria
</div>
{evaluation.map((item, i) => (
<div key={i} className="roadmap-card-eval-item text-xs sm:text-sm flex items-center gap-2">

Copilot uses AI. Check for mistakes.
<div className="w-1.5 h-1.5 rounded-full bg-(--primary) shrink-0" /> {item}
</div>
))}
</div>
)}
</div>
</motion.div>
)}
</div>
</AnimatePresence>

</div>
</div>
</motion.div>
Expand All @@ -177,15 +210,15 @@ const Timeline = () => {
className="text-center mb-24"
>
<h2 className="section-heading mb-4 text-4xl sm:text-5xl font-black tracking-tight">Event Roadmap</h2>
<div className="h-1.5 w-24 rounded-full mx-auto bg-linear-to-r from-(--primary) to-(--secondary)" />
<div className="h-1.5 w-24 rounded-full mx-auto" style={{ background: "linear-gradient(90deg, var(--primary), var(--secondary))" }} />
<p className="mt-4 text-(--text-muted) font-medium">Detailed schedule, deliverables, and expectations.</p>
</motion.div>

<div className="relative">
<div className="absolute top-0 bottom-0 left-7 md:left-1/2 md:-translate-x-1/2 w-1 rounded-full bg-(--border-soft)" />
<motion.div
className="absolute top-0 bottom-0 left-7 md:left-1/2 md:-translate-x-1/2 w-1 rounded-full origin-top bg-(--primary) shadow-[0_0_15px_rgba(140,46,124,0.6)]"
style={{ scaleY }}
className="absolute top-0 bottom-0 left-7 md:left-1/2 md:-translate-x-1/2 w-1 rounded-full origin-top shadow-[0_0_15px_rgba(140,46,124,0.6)]"
style={{ scaleY, background: "var(--primary)" }}
/>

<div className="relative z-10 space-y-16">
Expand All @@ -200,17 +233,17 @@ const Timeline = () => {
viewport={{ once: true, margin: "-100px" }}
className="relative flex flex-col md:flex-row items-start w-full"
>
<div className="absolute left-7 md:left-1/2 md:-translate-x-1/2 top-0 md:top-6 w-5 h-5 rounded-full border-4 border-(--bg-light) bg-(--primary) z-20 shadow-lg -ml-2.5" />
<div className="absolute left-7 md:left-1/2 md:-translate-x-1/2 top-0 md:top-6 w-5 h-5 rounded-full border-4 z-20 shadow-lg -ml-2.5" style={{ borderColor: "var(--bg-light)", background: "var(--primary)" }} />

<div className="md:hidden w-full pl-16">
<span className="block mb-2 text-sm font-black uppercase tracking-widest text-(--primary)">{evt.date}</span>
<span className="block mb-2 text-sm font-black uppercase tracking-widest" style={{ color: "var(--primary)" }}>{evt.date}</span>
<PipelineCard {...evt} />
</div>
<div className="hidden md:flex w-full">
{isEven ? (
<>
<div className="w-1/2 pr-16 flex flex-col items-end">
<span className="block mb-3 text-sm font-black uppercase tracking-widest text-(--primary)">{evt.date}</span>
<span className="block mb-3 text-sm font-black uppercase tracking-widest" style={{ color: "var(--primary)" }}>{evt.date}</span>
<div className="w-full max-w-lg">
<PipelineCard {...evt} />
</div>
Expand All @@ -221,7 +254,7 @@ const Timeline = () => {
<>
<div className="w-1/2 pr-16"></div>
<div className="w-1/2 pl-16 flex flex-col items-start">
<span className="block mb-3 text-sm font-black uppercase tracking-widest text-(--primary)">{evt.date}</span>
<span className="block mb-3 text-sm font-black uppercase tracking-widest" style={{ color: "var(--primary)" }}>{evt.date}</span>
<div className="w-full max-w-lg">
<PipelineCard {...evt} />
</div>
Expand Down
Loading