From 291a05eb60c1c19666af5cd21f57014eb0d5c91d Mon Sep 17 00:00:00 2001 From: rohit-jain-546 Date: Tue, 16 Jun 2026 12:43:28 +0530 Subject: [PATCH 1/5] feat: improve website SEO optimization --- frontend/package-lock.json | 48 +++++++++++++++++ frontend/package.json | 1 + frontend/src/components/SEO.tsx | 64 +++++++++++++++++++++++ frontend/src/components/layout/Navbar.tsx | 2 +- frontend/src/main.tsx | 5 +- frontend/src/pages/BlogDetail.tsx | 8 +++ frontend/src/pages/Blogs.tsx | 5 ++ frontend/src/pages/Events.tsx | 9 +++- frontend/src/pages/Home.tsx | 11 ++-- frontend/src/pages/Team.tsx | 9 +++- frontend/vite.config.ts | 1 - 11 files changed, 153 insertions(+), 10 deletions(-) create mode 100644 frontend/src/components/SEO.tsx diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 518d6ce..cfacf74 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -19,6 +19,7 @@ "radix-ui": "^1.4.3", "react": "^19.2.4", "react-dom": "^19.2.4", + "react-helmet-async": "^3.0.0", "react-use": "^17.6.0", "shadcn": "^4.0.6", "tailwind-merge": "^3.5.0", @@ -6291,6 +6292,15 @@ "css-in-js-utils": "^3.1.0" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/ip-address": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", @@ -6991,6 +7001,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -7955,6 +7977,26 @@ "react": "^19.2.4" } }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-3.0.0.tgz", + "integrity": "sha512-nA3IEZfXiclgrz4KLxAhqJqIfFDuvzQwlKwpdmzZIuC1KNSghDEIXmyU0TKtbM+NafnkICcwx8CECFrZ/sL/1w==", + "license": "Apache-2.0", + "dependencies": { + "invariant": "^2.2.4", + "react-fast-compare": "^3.2.2", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-remove-scroll": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", @@ -8489,6 +8531,12 @@ "url": "https://github.com/sponsors/colinhacks" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 3b99dd0..78ec1af 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -21,6 +21,7 @@ "radix-ui": "^1.4.3", "react": "^19.2.4", "react-dom": "^19.2.4", + "react-helmet-async": "^3.0.0", "react-use": "^17.6.0", "shadcn": "^4.0.6", "tailwind-merge": "^3.5.0", diff --git a/frontend/src/components/SEO.tsx b/frontend/src/components/SEO.tsx new file mode 100644 index 0000000..f2ac0cf --- /dev/null +++ b/frontend/src/components/SEO.tsx @@ -0,0 +1,64 @@ +import { Helmet } from 'react-helmet-async'; +import { useLocation } from 'react-router-dom'; + +interface SEOProps { + title: string; + description: string; + canonical?: string; + image?: string; + type?: string; + robots?: string; + keywords?: string; + twitterCard?: string; +} + +export default function SEO({ + title, + description, + canonical, + image, + type = 'website', + robots = 'index,follow', + keywords, + twitterCard = 'summary_large_image', +}: SEOProps) { + const location = useLocation(); + const siteUrl = 'https://codex-iter.in'; + const url = canonical || `${siteUrl}${location.pathname}`; + + // Fallback to a global default social preview image if none provided + const defaultImage = `${siteUrl}/codex_dark.png`; // Using the existing icon as default + const ogImage = image || defaultImage; + + return ( + + {/* Basic Metadata */} + {title} + + + {keywords && } + + {/* Canonical URL */} + + + {/* Open Graph / Facebook */} + + + + + + + + + {/* Twitter */} + + + + + + + {/* Viewport & Language (usually in index.html, but safe to reinforce if needed) */} + + + ); +} diff --git a/frontend/src/components/layout/Navbar.tsx b/frontend/src/components/layout/Navbar.tsx index e242902..cf62f54 100644 --- a/frontend/src/components/layout/Navbar.tsx +++ b/frontend/src/components/layout/Navbar.tsx @@ -47,7 +47,7 @@ export default function Navbar() {
- {scrolled ? : } + {scrolled ? CODEX ITER Logo : CODEX ITER Logo}
CODEX ITER diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index bef5202..0a361e5 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -1,10 +1,13 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' +import { HelmetProvider } from 'react-helmet-async' import './index.css' import App from './App.tsx' createRoot(document.getElementById('root')!).render( - + + + , ) diff --git a/frontend/src/pages/BlogDetail.tsx b/frontend/src/pages/BlogDetail.tsx index 853ec3e..c00a10a 100644 --- a/frontend/src/pages/BlogDetail.tsx +++ b/frontend/src/pages/BlogDetail.tsx @@ -4,6 +4,7 @@ import { client } from "../sanity/client"; import { urlFor } from "../sanity/image"; import { PortableText } from "@portabletext/react"; import { ScrollReveal } from "../components/animations/ScrollReveal"; +import SEO from "../components/SEO"; export default function BlogDetail() { const { slug } = useParams<{ slug: string }>(); @@ -58,6 +59,13 @@ export default function BlogDetail() { return (
+
diff --git a/frontend/src/pages/Blogs.tsx b/frontend/src/pages/Blogs.tsx index a9e788b..3577e68 100644 --- a/frontend/src/pages/Blogs.tsx +++ b/frontend/src/pages/Blogs.tsx @@ -5,6 +5,7 @@ import { ScrollReveal, StaggerContainer, StaggerItem } from "../components/anima import { useEffect, useState } from "react"; import { client } from "../sanity/client"; import { urlFor } from "../sanity/image"; +import SEO from "../components/SEO"; export default function Blogs() { const { hero } = mockData.blogs; @@ -68,6 +69,10 @@ export default function Blogs() { return (
+
{/* Header Section */} diff --git a/frontend/src/pages/Events.tsx b/frontend/src/pages/Events.tsx index 55e8800..6117ddf 100644 --- a/frontend/src/pages/Events.tsx +++ b/frontend/src/pages/Events.tsx @@ -6,6 +6,7 @@ import TiltCard from "../components/animations/TiltCard"; import { useEffect, useState } from "react"; import { client } from "../sanity/client"; import { urlFor } from "../sanity/image"; +import SEO from "../components/SEO"; const prefersReduced = typeof window !== "undefined" && @@ -194,6 +195,10 @@ export default function Events() { return (
+
{/* Header */} @@ -201,9 +206,9 @@ export default function Events() {
{hero.label}
-

+

{hero.titlePart1}
{hero.titlePart2} -

+

{hero.description}

diff --git a/frontend/src/pages/Home.tsx b/frontend/src/pages/Home.tsx index 0c7feae..e2531d0 100644 --- a/frontend/src/pages/Home.tsx +++ b/frontend/src/pages/Home.tsx @@ -6,6 +6,7 @@ import { ScrollReveal, StaggerContainer, StaggerItem } from "../components/anima import main_logo from "../assets/main_logo.png" import { client } from "../sanity/client"; import { urlFor } from "../sanity/image"; +import SEO from "../components/SEO"; const prefersReduced = typeof window !== "undefined" && @@ -134,6 +135,10 @@ export default function Home() { return (
+ {/* ── HERO ────────────────────────────────────────────────── */}
@@ -147,7 +152,7 @@ export default function Home() { {hero.established} -

+

{" "}
@@ -155,7 +160,7 @@ export default function Home() { {" "}
-

+

{/* Typing subheading */}

@@ -199,7 +204,7 @@ export default function Home() {

- + CODEX ITER Main Logo
{hero.loadingText}
diff --git a/frontend/src/pages/Team.tsx b/frontend/src/pages/Team.tsx index 89ee295..c3c3666 100644 --- a/frontend/src/pages/Team.tsx +++ b/frontend/src/pages/Team.tsx @@ -5,6 +5,7 @@ import TiltCard from "../components/animations/TiltCard"; import { useEffect, useState, useRef } from "react"; import { client } from "../sanity/client"; import { urlFor } from "../sanity/image"; +import SEO from "../components/SEO"; const prefersReduced = typeof window !== "undefined" && @@ -152,6 +153,10 @@ export default function Team() { return (
+
{/* Hero */} @@ -159,9 +164,9 @@ export default function Team() {
{hero.label}
-

+

{hero.titlePart1}
{hero.titlePart2} -

+

{hero.description}

diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 1efc49a..45bf2f7 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -10,7 +10,6 @@ export default defineConfig({ hostname: 'https://codex-iter.in', dynamicRoutes: [ '/', - '/about', '/blogs', '/events', '/team' From d457fc58e795bd7f36d8715c5aa4d6420818c797 Mon Sep 17 00:00:00 2001 From: rohit-jain-546 Date: Tue, 16 Jun 2026 13:26:12 +0530 Subject: [PATCH 2/5] fix: correct sitemap configuration --- frontend/vite.config.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 45bf2f7..4d70c58 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -9,7 +9,6 @@ export default defineConfig({ sitemap({ hostname: 'https://codex-iter.in', dynamicRoutes: [ - '/', '/blogs', '/events', '/team' From d000006547c94d7f857aaca73eebce66e68b130f Mon Sep 17 00:00:00 2001 From: rohit-jain-546 Date: Tue, 16 Jun 2026 13:44:18 +0530 Subject: [PATCH 3/5] fix: update footer social media links --- frontend/src/components/layout/Footer.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/layout/Footer.tsx b/frontend/src/components/layout/Footer.tsx index 5c72d8c..d209cea 100644 --- a/frontend/src/components/layout/Footer.tsx +++ b/frontend/src/components/layout/Footer.tsx @@ -78,13 +78,15 @@ export default function Footer() { Connect
{[ - { icon: , href: settings?.linkedin || "#", id: "linkedin" }, - { icon: , href: settings?.email ? `mailto:${settings.email}` : "#", id: "email" }, - { icon: , href: settings?.instagram || "#", id: "instagram" }, + { icon: , href: settings?.linkedin || "https://www.linkedin.com/company/codex-iter", id: "linkedin" }, + { icon: , href: settings?.email ? `mailto:${settings.email}` : "mailto:codexiter@gmail.com", id: "email" }, + { icon: , href: settings?.instagram || "https://www.instagram.com/codexiter", id: "instagram" }, ].map(({ icon, href, id }) => ( Date: Fri, 4 Sep 2026 16:07:28 +0530 Subject: [PATCH 4/5] orientation page --- frontend/src/App.tsx | 2 + frontend/src/pages/Orientation.tsx | 761 +++++++++++++++++++++++++++++ 2 files changed, 763 insertions(+) create mode 100644 frontend/src/pages/Orientation.tsx diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 229e8dc..3d53b41 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -5,6 +5,7 @@ import Blogs from "./pages/Blogs" import Events from "./pages/Events" import Team from "./pages/Team" import BlogDetail from "./pages/BlogDetail" +import Orientation from "./pages/Orientation" import Navbar from "./components/layout/Navbar" import Footer from "./components/layout/Footer" import TransitionOverlay from "./components/animations/TransitionOverlay" @@ -26,6 +27,7 @@ function AnimatedRoutes() { } /> } /> } /> + } /> diff --git a/frontend/src/pages/Orientation.tsx b/frontend/src/pages/Orientation.tsx new file mode 100644 index 0000000..e756770 --- /dev/null +++ b/frontend/src/pages/Orientation.tsx @@ -0,0 +1,761 @@ +import { useEffect, useState } from "react"; +import { motion, AnimatePresence } from "framer-motion"; +import { ScrollReveal, StaggerContainer, StaggerItem } from "../components/animations/ScrollReveal"; +import codex from "../assets/codex_dark.png"; +import codex_light from "../assets/code_light.png"; +import SEO from "../components/SEO"; + +// ─── Reduced-motion guard (same pattern as existing pages) ─────────────────── +const prefersReduced = + typeof window !== "undefined" && + window.matchMedia("(prefers-reduced-motion: reduce)").matches; + +// ─── Staggered character reveal (reused from Home.tsx) ────────────────────── +function AnimatedHeading({ text, className }: { text: string; className?: string }) { + const chars = text.split(""); + return ( + + {prefersReduced + ? text + : chars.map((char, i) => ( + + {char} + + ))} + + ); +} + +// ─── Typing effect hook ────────────────────────────────────────────────────── +function useTypingEffect(text: string, startDelay: number, speed = 28) { + const [displayed, setDisplayed] = useState(""); + const [done, setDone] = useState(false); + + useEffect(() => { + if (prefersReduced) { setDisplayed(text); setDone(true); return; } + let i = 0; + const timer = setTimeout(() => { + const interval = setInterval(() => { + i++; + setDisplayed(text.slice(0, i)); + if (i >= text.length) { clearInterval(interval); setDone(true); } + }, speed); + return () => clearInterval(interval); + }, startDelay); + return () => clearTimeout(timer); + }, [text, startDelay, speed]); + + return { displayed, done }; +} + +// ─── Sonar pulse button ────────────────────────────────────────────────────── +function SonarButton({ + children, + className, + onClick, + href, +}: { + children: React.ReactNode; + className?: string; + onClick?: () => void; + href?: string; +}) { + const inner = ( + <> + {children} + {!prefersReduced && ( + + )} + + ); + + if (href) { + return ( + + {inner} + + ); + } + + return ( + + {inner} + + ); +} + +// ─── Floating code fragment (same as Home.tsx) ─────────────────────────────── +function FloatingCode({ text, x, y, duration, delay }: { text: string; x: string; y: string; duration: number; delay: number }) { + if (prefersReduced) return null; + return ( + + {text} + + ); +} + +// ─── Orientation-specific Navbar ───────────────────────────────────────────── +function OrientationNavbar() { + const [scrolled, setScrolled] = useState(false); + const [menuOpen, setMenuOpen] = useState(false); + + useEffect(() => { + const handler = () => setScrolled(window.scrollY > 80); + window.addEventListener("scroll", handler, { passive: true }); + return () => window.removeEventListener("scroll", handler); + }, []); + + const links = [ + { href: "#domains", label: "Domains" }, + { href: "#timeline", label: "Timeline" }, + { href: "#faq", label: "FAQ" }, + ]; + + return ( + +
+ {/* Logo */} + +
+ {scrolled + ? CODEX ITER Logo + : CODEX ITER Logo} +
+ + CODEX ITER + +
+ + {/* Desktop links */} + + {links.map((link, i) => ( + + + {link.label} + + + + ))} + + + Register Now + + + + {/* Hamburger */} + +
+ + {/* Mobile menu */} + + {menuOpen && ( + + + + )} + +
+ ); +} + +// ─── FAQ Accordion Item ─────────────────────────────────────────────────────── +function FAQItem({ question, answer, index }: { question: string; answer: string; index: number }) { + const [open, setOpen] = useState(false); + return ( + setOpen(!open)} + role="button" + aria-expanded={open} + id={`faq-item-${index}`} + > +
+
+ + {String(index + 1).padStart(2, "0")} + +

+ {question} +

+
+ + add + +
+ + {open && ( + +
+

+ {answer} +

+
+
+ )} +
+
+ ); +} + +// ─── Data ───────────────────────────────────────────────────────────────────── +const DOMAINS = [ + { + icon: "code_blocks", + title: "Web & Systems", + desc: "From responsive frontends to scalable cloud-native backends — build real products that ship.", + }, + { + icon: "neurology", + title: "AI & Machine Learning", + desc: "Work on neural architectures, NLP pipelines, and predictive models that solve real problems.", + }, + { + icon: "calculate", + title: "Competitive Programming", + desc: "Master data structures, algorithms, and graph theory to dominate on ICPC and Codeforces.", + }, + { + icon: "brush", + title: "UI/UX & Product Design", + desc: "Craft interfaces and experiences with Figma, design systems, and user research principles.", + }, +]; + +const STATS = [ + { value: "50+", label: "Active Projects & Mentorships", bg: "bg-background-light", valueCls: "text-primary", labelCls: "text-slate-900", span: 1 }, + { value: "150+", label: "Flagship Hackathons Won", bg: "bg-primary", valueCls: "text-white", labelCls: "text-white/90", span: 1 }, + { value: "1,000,000+", label: "Lines of Open Source Code", bg: "bg-slate-900", valueCls: "text-white", labelCls: "text-white/80", span: 2 }, +]; + +const TIMELINE = [ + { + phase: "01", + title: "Applications Open", + date: "Sep 15 – Oct 05, 2026", + desc: "Fill out the recruitment form online. Tell us about yourself, your interests, and any projects you've worked on. No GPA cutoff — we hire on curiosity.", + icon: "edit_note", + color: "bg-background-light", + accent: "text-primary", + }, + { + phase: "02", + title: "Orientation & Info Session", + date: "Oct 08, 2026", + desc: "Attend our in-person orientation session. Meet current members, tour the lab, ask questions, and understand what each domain works on day-to-day.", + icon: "groups", + color: "bg-primary", + accent: "text-white", + }, + { + phase: "03", + title: "Technical Tasks", + date: "Oct 10 – Oct 17, 2026", + desc: "Complete a short domain-specific task designed to be educational, not eliminatory. There's no single right answer — we're looking for how you think.", + icon: "terminal", + color: "bg-background-light", + accent: "text-primary", + }, + { + phase: "04", + title: "Induction", + date: "Oct 22, 2026", + desc: "Successful candidates are welcomed into CODEX ITER. You'll be matched with a mentor, onboarded to an active project, and join the family.", + icon: "verified", + color: "bg-slate-900", + accent: "text-white", + }, +]; + +const FAQS = [ + { + question: "Do I need prior coding experience to apply?", + answer: + "No prior experience is required for most of our wings. We value curiosity and a willingness to learn over existing skill level. That said, competitive programming and AI/ML wings may expect some foundational comfort with programming logic. Our orientation session will help you find the right fit.", + }, + { + question: "What is the expected time commitment?", + answer: + "Most members dedicate 6–10 hours per week on average. This includes weekly domain meetings, project work, and optional workshops or events. During hackathon season it may be more — but it's always opt-in based on your bandwidth.", + }, + { + question: "Can students from all branches apply?", + answer: + "Absolutely. CODEX ITER is open to all undergraduate students of ITER, regardless of branch. We have members from CSE, ECE, Mechanical, Civil, and beyond. Diverse perspectives make our work stronger.", + }, + { + question: "Will I work on real projects or just learn theory?", + answer: + "Real projects, always. From day one you'll be contributing to active repositories, collaborating with seniors, and shipping work that may go live on our platform or in partner organizations. Theory is delivered through workshops alongside hands-on execution.", + }, + { + question: "Is there a fee to join CODEX ITER?", + answer: + "There is no fee to apply or join. CODEX ITER is a student-run, merit-based organization. Events and workshops hosted throughout the year are free for all members.", + }, + { + question: "What happens after I complete the technical task?", + answer: + "All submitted tasks are reviewed by domain leads within 3–5 days. Every applicant receives feedback regardless of outcome. Selected candidates are invited to an informal conversation before the final induction announcement.", + }, +]; + +// ─── Main Page Component ────────────────────────────────────────────────────── +export default function Orientation() { + const HERO_TITLE = "BUILD THE FUTURE:"; + const HERO_SUB1 = "RECRUITMENT"; + const HERO_SUB2 = "2026"; + + const subheadDelay = 0.3 + HERO_TITLE.length * 0.04 + 0.5 + 400; + const { displayed, done } = useTypingEffect( + "Welcome freshmen and sophomore developers. Join a powerhouse of technical innovation.", + subheadDelay + ); + + const CHAR_COUNT = (HERO_TITLE + " " + HERO_SUB1 + " " + HERO_SUB2).length; + const ctaDelay = 0.3 + CHAR_COUNT * 0.04 + 0.8; + + return ( +
+ + + {/* ── ORIENTATION NAVBAR ──────────────────────────────────────── */} + + + {/* ── HERO ─────────────────────────────────────────────────────── */} +
+
+ {/* Left: copy */} +
+ + RECRUITMENT // INTAKE 2026 + + +

+ + {" "}
+ + + {" "} +
+ +

+ + {/* Typing subheading */} +

+ {displayed} + {!done && ( + + )} +

+ + + + Register Now + + + View Timeline + + +
+ + {/* Right: neo-brutalist terminal card */} + + {/* Tilted background layer */} + + {/* Terminal card */} +
+ {/* Terminal chrome bar */} +
+ + + + codex_recruit.sh +
+ {/* Terminal body */} +
+
// CODEX ITER — Intake 2026
+
$ ./begin_recruitment.sh
+
▶ Initializing recruitment sequence...
+ +
+ while + (curious) {"{"} +
+
+ code + (); +
+
+ innovate + (); +
+
+ collaborate + (); +
+
{"}"}
+ +
// Domains accepting applications:
+
+ const domains = [ +
+ {["\"Web & Systems\"", "\"AI / ML\"", "\"Competitive Programming\"", "\"UI/UX Design\""].map((d, i) => ( +
{d},
+ ))} +
];
+ + + $ + apply --intake=2026 + + +
+ + {/* Floating code fragments */} + + + + +
+
+
+
+ + {/* ── IMPACT STATS ─────────────────────────────────────────────── */} +
+
+
+ +

+ A Community
+ Built on Results +

+
+

+ CODEX ITER isn't just a club — it's an ecosystem. In ten years we've launched startups, won national hackathons, and shipped open-source projects used by thousands. +

+

+ When you join, you inherit a decade of collective knowledge, a senior-to-junior mentorship culture, and direct access to builders who are actively shipping. +

+
+
+ + + {STATS.map((stat, i) => ( + +
+
+ {stat.value} +
+
+ {stat.label} +
+
+
+ ))} +
+
+
+
+ + {/* ── DOMAINS ──────────────────────────────────────────────────── */} +
+
+ +

+ What We
Master +

+
+ // RECRUITMENT WINGS +
+
+ + + {DOMAINS.map((domain, i) => ( + + + + {domain.icon} + +

{domain.title}

+

{domain.desc}

+
+
+ ))} +
+
+
+ + {/* ── TIMELINE ─────────────────────────────────────────────────── */} +
+
+ +
+

+ Recruitment
Roadmap +

+
+ // INDUCTION PHASES +
+
+
+ +
+ {/* Vertical connector */} +
+ + + {TIMELINE.map((phase, i) => ( + +
+ {/* Phase badge */} +
+ Phase + {phase.phase} +
+ + {/* Card */} + +
+
+ {phase.icon} +

{phase.title}

+
+ + {phase.date} + +
+

{phase.desc}

+
+
+
+ ))} +
+
+
+
+ + {/* ── FAQ ──────────────────────────────────────────────────────── */} +
+
+ +
+

+ Got
Questions? +

+
+ // FAQ +
+
+
+ + + {FAQS.map((faq, i) => ( + + + + ))} + +
+
+ + {/* ── FINAL CTA ────────────────────────────────────────────────── */} + +
+
+
+ Applications Open — Intake 2026 +
+

+ Join The Codex. +

+

+ Register for the orientation session and take the first step into a decade-long legacy of technical excellence. +

+
+ + REGISTER NOW + + + JOIN OUR CHANNEL + +
+
+
+
+
+ ); +} From 280dc508445e10b38a8309bcf38e8fc64ba3d426 Mon Sep 17 00:00:00 2001 From: rohit-jain-546 Date: Fri, 4 Sep 2026 16:08:38 +0530 Subject: [PATCH 5/5] revert: remove orientation page from main repo --- frontend/src/pages/Orientation.tsx | 761 ----------------------------- 1 file changed, 761 deletions(-) delete mode 100644 frontend/src/pages/Orientation.tsx diff --git a/frontend/src/pages/Orientation.tsx b/frontend/src/pages/Orientation.tsx deleted file mode 100644 index e756770..0000000 --- a/frontend/src/pages/Orientation.tsx +++ /dev/null @@ -1,761 +0,0 @@ -import { useEffect, useState } from "react"; -import { motion, AnimatePresence } from "framer-motion"; -import { ScrollReveal, StaggerContainer, StaggerItem } from "../components/animations/ScrollReveal"; -import codex from "../assets/codex_dark.png"; -import codex_light from "../assets/code_light.png"; -import SEO from "../components/SEO"; - -// ─── Reduced-motion guard (same pattern as existing pages) ─────────────────── -const prefersReduced = - typeof window !== "undefined" && - window.matchMedia("(prefers-reduced-motion: reduce)").matches; - -// ─── Staggered character reveal (reused from Home.tsx) ────────────────────── -function AnimatedHeading({ text, className }: { text: string; className?: string }) { - const chars = text.split(""); - return ( - - {prefersReduced - ? text - : chars.map((char, i) => ( - - {char} - - ))} - - ); -} - -// ─── Typing effect hook ────────────────────────────────────────────────────── -function useTypingEffect(text: string, startDelay: number, speed = 28) { - const [displayed, setDisplayed] = useState(""); - const [done, setDone] = useState(false); - - useEffect(() => { - if (prefersReduced) { setDisplayed(text); setDone(true); return; } - let i = 0; - const timer = setTimeout(() => { - const interval = setInterval(() => { - i++; - setDisplayed(text.slice(0, i)); - if (i >= text.length) { clearInterval(interval); setDone(true); } - }, speed); - return () => clearInterval(interval); - }, startDelay); - return () => clearTimeout(timer); - }, [text, startDelay, speed]); - - return { displayed, done }; -} - -// ─── Sonar pulse button ────────────────────────────────────────────────────── -function SonarButton({ - children, - className, - onClick, - href, -}: { - children: React.ReactNode; - className?: string; - onClick?: () => void; - href?: string; -}) { - const inner = ( - <> - {children} - {!prefersReduced && ( - - )} - - ); - - if (href) { - return ( - - {inner} - - ); - } - - return ( - - {inner} - - ); -} - -// ─── Floating code fragment (same as Home.tsx) ─────────────────────────────── -function FloatingCode({ text, x, y, duration, delay }: { text: string; x: string; y: string; duration: number; delay: number }) { - if (prefersReduced) return null; - return ( - - {text} - - ); -} - -// ─── Orientation-specific Navbar ───────────────────────────────────────────── -function OrientationNavbar() { - const [scrolled, setScrolled] = useState(false); - const [menuOpen, setMenuOpen] = useState(false); - - useEffect(() => { - const handler = () => setScrolled(window.scrollY > 80); - window.addEventListener("scroll", handler, { passive: true }); - return () => window.removeEventListener("scroll", handler); - }, []); - - const links = [ - { href: "#domains", label: "Domains" }, - { href: "#timeline", label: "Timeline" }, - { href: "#faq", label: "FAQ" }, - ]; - - return ( - -
- {/* Logo */} - -
- {scrolled - ? CODEX ITER Logo - : CODEX ITER Logo} -
- - CODEX ITER - -
- - {/* Desktop links */} - - {links.map((link, i) => ( - - - {link.label} - - - - ))} - - - Register Now - - - - {/* Hamburger */} - -
- - {/* Mobile menu */} - - {menuOpen && ( - - - - )} - -
- ); -} - -// ─── FAQ Accordion Item ─────────────────────────────────────────────────────── -function FAQItem({ question, answer, index }: { question: string; answer: string; index: number }) { - const [open, setOpen] = useState(false); - return ( - setOpen(!open)} - role="button" - aria-expanded={open} - id={`faq-item-${index}`} - > -
-
- - {String(index + 1).padStart(2, "0")} - -

- {question} -

-
- - add - -
- - {open && ( - -
-

- {answer} -

-
-
- )} -
-
- ); -} - -// ─── Data ───────────────────────────────────────────────────────────────────── -const DOMAINS = [ - { - icon: "code_blocks", - title: "Web & Systems", - desc: "From responsive frontends to scalable cloud-native backends — build real products that ship.", - }, - { - icon: "neurology", - title: "AI & Machine Learning", - desc: "Work on neural architectures, NLP pipelines, and predictive models that solve real problems.", - }, - { - icon: "calculate", - title: "Competitive Programming", - desc: "Master data structures, algorithms, and graph theory to dominate on ICPC and Codeforces.", - }, - { - icon: "brush", - title: "UI/UX & Product Design", - desc: "Craft interfaces and experiences with Figma, design systems, and user research principles.", - }, -]; - -const STATS = [ - { value: "50+", label: "Active Projects & Mentorships", bg: "bg-background-light", valueCls: "text-primary", labelCls: "text-slate-900", span: 1 }, - { value: "150+", label: "Flagship Hackathons Won", bg: "bg-primary", valueCls: "text-white", labelCls: "text-white/90", span: 1 }, - { value: "1,000,000+", label: "Lines of Open Source Code", bg: "bg-slate-900", valueCls: "text-white", labelCls: "text-white/80", span: 2 }, -]; - -const TIMELINE = [ - { - phase: "01", - title: "Applications Open", - date: "Sep 15 – Oct 05, 2026", - desc: "Fill out the recruitment form online. Tell us about yourself, your interests, and any projects you've worked on. No GPA cutoff — we hire on curiosity.", - icon: "edit_note", - color: "bg-background-light", - accent: "text-primary", - }, - { - phase: "02", - title: "Orientation & Info Session", - date: "Oct 08, 2026", - desc: "Attend our in-person orientation session. Meet current members, tour the lab, ask questions, and understand what each domain works on day-to-day.", - icon: "groups", - color: "bg-primary", - accent: "text-white", - }, - { - phase: "03", - title: "Technical Tasks", - date: "Oct 10 – Oct 17, 2026", - desc: "Complete a short domain-specific task designed to be educational, not eliminatory. There's no single right answer — we're looking for how you think.", - icon: "terminal", - color: "bg-background-light", - accent: "text-primary", - }, - { - phase: "04", - title: "Induction", - date: "Oct 22, 2026", - desc: "Successful candidates are welcomed into CODEX ITER. You'll be matched with a mentor, onboarded to an active project, and join the family.", - icon: "verified", - color: "bg-slate-900", - accent: "text-white", - }, -]; - -const FAQS = [ - { - question: "Do I need prior coding experience to apply?", - answer: - "No prior experience is required for most of our wings. We value curiosity and a willingness to learn over existing skill level. That said, competitive programming and AI/ML wings may expect some foundational comfort with programming logic. Our orientation session will help you find the right fit.", - }, - { - question: "What is the expected time commitment?", - answer: - "Most members dedicate 6–10 hours per week on average. This includes weekly domain meetings, project work, and optional workshops or events. During hackathon season it may be more — but it's always opt-in based on your bandwidth.", - }, - { - question: "Can students from all branches apply?", - answer: - "Absolutely. CODEX ITER is open to all undergraduate students of ITER, regardless of branch. We have members from CSE, ECE, Mechanical, Civil, and beyond. Diverse perspectives make our work stronger.", - }, - { - question: "Will I work on real projects or just learn theory?", - answer: - "Real projects, always. From day one you'll be contributing to active repositories, collaborating with seniors, and shipping work that may go live on our platform or in partner organizations. Theory is delivered through workshops alongside hands-on execution.", - }, - { - question: "Is there a fee to join CODEX ITER?", - answer: - "There is no fee to apply or join. CODEX ITER is a student-run, merit-based organization. Events and workshops hosted throughout the year are free for all members.", - }, - { - question: "What happens after I complete the technical task?", - answer: - "All submitted tasks are reviewed by domain leads within 3–5 days. Every applicant receives feedback regardless of outcome. Selected candidates are invited to an informal conversation before the final induction announcement.", - }, -]; - -// ─── Main Page Component ────────────────────────────────────────────────────── -export default function Orientation() { - const HERO_TITLE = "BUILD THE FUTURE:"; - const HERO_SUB1 = "RECRUITMENT"; - const HERO_SUB2 = "2026"; - - const subheadDelay = 0.3 + HERO_TITLE.length * 0.04 + 0.5 + 400; - const { displayed, done } = useTypingEffect( - "Welcome freshmen and sophomore developers. Join a powerhouse of technical innovation.", - subheadDelay - ); - - const CHAR_COUNT = (HERO_TITLE + " " + HERO_SUB1 + " " + HERO_SUB2).length; - const ctaDelay = 0.3 + CHAR_COUNT * 0.04 + 0.8; - - return ( -
- - - {/* ── ORIENTATION NAVBAR ──────────────────────────────────────── */} - - - {/* ── HERO ─────────────────────────────────────────────────────── */} -
-
- {/* Left: copy */} -
- - RECRUITMENT // INTAKE 2026 - - -

- - {" "}
- - - {" "} -
- -

- - {/* Typing subheading */} -

- {displayed} - {!done && ( - - )} -

- - - - Register Now - - - View Timeline - - -
- - {/* Right: neo-brutalist terminal card */} - - {/* Tilted background layer */} - - {/* Terminal card */} -
- {/* Terminal chrome bar */} -
- - - - codex_recruit.sh -
- {/* Terminal body */} -
-
// CODEX ITER — Intake 2026
-
$ ./begin_recruitment.sh
-
▶ Initializing recruitment sequence...
- -
- while - (curious) {"{"} -
-
- code - (); -
-
- innovate - (); -
-
- collaborate - (); -
-
{"}"}
- -
// Domains accepting applications:
-
- const domains = [ -
- {["\"Web & Systems\"", "\"AI / ML\"", "\"Competitive Programming\"", "\"UI/UX Design\""].map((d, i) => ( -
{d},
- ))} -
];
- - - $ - apply --intake=2026 - - -
- - {/* Floating code fragments */} - - - - -
-
-
-
- - {/* ── IMPACT STATS ─────────────────────────────────────────────── */} -
-
-
- -

- A Community
- Built on Results -

-
-

- CODEX ITER isn't just a club — it's an ecosystem. In ten years we've launched startups, won national hackathons, and shipped open-source projects used by thousands. -

-

- When you join, you inherit a decade of collective knowledge, a senior-to-junior mentorship culture, and direct access to builders who are actively shipping. -

-
-
- - - {STATS.map((stat, i) => ( - -
-
- {stat.value} -
-
- {stat.label} -
-
-
- ))} -
-
-
-
- - {/* ── DOMAINS ──────────────────────────────────────────────────── */} -
-
- -

- What We
Master -

-
- // RECRUITMENT WINGS -
-
- - - {DOMAINS.map((domain, i) => ( - - - - {domain.icon} - -

{domain.title}

-

{domain.desc}

-
-
- ))} -
-
-
- - {/* ── TIMELINE ─────────────────────────────────────────────────── */} -
-
- -
-

- Recruitment
Roadmap -

-
- // INDUCTION PHASES -
-
-
- -
- {/* Vertical connector */} -
- - - {TIMELINE.map((phase, i) => ( - -
- {/* Phase badge */} -
- Phase - {phase.phase} -
- - {/* Card */} - -
-
- {phase.icon} -

{phase.title}

-
- - {phase.date} - -
-

{phase.desc}

-
-
-
- ))} -
-
-
-
- - {/* ── FAQ ──────────────────────────────────────────────────────── */} -
-
- -
-

- Got
Questions? -

-
- // FAQ -
-
-
- - - {FAQS.map((faq, i) => ( - - - - ))} - -
-
- - {/* ── FINAL CTA ────────────────────────────────────────────────── */} - -
-
-
- Applications Open — Intake 2026 -
-

- Join The Codex. -

-

- Register for the orientation session and take the first step into a decade-long legacy of technical excellence. -

-
- - REGISTER NOW - - - JOIN OUR CHANNEL - -
-
-
-
-
- ); -}