From a431c5faf58eca848b77f6f43be8c26ab2eb635a Mon Sep 17 00:00:00 2001 From: Yogesh Date: Fri, 7 Aug 2026 23:10:27 +0530 Subject: [PATCH 1/5] feat: Gravitas'26 codechef events banners --- public/events/clueminati.png | Bin 0 -> 54893 bytes public/events/cookoff.jpg | Bin 0 -> 16438 bytes src/components/CatalogueContent.tsx | 88 ++++-- src/components/Navbar.tsx | 36 ++- .../ui/announcement/Announcement.tsx | 281 ++++++++++-------- src/components/ui/announcement/EventLogo.tsx | 143 +++++++++ src/config/events.ts | 53 ++++ 7 files changed, 454 insertions(+), 147 deletions(-) create mode 100644 public/events/clueminati.png create mode 100644 public/events/cookoff.jpg create mode 100644 src/components/ui/announcement/EventLogo.tsx create mode 100644 src/config/events.ts diff --git a/public/events/clueminati.png b/public/events/clueminati.png new file mode 100644 index 0000000000000000000000000000000000000000..12d67624185088cf314c4b6852b12ffb418d665e GIT binary patch literal 54893 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

?9!l6-r6 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 literal 0 HcmV?d00001 diff --git a/public/events/cookoff.jpg b/public/events/cookoff.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0c21fecfc4ff58814075792f82ac9d4f38f3760 GIT binary patch literal 16438 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 f?~gZiI6t-7so)-Qe9Y7I@ literal 0 HcmV?d00001 diff --git a/src/components/CatalogueContent.tsx b/src/components/CatalogueContent.tsx index 2dcde869..6ca55d53 100644 --- a/src/components/CatalogueContent.tsx +++ b/src/components/CatalogueContent.tsx @@ -19,6 +19,8 @@ import { FilterProvider, useFilters } from "@/context/filterContext"; import EmptyState from "./ui/EmptyState"; import SidebarButton from "./SidebarButton"; import SortComponent from "./ui/sorting"; +import Announcement from "./ui/announcement/Announcement"; +import { getSubjectEvent, EVENTS, type EventData } from "@/config/events"; const CatalogueContentInner = ({ subject }: { subject: string | null }) => { const [isMounted, setIsMounted] = useState(false); @@ -235,6 +237,72 @@ const CatalogueContentInner = ({ subject }: { subject: string | null }) => { setAppliedFilters, ]); + const [activeEvent, setActiveEvent] = useState(null); + + useEffect(() => { + setActiveEvent(getSubjectEvent(subject)); + }, [subject]); + + const renderGridItems = (paperList: IPaper[]) => { + if (paperList.length === 0) return null; + const currentEvent = activeEvent ?? EVENTS[0]!; + + const items: React.ReactNode[] = []; + paperList.forEach((paper, index) => { + if (index === 2) { + items.push( + , + ); + } + items.push( + p._id === paper._id)} + />, + ); + }); + + if (paperList.length > 0 && paperList.length < 2) { + items.push( + , + ); + } + + return items; + }; + // Render loading state until mounted to avoid hydration mismatch if (!isMounted) { return ; @@ -338,30 +406,14 @@ const CatalogueContentInner = ({ subject }: { subject: string | null }) => { > {appliedFilters ? ( paginatedPapers.length > 0 ? ( - paginatedPapers.map((paper: IPaper) => ( - p._id === paper._id, - )} - /> - )) + renderGridItems(paginatedPapers) ) : (

) ) : ( - paginatedPapers.map((paper: IPaper) => ( - p._id === paper._id)} - /> - )) + renderGridItems(paginatedPapers) )} {totalPages > 1 && ( diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 27f56e69..59bcdb4c 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -22,17 +22,20 @@ import { import { useCourses } from "@/context/courseContext"; import PinnedModal from "./ui/PinnedModal"; import RequestModal from "./ui/RequestModal"; -//import CookoffBanner from "./CookoffBanner"; +import Announcement from "./ui/announcement/Announcement"; +import { EVENTS } from "@/config/events"; function Navbar() { const pathname: string = usePathname() ?? "/"; const [dropdownOpen, setDropdownOpen] = useState(false); + const [bannerEvent, setBannerEvent] = useState<(typeof EVENTS)[0] | null>(null); const { courses } = useCourses(); useEffect(() => { - if (pathname !== "/catalogue") return; - }, [pathname]); + const randomIndex = Math.floor(Math.random() * EVENTS.length); + setBannerEvent(EVENTS[randomIndex] ?? EVENTS[0]!); + }, []); const renderHomePageButtons = () => ( <> @@ -59,16 +62,23 @@ function Navbar() { return (
- {/**/} - {/* */} + {bannerEvent && ( + + )}
{} diff --git a/src/components/ui/announcement/Announcement.tsx b/src/components/ui/announcement/Announcement.tsx index 9afd4f11..795c16a6 100644 --- a/src/components/ui/announcement/Announcement.tsx +++ b/src/components/ui/announcement/Announcement.tsx @@ -3,38 +3,29 @@ import * as React from "react"; import Image from "next/image"; import Link from "next/link"; -import { X, Megaphone, ArrowUpRight, type LucideIcon } from "lucide-react"; +import { X, ArrowUpRight, ExternalLink } from "lucide-react"; import { cn } from "@/lib/utils"; +import { EventLogo } from "./EventLogo"; export type AnnouncementAccent = "purple" | "amber" | "green" | "rose"; export type AnnouncementVariant = "banner" | "card"; export interface AnnouncementProps { - /** - * Stable, unique id for this announcement (e.g. "cookoff-2026"). - * Used as the localStorage key so a dismissal is remembered per-campaign, - * not globally — dismissing one promo doesn't hide future ones. - */ id: string; title: string; message: string; variant?: AnnouncementVariant; - /** Call-to-action label, e.g. "Register now". Omit to render without a CTA. */ ctaLabel?: string; - /** Where the CTA (and, for banners, the whole strip) links to. External links open in a new tab automatically. */ href?: string; - /** Card-variant only: image shown above the copy (16:9). Ignored for banners. */ + secondaryCtaLabel?: string; + secondaryHref?: string; imageUrl?: string; imageAlt?: string; - /** Custom lucide icon; defaults to a megaphone. */ - icon?: LucideIcon; - /** Color preset. Pick based on urgency/category, not vibes: purple = general promo, amber = time-sensitive, green = opportunity/open, rose = urgent/closing soon. */ + logoType?: "clueminati" | "cookoff" | "default"; + badge?: string; accent?: AnnouncementAccent; - /** Whether the person can dismiss it. Defaults to true. */ dismissible?: boolean; - /** ISO date string. Past this date the announcement stops rendering, dismissed or not — no stale promos. */ expiresAt?: string; - /** Shows a small "Sponsored" tag for transparency. Defaults to true — this is an ad, say so. */ sponsored?: boolean; onDismiss?: () => void; className?: string; @@ -50,48 +41,58 @@ const accentStyles: Record< chipIcon: string; accentText: string; cta: string; + secondaryCta: string; tagText: string; + badgeBg: string; } > = { purple: { - cardBorder: "border-[#734DFF] dark:border-[#36266D]", - cardSurface: "bg-white dark:bg-[#171720]", - bannerSurface: "bg-[#EFEAFF] dark:bg-[#171720]", - chip: "bg-[#EFEAFF] dark:bg-[#262635]", - chipIcon: "text-[#562EE7] dark:text-[#A79DFF]", - accentText: "text-[#562EE7] dark:text-[#A79DFF]", - cta: "bg-[#734DFF] text-white hover:bg-[#5F3FE0]", - tagText: "text-[#734DFF] dark:text-[#A79DFF]", + cardBorder: "border-[#734DFF] dark:border-[#562EE7]", + cardSurface: "bg-white dark:bg-[#120B24]", + bannerSurface: "bg-[#EFEAFF] dark:bg-[#1A1133]", + chip: "bg-[#EFEAFF] dark:bg-[#231845]", + chipIcon: "text-[#562EE7] dark:text-[#C4B5FD]", + accentText: "text-[#562EE7] dark:text-[#A78BFA]", + cta: "bg-[#734DFF] text-white hover:bg-[#5F3FE0] dark:bg-[#6D28D9] dark:hover:bg-[#5B21B6]", + secondaryCta: "border border-[#734DFF] text-[#562EE7] hover:bg-[#EFEAFF] dark:border-[#7C3AED] dark:text-[#C4B5FD] dark:hover:bg-[#2E1A47]", + tagText: "text-[#734DFF] dark:text-[#C4B5FD]", + badgeBg: "bg-[#EFEAFF] text-[#562EE7] dark:bg-[#2E1A47] dark:text-[#C4B5FD]", }, amber: { - cardBorder: "border-[#d97706] dark:border-[#7c4a08]", - cardSurface: "bg-white dark:bg-[#171720]", - bannerSurface: "bg-[#fef3c7] dark:bg-[#3a2a05]", - chip: "bg-[#fde8b8] dark:bg-[#4a3608]", - chipIcon: "text-[#92600b] dark:text-[#f5c451]", - accentText: "text-[#92600b] dark:text-[#f5c451]", - cta: "bg-[#d97706] text-white hover:bg-[#b8630a]", - tagText: "text-[#92600b] dark:text-[#f5c451]", + cardBorder: "border-[#D97706] dark:border-[#B45309]", + cardSurface: "bg-white dark:bg-[#1C1305]", + bannerSurface: "bg-[#FEF3C7] dark:bg-[#2A1C07]", + chip: "bg-[#FDE8B8] dark:bg-[#3D290A]", + chipIcon: "text-[#92600B] dark:text-[#FCD34D]", + accentText: "text-[#92600B] dark:text-[#FBBF24]", + cta: "bg-[#D97706] text-white hover:bg-[#B8630A] dark:bg-[#D97706] dark:hover:bg-[#B45309]", + secondaryCta: "border border-[#D97706] text-[#92600B] hover:bg-[#FEF3C7] dark:border-[#F59E0B] dark:text-[#FCD34D] dark:hover:bg-[#3D290A]", + tagText: "text-[#92600B] dark:text-[#FCD34D]", + badgeBg: "bg-[#FEF3C7] text-[#92600B] dark:bg-[#3D290A] dark:text-[#FCD34D]", }, green: { - cardBorder: "border-[#16a34a] dark:border-[#0f6b32]", - cardSurface: "bg-white dark:bg-[#171720]", - bannerSurface: "bg-[#dcfce7] dark:bg-[#052e13]", - chip: "bg-[#c7f7d4] dark:bg-[#0b3d1c]", - chipIcon: "text-[#15803d] dark:text-[#6ee7a0]", - accentText: "text-[#15803d] dark:text-[#6ee7a0]", - cta: "bg-[#16a34a] text-white hover:bg-[#128a3e]", - tagText: "text-[#15803d] dark:text-[#6ee7a0]", + cardBorder: "border-[#16A34A] dark:border-[#15803D]", + cardSurface: "bg-white dark:bg-[#071C0F]", + bannerSurface: "bg-[#DCFCE7] dark:bg-[#0B331A]", + chip: "bg-[#C7F7D4] dark:bg-[#124D28]", + chipIcon: "text-[#15803D] dark:text-[#86EFAC]", + accentText: "text-[#15803D] dark:text-[#4ADE80]", + cta: "bg-[#16A34A] text-white hover:bg-[#128A3E]", + secondaryCta: "border border-[#16A34A] text-[#15803D] hover:bg-[#DCFCE7] dark:border-[#22C55E] dark:text-[#86EFAC] dark:hover:bg-[#124D28]", + tagText: "text-[#15803D] dark:text-[#86EFAC]", + badgeBg: "bg-[#DCFCE7] text-[#15803D] dark:bg-[#124D28] dark:text-[#86EFAC]", }, rose: { - cardBorder: "border-[#e11d48] dark:border-[#8a0f2c]", - cardSurface: "bg-white dark:bg-[#171720]", - bannerSurface: "bg-[#ffe4e6] dark:bg-[#3f0d16]", - chip: "bg-[#ffd2d6] dark:bg-[#521022]", - chipIcon: "text-[#be123c] dark:text-[#fda4b0]", - accentText: "text-[#be123c] dark:text-[#fda4b0]", - cta: "bg-[#e11d48] text-white hover:bg-[#c11640]", - tagText: "text-[#be123c] dark:text-[#fda4b0]", + cardBorder: "border-[#E11D48] dark:border-[#BE123C]", + cardSurface: "bg-white dark:bg-[#1F070C]", + bannerSurface: "bg-[#FFE4E6] dark:bg-[#380D17]", + chip: "bg-[#FFD2D6] dark:bg-[#521323]", + chipIcon: "text-[#BE123C] dark:text-[#FDA4AF]", + accentText: "text-[#BE123C] dark:text-[#FB7185]", + cta: "bg-[#E11D48] text-white hover:bg-[#C11640]", + secondaryCta: "border border-[#E11D48] text-[#BE123C] hover:bg-[#FFE4E6] dark:border-[#F43F5E] dark:text-[#FDA4AF] dark:hover:bg-[#521323]", + tagText: "text-[#BE123C] dark:text-[#FDA4AF]", + badgeBg: "bg-[#FFE4E6] text-[#BE123C] dark:bg-[#521323] dark:text-[#FDA4AF]", }, }; @@ -130,19 +131,6 @@ function SmartLink({ ); } -/** - * Reusable promo/announcement unit for advertising events, deadlines, or - * sponsors on the papers site. Two variants: - * - * - "banner": a thin dismissible strip, meant for the top of a page. - * - "card": a promo card sized to match `Card.tsx`, meant to sit inside - * the same paper grid (`grid-cols-1 md:grid-cols-2 lg:grid-cols-4`) as - * a native-feeling in-feed ad. - * - * Dismissal is remembered per `id` in localStorage, and an optional - * `expiresAt` retires the announcement automatically so stale promos never - * linger after an event has passed. - */ export default function Announcement({ id, title, @@ -150,9 +138,12 @@ export default function Announcement({ variant = "banner", ctaLabel, href, + secondaryCtaLabel, + secondaryHref, imageUrl, imageAlt, - icon: Icon = Megaphone, + logoType = "default", + badge, accent = "purple", dismissible = true, expiresAt, @@ -183,11 +174,13 @@ export default function Announcement({ } }, [storageKey, dismissible]); - const handleDismiss = () => { + const handleDismiss = (e: React.MouseEvent) => { + e.stopPropagation(); setDismissed(true); try { window.localStorage.setItem(storageKey, "true"); } catch { + // ignore quota / security error } onDismiss?.(); }; @@ -202,37 +195,44 @@ export default function Announcement({ role="region" aria-label={sponsored ? `Sponsored announcement: ${title}` : `Announcement: ${title}`} className={cn( - "relative w-full font-play", + "relative w-full font-play border-b border-purple-200/40 dark:border-purple-900/40 shadow-sm transition-all duration-200", styles.bannerSurface, className, )} > -
-
- -
+
+ {imageUrl ? ( + {imageAlt + ) : ( + + )} -
- +
+ {badge && ( + + {badge} + + )} + {title} - + {message}
-
- {sponsored && ( - - Sponsored - - )} - +
{ctaLabel && href && ( @@ -241,11 +241,24 @@ export default function Announcement({ )} + {secondaryCtaLabel && secondaryHref && ( + + )} + {dismissible && ( @@ -256,65 +269,101 @@ export default function Announcement({ ); } - // Card variant — sized to sit inside the same grid as paper Cards. + // Card variant — sized to sit inside the same grid as paper Cards in Catalogue. return (
+ {/* NO X MARK button here when dismissible=false, ensuring in-feed grid event cards are persistent */} {dismissible && ( )} - {imageUrl ? ( - {imageAlt - ) : ( -
- -
- )} + {/* Header Banner Graphic / Image */} +
+ {imageUrl ? ( + {imageAlt + ) : ( +
+ + {badge && ( + + {badge} + + )} +
+ )} +
+ +
-
-
- {sponsored && ( - - Sponsored + {/* Details & Copy */} +
+
+
+ + CodeChef-VIT Event - )} -
{title}
-

{message}

+ + Gravitas '26 + +
+ +

+ {title} +

+

+ {message} +

- {ctaLabel && href && ( - - {ctaLabel} - - - )} + {/* Action Buttons */} +
+ {ctaLabel && href && ( + + {ctaLabel} + + + )} + + {secondaryCtaLabel && secondaryHref && ( + + {secondaryCtaLabel} + + + )} +
); diff --git a/src/components/ui/announcement/EventLogo.tsx b/src/components/ui/announcement/EventLogo.tsx new file mode 100644 index 00000000..1954aa8d --- /dev/null +++ b/src/components/ui/announcement/EventLogo.tsx @@ -0,0 +1,143 @@ +"use client"; + +import React from "react"; +import { cn } from "@/lib/utils"; + +interface EventLogoProps { + type?: "clueminati" | "cookoff" | "default"; + className?: string; + size?: "sm" | "md" | "lg"; +} + +export function EventLogo({ type = "default", className, size = "md" }: EventLogoProps) { + const sizeClasses = { + sm: "h-8 w-8", + md: "h-12 w-12", + lg: "h-20 w-20 md:h-24 md:w-24", + }; + + if (type === "clueminati") { + return ( +
+ + + + + + + + + + + + + {/* Cyber Eye / Magnifier Outer Ring */} + + + + {/* Magnifier Handle */} + + + {/* Inner Code Bracket / Mystery Lock Element */} + + + + + {/* Glowing Sparkles */} + + + +
+ ); + } + + if (type === "cookoff") { + return ( +
+ + + + + + + + + + + + + + {/* Tech Chef Hat Base */} + + {/* Hat Ribbon / Code Bar */} + + + + {/* Central Coding Flame */} + + + {/* Sparkles */} + + + +
+ ); + } + + // Default CodeChef-VIT Brand Logo Accent + return ( +
+ + + + + + + + + + + + +
+ ); +} diff --git a/src/config/events.ts b/src/config/events.ts new file mode 100644 index 00000000..4172d9e8 --- /dev/null +++ b/src/config/events.ts @@ -0,0 +1,53 @@ +export interface EventData { + id: string; + title: string; + tagline: string; + description: string; + badge: string; + accent: "purple" | "amber" | "green" | "rose"; + registrationUrl: string; + landingPageUrl: string; + imageUrl?: string; + dates?: string; + location?: string; + logoType: "clueminati" | "cookoff"; +} + +export const EVENTS: EventData[] = [ + { + id: "clueminati-2026", + title: "Clueminati 4.0", + tagline: "The Ultimate Tech Treasure Hunt & Gaming Mystery", + description: "Hunt for hidden clues, outsmart tricky puzzles, and level up your way to the top in CodeChef-VIT's gaming mystery event at Gravitas !", + badge: "CLUEMINATI 4.0", + accent: "purple", + registrationUrl: "https://gravitas.vit.ac.in/events/0615fb4d-78b0-4a7c-bc52-ba4cccee2ee6", + landingPageUrl: "https://gravitas.codechefvit.com/", + dates: "Gravitas '26", + location: "VIT Vellore", + logoType: "clueminati", + imageUrl: "/events/clueminati.png", + }, + { + id: "cookoff-2026", + title: "CookOff 11", + tagline: "Largest Competitive Coding Contest", + description: "Test your algorithmic problem solving skills against top coders. Win prizes, certificates, and glory at Gravitas !", + badge: "CookOff 11", + accent: "amber", + registrationUrl: "https://gravitas.vit.ac.in/events/0629102b-cc5f-4992-8921-2e55df1cb2f8", + landingPageUrl: "https://gravitas.codechefvit.com/", + dates: "Gravitas '26", + location: "VIT Vellore", + logoType: "cookoff", + imageUrl: "/events/cookoff.jpg", + }, +]; + +/** + * Always pick 100% randomly between available events on every load. + */ +export function getSubjectEvent(_subjectKey?: string | null): EventData { + const randomIndex = Math.floor(Math.random() * EVENTS.length); + return EVENTS[randomIndex]!; +} From 2444b1f28996aa267c93d36bd37e25573e36b613 Mon Sep 17 00:00:00 2001 From: Yogesh Date: Sat, 8 Aug 2026 00:07:57 +0530 Subject: [PATCH 2/5] fix: hide card ad --- src/components/CatalogueContent.tsx | 4 ++-- src/components/ui/announcement/Announcement.tsx | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/CatalogueContent.tsx b/src/components/CatalogueContent.tsx index 6ca55d53..e6f6d38e 100644 --- a/src/components/CatalogueContent.tsx +++ b/src/components/CatalogueContent.tsx @@ -265,7 +265,7 @@ const CatalogueContentInner = ({ subject }: { subject: string | null }) => { href={currentEvent.registrationUrl} secondaryCtaLabel="Learn More" secondaryHref={currentEvent.landingPageUrl} - dismissible={false} + dismissible={true} />, ); } @@ -295,7 +295,7 @@ const CatalogueContentInner = ({ subject }: { subject: string | null }) => { href={currentEvent.registrationUrl} secondaryCtaLabel="Learn More" secondaryHref={currentEvent.landingPageUrl} - dismissible={false} + dismissible={true} />, ); } diff --git a/src/components/ui/announcement/Announcement.tsx b/src/components/ui/announcement/Announcement.tsx index 795c16a6..47e19a81 100644 --- a/src/components/ui/announcement/Announcement.tsx +++ b/src/components/ui/announcement/Announcement.tsx @@ -281,14 +281,14 @@ export default function Announcement({ className, )} > - {/* NO X MARK button here when dismissible=false, ensuring in-feed grid event cards are persistent */} {dismissible && ( )} From 73c06592dbaf394d8bd17349188273530e46e514 Mon Sep 17 00:00:00 2001 From: Yogesh Date: Sat, 8 Aug 2026 17:41:07 +0530 Subject: [PATCH 3/5] feat: hover effect on card --- .../ui/announcement/Announcement.tsx | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/components/ui/announcement/Announcement.tsx b/src/components/ui/announcement/Announcement.tsx index 47e19a81..80b430f8 100644 --- a/src/components/ui/announcement/Announcement.tsx +++ b/src/components/ui/announcement/Announcement.tsx @@ -48,7 +48,7 @@ const accentStyles: Record< > = { purple: { cardBorder: "border-[#734DFF] dark:border-[#562EE7]", - cardSurface: "bg-white dark:bg-[#120B24]", + cardSurface: "bg-white dark:bg-[#120B24] hover:bg-[#EFEAFF] hover:dark:bg-[#1D1438]", bannerSurface: "bg-[#EFEAFF] dark:bg-[#1A1133]", chip: "bg-[#EFEAFF] dark:bg-[#231845]", chipIcon: "text-[#562EE7] dark:text-[#C4B5FD]", @@ -60,7 +60,7 @@ const accentStyles: Record< }, amber: { cardBorder: "border-[#D97706] dark:border-[#B45309]", - cardSurface: "bg-white dark:bg-[#1C1305]", + cardSurface: "bg-white dark:bg-[#1C1305] hover:bg-[#FEF3C7] hover:dark:bg-[#2B1B07]", bannerSurface: "bg-[#FEF3C7] dark:bg-[#2A1C07]", chip: "bg-[#FDE8B8] dark:bg-[#3D290A]", chipIcon: "text-[#92600B] dark:text-[#FCD34D]", @@ -72,7 +72,7 @@ const accentStyles: Record< }, green: { cardBorder: "border-[#16A34A] dark:border-[#15803D]", - cardSurface: "bg-white dark:bg-[#071C0F]", + cardSurface: "bg-white dark:bg-[#071C0F] hover:bg-[#DCFCE7] hover:dark:bg-[#0E2918]", bannerSurface: "bg-[#DCFCE7] dark:bg-[#0B331A]", chip: "bg-[#C7F7D4] dark:bg-[#124D28]", chipIcon: "text-[#15803D] dark:text-[#86EFAC]", @@ -84,7 +84,7 @@ const accentStyles: Record< }, rose: { cardBorder: "border-[#E11D48] dark:border-[#BE123C]", - cardSurface: "bg-white dark:bg-[#1F070C]", + cardSurface: "bg-white dark:bg-[#1F070C] hover:bg-[#FFE4E6] hover:dark:bg-[#2F0B13]", bannerSurface: "bg-[#FFE4E6] dark:bg-[#380D17]", chip: "bg-[#FFD2D6] dark:bg-[#521323]", chipIcon: "text-[#BE123C] dark:text-[#FDA4AF]", @@ -269,13 +269,27 @@ export default function Announcement({ ); } + const handleCardClick = (e: React.MouseEvent) => { + if (!href) return; + const target = e.target as HTMLElement; + if (target.closest("button, a, input, svg")) return; + + if (isExternal(href)) { + window.open(href, "_blank", "noopener,noreferrer"); + } else { + window.location.href = href; + } + }; + // Card variant — sized to sit inside the same grid as paper Cards in Catalogue. return (
) : ( -
+
{badge && ( @@ -328,7 +342,7 @@ export default function Announcement({
-

+

{title}

From 34c78fdeb2a895336f20c1bdcb1acb14a5486bff Mon Sep 17 00:00:00 2001 From: Yogesh Date: Sat, 8 Aug 2026 17:49:08 +0530 Subject: [PATCH 4/5] feat: carousel like banner for multiple events --- src/components/Navbar.tsx | 76 ++++++++++++----- .../ui/announcement/Announcement.tsx | 83 ++++++++++++++++++- 2 files changed, 135 insertions(+), 24 deletions(-) diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 59bcdb4c..d0a9f0f7 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -29,13 +29,27 @@ function Navbar() { const pathname: string = usePathname() ?? "/"; const [dropdownOpen, setDropdownOpen] = useState(false); - const [bannerEvent, setBannerEvent] = useState<(typeof EVENTS)[0] | null>(null); + const [currentBannerIndex, setCurrentBannerIndex] = useState(0); + const [isPaused, setIsPaused] = useState(false); const { courses } = useCourses(); useEffect(() => { - const randomIndex = Math.floor(Math.random() * EVENTS.length); - setBannerEvent(EVENTS[randomIndex] ?? EVENTS[0]!); - }, []); + if (isPaused || EVENTS.length <= 1) return; + + const interval = setInterval(() => { + setCurrentBannerIndex((prevIndex) => (prevIndex + 1) % EVENTS.length); + }, 5000); + + return () => clearInterval(interval); + }, [isPaused]); + + const handlePrevBanner = () => { + setCurrentBannerIndex((prevIndex) => (prevIndex - 1 + EVENTS.length) % EVENTS.length); + }; + + const handleNextBanner = () => { + setCurrentBannerIndex((prevIndex) => (prevIndex + 1) % EVENTS.length); + }; const renderHomePageButtons = () => ( <> @@ -60,24 +74,46 @@ function Navbar() { ); + const currentEvent = EVENTS[currentBannerIndex] ?? EVENTS[0]!; + return (

- {bannerEvent && ( - + {EVENTS.length > 0 && ( +
setIsPaused(true)} + onMouseLeave={() => setIsPaused(false)} + > +
+ {EVENTS.map((event) => ( +
+ setCurrentBannerIndex(idx)} + /> +
+ ))} +
+
)}
diff --git a/src/components/ui/announcement/Announcement.tsx b/src/components/ui/announcement/Announcement.tsx index 80b430f8..43a992cc 100644 --- a/src/components/ui/announcement/Announcement.tsx +++ b/src/components/ui/announcement/Announcement.tsx @@ -3,7 +3,7 @@ import * as React from "react"; import Image from "next/image"; import Link from "next/link"; -import { X, ArrowUpRight, ExternalLink } from "lucide-react"; +import { X, ArrowUpRight, ExternalLink, ChevronLeft, ChevronRight } from "lucide-react"; import { cn } from "@/lib/utils"; import { EventLogo } from "./EventLogo"; @@ -29,6 +29,11 @@ export interface AnnouncementProps { sponsored?: boolean; onDismiss?: () => void; className?: string; + onPrev?: () => void; + onNext?: () => void; + currentSlide?: number; + totalSlides?: number; + onSlideSelect?: (index: number) => void; } const accentStyles: Record< @@ -150,6 +155,11 @@ export default function Announcement({ sponsored = true, onDismiss, className, + onPrev, + onNext, + currentSlide = 0, + totalSlides = 1, + onSlideSelect, }: AnnouncementProps) { const [mounted, setMounted] = React.useState(false); const [dismissed, setDismissed] = React.useState(false); @@ -167,7 +177,7 @@ export default function Announcement({ setMounted(true); if (dismissible) { try { - setDismissed(window.localStorage.getItem(storageKey) === "true"); + setDismissed(window.sessionStorage.getItem(storageKey) === "true"); } catch { setDismissed(false); } @@ -178,7 +188,7 @@ export default function Announcement({ e.stopPropagation(); setDismissed(true); try { - window.localStorage.setItem(storageKey, "true"); + window.sessionStorage.setItem(storageKey, "true"); } catch { // ignore quota / security error } @@ -189,13 +199,27 @@ export default function Announcement({ const styles = accentStyles[accent]; + const handleBannerClick = (e: React.MouseEvent) => { + if (!href) return; + const target = e.target as HTMLElement; + if (target.closest("button, a, input, svg")) return; + + if (isExternal(href)) { + window.open(href, "_blank", "noopener,noreferrer"); + } else { + window.location.href = href; + } + }; + if (variant === "banner") { return (
-
+
{ctaLabel && href && ( )} + {totalSlides > 1 && ( +
+ + +
+ {Array.from({ length: totalSlides }).map((_, idx) => ( +
+ + +
+ )} + {dismissible && ( - -
- {Array.from({ length: totalSlides }).map((_, idx) => ( -
- - -
- )} - {dismissible && ( )}