Skip to content

Instantly share code, notes, and snippets.

@Avenster
Created April 2, 2025 08:36
Show Gist options
  • Save Avenster/b78ddb1762d95268a538082fae9c900e to your computer and use it in GitHub Desktop.
Save Avenster/b78ddb1762d95268a538082fae9c900e to your computer and use it in GitHub Desktop.
"use client";
import { useState } from "react";
import Image from "next/image";
import { motion } from "framer-motion";
import { cn } from "@/lib/utils";
import { FaGraduationCap, FaFileAlt, FaMoneyBillWave, FaAward, FaQuestionCircle } from "react-icons/fa";
// These should be proper images from your school
const ADMISSION_IMAGES = {
process: "/admission-process.jpg", // Replace with actual image
requirements: "/requirements.jpg", // Replace with actual image
fees: "/tuition-fees.jpg", // Replace with actual image
scholarships: "/scholarships.jpg", // Replace with actual image
faq: "/campus-life.jpg", // Replace with actual image
};
type Tab = {
title: string;
value: string;
icon: React.ReactNode;
content?: React.ReactNode;
};
export function AdmissionTabs() {
const tabs: Tab[] = [
{
title: "Application Process",
value: "process",
icon: <FaFileAlt />,
content: (
<div className="w-full h-full rounded-2xl overflow-hidden bg-gradient-to-br from-indigo-50 to-white border border-indigo-100 shadow-xl">
<div className="flex flex-col md:flex-row h-full">
<div className="w-full md:w-1/2 p-8 md:p-10">
<h3 className="text-2xl md:text-3xl font-bold text-indigo-900 mb-6">Application Process</h3>
<div className="space-y-4">
<div className="bg-white p-4 rounded-xl shadow-md">
<div className="flex items-center">
<div className="bg-indigo-100 w-8 h-8 rounded-full flex items-center justify-center text-indigo-700 font-bold mr-3">1</div>
<h4 className="font-semibold text-gray-800">Submit Online Application</h4>
</div>
<p className="mt-2 text-gray-600 pl-11">Complete the online application form with personal information and academic history.</p>
</div>
<div className="bg-white p-4 rounded-xl shadow-md">
<div className="flex items-center">
<div className="bg-indigo-100 w-8 h-8 rounded-full flex items-center justify-center text-indigo-700 font-bold mr-3">2</div>
<h4 className="font-semibold text-gray-800">Upload Documents</h4>
</div>
<p className="mt-2 text-gray-600 pl-11">Submit required documents including transcripts, ID proof, and recommendation letters.</p>
</div>
<div className="bg-white p-4 rounded-xl shadow-md">
<div className="flex items-center">
<div className="bg-indigo-100 w-8 h-8 rounded-full flex items-center justify-center text-indigo-700 font-bold mr-3">3</div>
<h4 className="font-semibold text-gray-800">Entrance Assessment</h4>
</div>
<p className="mt-2 text-gray-600 pl-11">Complete the required assessment test or interview as per your chosen program.</p>
</div>
<div className="bg-white p-4 rounded-xl shadow-md">
<div className="flex items-center">
<div className="bg-indigo-100 w-8 h-8 rounded-full flex items-center justify-center text-indigo-700 font-bold mr-3">4</div>
<h4 className="font-semibold text-gray-800">Admission Decision</h4>
</div>
<p className="mt-2 text-gray-600 pl-11">Receive your admission decision within 2-3 weeks after completing all steps.</p>
</div>
</div>
<motion.button
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
className="mt-8 bg-gradient-to-r from-indigo-600 to-purple-600 text-white py-3 px-8 rounded-xl font-medium shadow-lg hover:shadow-indigo-200 transition-all"
>
Apply Now
</motion.button>
</div>
<div className="w-full md:w-1/2 relative h-60 md:h-auto">
<Image
src={ADMISSION_IMAGES.process}
alt="Application process"
layout="fill"
objectFit="cover"
className="rounded-b-2xl md:rounded-r-2xl md:rounded-bl-none"
/>
<div className="absolute inset-0 bg-gradient-to-t from-indigo-900/70 to-transparent flex flex-col justify-end p-6 md:p-8">
<p className="text-white font-medium text-lg">Applications for 2025-26 Academic Year</p>
<p className="text-white/80">Deadline: August 15, 2025</p>
</div>
</div>
</div>
</div>
),
},
{
title: "Requirements",
value: "requirements",
icon: <FaGraduationCap />,
content: (
<div className="w-full h-full rounded-2xl overflow-hidden bg-gradient-to-br from-indigo-50 to-white border border-indigo-100 shadow-xl">
<div className="flex flex-col md:flex-row h-full">
<div className="w-full md:w-1/2 p-8 md:p-10">
<h3 className="text-2xl md:text-3xl font-bold text-indigo-900 mb-6">Admission Requirements</h3>
<div className="space-y-6">
<div>
<h4 className="text-lg font-semibold text-indigo-800 mb-2 flex items-center">
<span className="inline-block w-2 h-2 bg-indigo-500 rounded-full mr-2"></span>
Academic Records
</h4>
<ul className="list-disc pl-6 text-gray-700 space-y-1">
<li>High School Transcripts with minimum GPA of 3.0</li>
<li>Standardized test scores (SAT/ACT)</li>
<li>Previous academic certificates</li>
</ul>
</div>
<div>
<h4 className="text-lg font-semibold text-indigo-800 mb-2 flex items-center">
<span className="inline-block w-2 h-2 bg-indigo-500 rounded-full mr-2"></span>
Personal Documents
</h4>
<ul className="list-disc pl-6 text-gray-700 space-y-1">
<li>Valid ID proof/passport</li>
<li>Recent passport-sized photographs</li>
<li>Proof of residence</li>
</ul>
</div>
<div>
<h4 className="text-lg font-semibold text-indigo-800 mb-2 flex items-center">
<span className="inline-block w-2 h-2 bg-indigo-500 rounded-full mr-2"></span>
Additional Requirements
</h4>
<ul className="list-disc pl-6 text-gray-700 space-y-1">
<li>Two letters of recommendation</li>
<li>Personal statement/essay</li>
<li>Portfolio (for creative programs)</li>
<li>Interview (for selected programs)</li>
</ul>
</div>
</div>
<div className="mt-8 p-4 bg-indigo-50 rounded-lg border-l-4 border-indigo-500">
<p className="text-indigo-900 text-sm">
<strong>Note:</strong> Requirements may vary by program. Please check specific program
requirements before applying.
</p>
</div>
</div>
<div className="w-full md:w-1/2 relative h-60 md:h-auto">
<Image
src={ADMISSION_IMAGES.requirements}
alt="Admission requirements"
layout="fill"
objectFit="cover"
className="rounded-b-2xl md:rounded-r-2xl md:rounded-bl-none"
/>
<div className="absolute inset-0 bg-gradient-to-t from-indigo-900/70 to-transparent flex flex-col justify-end p-6 md:p-8">
<p className="text-white font-medium text-lg">Required Documents</p>
<p className="text-white/80">All documents must be in PDF format</p>
</div>
</div>
</div>
</div>
),
},
{
title: "Tuition & Fees",
value: "fees",
icon: <FaMoneyBillWave />,
content: (
<div className="w-full h-full rounded-2xl overflow-hidden bg-gradient-to-br from-indigo-50 to-white border border-indigo-100 shadow-xl">
<div className="flex flex-col md:flex-row h-full">
<div className="w-full md:w-1/2 p-8 md:p-10">
<h3 className="text-2xl md:text-3xl font-bold text-indigo-900 mb-6">Tuition & Fees</h3>
<div className="space-y-6">
<div className="bg-white rounded-xl shadow-md overflow-hidden">
<div className="bg-indigo-600 text-white py-3 px-4">
<h4 className="font-semibold">Undergraduate Programs</h4>
</div>
<div className="p-4">
<table className="w-full text-sm">
<tbody>
<tr className="border-b border-gray-100">
<td className="py-3 text-gray-700">Tuition (per year)</td>
<td className="py-3 font-medium text-gray-900">$12,500</td>
</tr>
<tr className="border-b border-gray-100">
<td className="py-3 text-gray-700">Registration Fee</td>
<td className="py-3 font-medium text-gray-900">$250</td>
</tr>
<tr>
<td className="py-3 text-gray-700">Student Services</td>
<td className="py-3 font-medium text-gray-900">$850</td>
</tr>
</tbody>
</table>
</div>
</div>
<div className="bg-white rounded-xl shadow-md overflow-hidden">
<div className="bg-purple-600 text-white py-3 px-4">
<h4 className="font-semibold">Graduate Programs</h4>
</div>
<div className="p-4">
<table className="w-full text-sm">
<tbody>
<tr className="border-b border-gray-100">
<td className="py-3 text-gray-700">Tuition (per year)</td>
<td className="py-3 font-medium text-gray-900">$15,800</td>
</tr>
<tr className="border-b border-gray-100">
<td className="py-3 text-gray-700">Registration Fee</td>
<td className="py-3 font-medium text-gray-900">$300</td>
</tr>
<tr>
<td className="py-3 text-gray-700">Research Access</td>
<td className="py-3 font-medium text-gray-900">$1,200</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div className="mt-8 flex gap-4">
<motion.button
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
className="bg-white border border-indigo-200 text-indigo-700 py-2 px-6 rounded-xl font-medium hover:bg-indigo-50 transition-colors"
>
Payment Plans
</motion.button>
<motion.button
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
className="bg-white border border-indigo-200 text-indigo-700 py-2 px-6 rounded-xl font-medium hover:bg-indigo-50 transition-colors"
>
Financial Aid
</motion.button>
</div>
</div>
<div className="w-full md:w-1/2 relative h-60 md:h-auto">
<Image
src={ADMISSION_IMAGES.fees}
alt="Tuition and fees"
layout="fill"
objectFit="cover"
className="rounded-b-2xl md:rounded-r-2xl md:rounded-bl-none"
/>
<div className="absolute inset-0 bg-gradient-to-t from-indigo-900/70 to-transparent flex flex-col justify-end p-6 md:p-8">
<p className="text-white font-medium text-lg">Affordable Education</p>
<p className="text-white/80">Multiple payment options available</p>
</div>
</div>
</div>
</div>
),
},
{
title: "Scholarships",
value: "scholarships",
icon: <FaAward />,
content: (
<div className="w-full h-full rounded-2xl overflow-hidden bg-gradient-to-br from-indigo-50 to-white border border-indigo-100 shadow-xl">
<div className="flex flex-col md:flex-row h-full">
<div className="w-full md:w-1/2 p-8 md:p-10">
<h3 className="text-2xl md:text-3xl font-bold text-indigo-900 mb-6">Scholarships & Financial Aid</h3>
<div className="grid grid-cols-1 gap-6">
{[
{
title: "Academic Excellence Scholarship",
amount: "Up to 75% tuition waiver",
criteria: "GPA 3.8+ and outstanding academic achievements",
deadline: "June 30, 2025",
color: "from-blue-500 to-indigo-500"
},
{
title: "Leadership & Community Service",
amount: "Up to 50% tuition waiver",
criteria: "Demonstrated leadership and community involvement",
deadline: "July 15, 2025",
color: "from-purple-500 to-pink-500"
},
{
title: "Creative Arts Scholarship",
amount: "Up to 60% tuition waiver",
criteria: "Outstanding portfolio and creative achievements",
deadline: "July 30, 2025",
color: "from-amber-500 to-orange-500"
}
].map((scholarship, idx) => (
<div key={idx} className="bg-white rounded-xl shadow-md overflow-hidden">
<div className={`bg-gradient-to-r ${scholarship.color} text-white py-3 px-4`}>
<h4 className="font-semibold">{scholarship.title}</h4>
</div>
<div className="p-4 space-y-2">
<div className="flex justify-between">
<span className="text-gray-600">Award:</span>
<span className="font-medium text-gray-900">{scholarship.amount}</span>
</div>
<div className="flex justify-between">
<span className="text-gray-600">Criteria:</span>
<span className="font-medium text-gray-900 text-right">{scholarship.criteria}</span>
</div>
<div className="flex justify-between">
<span className="text-gray-600">Deadline:</span>
<span className="font-medium text-gray-900">{scholarship.deadline}</span>
</div>
</div>
</div>
))}
</div>
<motion.button
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
className="mt-8 bg-gradient-to-r from-indigo-600 to-purple-600 text-white py-3 px-8 rounded-xl font-medium shadow-lg hover:shadow-indigo-200 transition-all"
>
Apply for Scholarships
</motion.button>
</div>
<div className="w-full md:w-1/2 relative h-60 md:h-auto">
<Image
src={ADMISSION_IMAGES.scholarships}
alt="Scholarships"
layout="fill"
objectFit="cover"
className="rounded-b-2xl md:rounded-r-2xl md:rounded-bl-none"
/>
<div className="absolute inset-0 bg-gradient-to-t from-indigo-900/70 to-transparent flex flex-col justify-end p-6 md:p-8">
<p className="text-white font-medium text-lg">Rewarding Excellence</p>
<p className="text-white/80">Over $2 million in scholarships awarded annually</p>
</div>
</div>
</div>
</div>
),
},
{
title: "FAQ",
value: "faq",
icon: <FaQuestionCircle />,
content: (
<div className="w-full h-full rounded-2xl overflow-hidden bg-gradient-to-br from-indigo-50 to-white border border-indigo-100 shadow-xl">
<div className="flex flex-col md:flex-row h-full">
<div className="w-full md:w-1/2 p-8 md:p-10">
<h3 className="text-2xl md:text-3xl font-bold text-indigo-900 mb-6">Frequently Asked Questions</h3>
<div className="space-y-4">
{[
{
question: "What is the application deadline?",
answer: "Regular admission deadline is August 15, 2025. Early decision applications are due by June 1, 2025."
},
{
question: "Can I apply to multiple programs?",
answer: "Yes, you can apply to up to three programs with a single application fee."
},
{
question: "Are there any application fee waivers?",
answer: "Fee waivers are available for students with financial need. Contact the admissions office for details."
},
{
question: "How long does the admission process take?",
answer: "Most decisions are made within 2-3 weeks after all required documents are received."
},
{
question: "Is on-campus housing guaranteed?",
answer: "On-campus housing is guaranteed for first-year students who apply by the priority deadline."
}
].map((faq, idx) => (
<motion.div
key={idx}
initial={{ height: "auto" }}
whileHover={{ backgroundColor: "rgba(238, 242, 255, 0.5)" }}
className="bg-white rounded-xl shadow-sm overflow-hidden p-4 transition-colors"
>
<h4 className="font-semibold text-indigo-800">{faq.question}</h4>
<p className="text-gray-600 mt-2">{faq.answer}</p>
</motion.div>
))}
</div>
<div className="mt-8 text-center">
<p className="text-gray-600 mb-4">Didn't find what you're looking for?</p>
<motion.button
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
className="bg-white border border-indigo-200 text-indigo-700 py-2 px-6 rounded-xl font-medium hover:bg-indigo-50 transition-colors"
>
Contact Admissions
</motion.button>
</div>
</div>
<div className="w-full md:w-1/2 relative h-60 md:h-auto">
<Image
src={ADMISSION_IMAGES.faq}
alt="Frequently asked questions"
layout="fill"
objectFit="cover"
className="rounded-b-2xl md:rounded-r-2xl md:rounded-bl-none"
/>
<div className="absolute inset-0 bg-gradient-to-t from-indigo-900/70 to-transparent flex flex-col justify-end p-6 md:p-8">
<p className="text-white font-medium text-lg">Still Have Questions?</p>
<p className="text-white/80">Our admissions team is here to help</p>
</div>
</div>
</div>
</div>
),
},
];
return (
<div className="h-auto md:h-[40rem] [perspective:1000px] relative flex flex-col max-w-6xl mx-auto w-full items-start justify-start">
<Tabs tabs={tabs} />
</div>
);
}
export const Tabs = ({
tabs: propTabs,
containerClassName,
activeTabClassName,
tabClassName,
contentClassName,
}: {
tabs: Tab[];
containerClassName?: string;
activeTabClassName?: string;
tabClassName?: string;
contentClassName?: string;
}) => {
const [active, setActive] = useState<Tab>(propTabs[0]);
const [tabs, setTabs] = useState<Tab[]>(propTabs);
const [hovering, setHovering] = useState(false);
const moveSelectedTabToTop = (idx: number) => {
const newTabs = [...propTabs];
const selectedTab = newTabs.splice(idx, 1);
newTabs.unshift(selectedTab[0]);
setTabs(newTabs);
setActive(newTabs[0]);
};
return (
<>
<div className="text-center mb-8">
<h2 className="text-3xl md:text-4xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-indigo-700 to-purple-700">
Join Our Academic Community
</h2>
<p className="text-gray-600 mt-2 max-w-2xl mx-auto">
Explore our admission process and find everything you need to become part of Kautilya Academy.
</p>
</div>
<div
className={cn(
"flex flex-row items-center justify-center [perspective:1000px] relative overflow-auto sm:overflow-visible no-visible-scrollbar max-w-full w-full mb-8",
containerClassName
)}
>
{propTabs.map((tab, idx) => (
<motion.button
key={tab.title}
onClick={() => {
moveSelectedTabToTop(idx);
}}
onMouseEnter={() => setHovering(true)}
onMouseLeave={() => setHovering(false)}
className={cn(
"relative px-6 py-4 rounded-full mx-1 flex items-center gap-2",
tabClassName
)}
style={{
transformStyle: "preserve-3d",
}}
whileHover={{ y: -3 }}
whileTap={{ y: 0 }}
>
{active.value === tab.value && (
<motion.div
layoutId="clickedbutton"
transition={{ type: "spring", bounce: 0.3, duration: 0.6 }}
className={cn(
"absolute inset-0 bg-gradient-to-r from-indigo-600 to-purple-600 rounded-full shadow-lg",
activeTabClassName
)}
/>
)}
<span className={`relative z-10 ${active.value === tab.value ? 'text-white' : 'text-gray-700'}`}>
{tab.icon}
</span>
<span className={`relative z-10 font-medium ${active.value === tab.value ? 'text-white' : 'text-gray-700'}`}>
{tab.title}
</span>
</motion.button>
))}
</div>
<FadeInDiv
tabs={tabs}
active={active}
key={active.value}
hovering={hovering}
className={cn("mt-2 h-full w-full", contentClassName)}
/>
</>
);
};
export const FadeInDiv = ({
className,
tabs,
active,
hovering,
}: {
className?: string;
key?: string;
tabs: Tab[];
active: Tab;
hovering?: boolean;
}) => {
const isActive = (tab: Tab) => {
return tab.value === tabs[0].value;
};
return (
<div className="relative w-full h-full">
{tabs.map((tab, idx) => (
<motion.div
key={tab.value}
layoutId={tab.value}
style={{
scale: 1 - idx * 0.05,
top: hovering ? idx * -30 : 0,
zIndex: -idx,
opacity: idx < 3 ? 1 - idx * 0.2 : 0,
}}
animate={{
y: isActive(tab) ? [0, 10, 0] : 0,
}}
transition={{
duration: 0.5,
ease: "easeInOut"
}}
className={cn("w-full h-full absolute top-0 left-0", className)}
>
{tab.content}
</motion.div>
))}
</div>
);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment