"use client"; import { useEffect, useState } from "react"; // import Link from "next/link"; // navigation temporarily disabled import { motion } from "framer-motion"; import { ArrowRight } from "@/components/ui/icons"; // Non-navigating stub — links still render but go nowhere. Restore the import // above to re-enable navigation. const Link = ({ href, onClick, children, ...props }) => ( { e.preventDefault(); onClick?.(e); }} {...props}> {children} ); import AnimatedButton from "@/components/ui/AnimatedButton"; /** * Projects — expanding image columns. Five project strips side by side; the * active one unfolds wide to reveal its story while the rest compress into * slim image slivers with vertical titles. Hover/click/focus selects; * auto-rotates (paused on hover). Mobile gets fully-visible cards, so every * project stays crawlable. */ const PROJECTS = [ { title: "Nebula Arena", slug: "nebula-arena", category: "Game Development", desc: "A cross-platform multiplayer arena with live ops and 60fps battles on mid-range phones.", tags: ["Unity", "Photon"], image: "/images/opt/Pillar1.webp", }, { title: "Atlas Copilot", slug: "atlas-copilot", category: "AI Development", desc: "A GenAI assistant that answers ops questions from internal docs — cutting ticket volume in half.", tags: ["LangChain", "RAG"], image: "/images/opt/HeroBanner3.png", }, { title: "Swiftcart", slug: "swiftcart", category: "Mobile App", desc: "A retail companion app with one-tap reorder and live delivery tracking for 200k+ users.", tags: ["Flutter", "Firebase"], image: "/images/opt/HeroBanner1.webp", }, { title: "Pulseboard", slug: "pulseboard", category: "Data & Analytics", desc: "Realtime analytics that turns event streams into decisions — dashboards in under a second.", tags: ["ClickHouse", "Next.js"], image: "/images/opt/Pillar2.webp", }, { title: "Meridian", slug: "meridian", category: "Web Platform", desc: "A fintech onboarding platform that took signup from days to minutes, fully compliant.", tags: ["Next.js", "PostgreSQL"], image: "/images/opt/HeroBanner2.webp", }, ]; const EASE = [0.21, 0.47, 0.32, 0.98]; const rise = { hidden: { opacity: 0, y: 36 }, show: { opacity: 1, y: 0, transition: { duration: 0.6, ease: EASE } }, }; export default function Projects() { const [active, setActive] = useState(0); const [paused, setPaused] = useState(false); // Gentle auto-rotation; pauses while the visitor interacts. useEffect(() => { if (paused) return; const id = setTimeout(() => setActive((a) => (a + 1) % PROJECTS.length), 5000); return () => clearTimeout(id); }, [active, paused]); return (
{/* Header */} Our work

Selected{" "} projects.

{/* Expanding image columns (desktop) */} setPaused(true)} onMouseLeave={() => setPaused(false)} className="mt-14 hidden h-[32rem] gap-3 lg:flex" > {PROJECTS.map((p, i) => { const isActive = i === active; return (
setActive(i)} onFocus={() => setActive(i)} onClick={() => setActive(i)} tabIndex={0} role="button" aria-expanded={isActive} style={{ flexGrow: isActive ? 3.4 : 1, transition: "flex-grow 0.7s cubic-bezier(0.4, 0, 0.2, 1)", }} className={ "group relative min-w-0 basis-0 cursor-pointer overflow-hidden rounded-3xl border outline-none " + (isActive ? "border-primary/50 shadow-2xl shadow-primary/10" : "border-border") } > {/* image */} {/* washes */} {/* number — top left */} {String(i + 1).padStart(2, "0")} {/* collapsed — vertical title */} {p.title} {/* expanded content — stays mounted (opacity only) */}
{p.category}

{p.title}

{p.desc}

    {p.tags.map((t) => (
  • {t}
  • ))}
View case study
); })}
{/* Mobile — stacked cards, everything visible */} {PROJECTS.map((p, i) => (
{p.category}

{String(i + 1).padStart(2, "0")} {p.title}

{p.desc}

))}
{/* CTA */} View all projects
); }