-
+
{/* Static Red Corner Brackets - Enhanced Vibrancy & Glow */}
@@ -34,7 +34,7 @@ const CurrentSponsors = () => {
-
+
{/* Powered By Section */}
@@ -80,6 +80,31 @@ const CurrentSponsors = () => {
+
+
+
+ {/* Organizing Partner Section */}
+
+
+ Organizing Partner
+
+
+
+
+
{/* Background Data Matrix (Very Subtle) */}
diff --git a/src/components/landing/Header.tsx b/src/components/landing/Header.tsx
index 1f58fa9..45b59eb 100644
--- a/src/components/landing/Header.tsx
+++ b/src/components/landing/Header.tsx
@@ -377,10 +377,10 @@ const LandingHeader = () => {
{/* Value Prop Cards Grid - Replacing Description */}
{[
- { icon:
, title: "₹5 Lakh Prize Pool" },
- { icon:
, title: "Internship Oppurtunities" },
- { icon:
, title: "Real-World Training" },
- { icon:
, title: "Certified & Recognized" }
+ { icon:
, title: "₹5 Lakh Worth Grand Prize Pool" },
+ { icon:
, title: "Placement & Internship Opportunities" },
+ { icon:
, title: "Expert Training & Sessions" },
+ { icon:
, title: "Get Certified & Recognized" }
].map((prop, index) => (
{
- return (
-
-
-
-
- Our Past Sponsors
-
-
-
-
-
-
-
- {[...sponsors, ...sponsors].map((sponsor, index) => (
-
-

-
- ))}
-
-
-
-
-
-
-
- );
-};
-
-export default PastSponsorsMarquee;
diff --git a/src/components/landing/PastSponsorsTable.tsx b/src/components/landing/PastSponsorsTable.tsx
new file mode 100644
index 0000000..67c95ed
--- /dev/null
+++ b/src/components/landing/PastSponsorsTable.tsx
@@ -0,0 +1,71 @@
+"use client";
+
+import React from 'react';
+import { motion } from 'framer-motion';
+
+const sponsors = [
+ { name: 'Schneider Electric', logo: '/assets/images/past_sponsors/Schneider.png' },
+ { name: 'Secfence', logo: '/assets/images/past_sponsors/Secfence.png' },
+ { name: 'audius', logo: '/assets/images/past_sponsors/audius.png', isLarge: true },
+ { name: 'bugcrowd', logo: '/assets/images/past_sponsors/bugcrowd.png' },
+ { name: 'cred', logo: '/assets/images/past_sponsors/cred.png', isLarge: true },
+ { name: 'crowdstrike', logo: '/assets/images/past_sponsors/crowdstrike.png', isLarge: true },
+ { name: 'greatLearning', logo: '/assets/images/past_sponsors/greatLearning.png' },
+ { name: 'h&r_block', logo: '/assets/images/past_sponsors/h&r_block.png', isLarge: true },
+ { name: 'salesforce', logo: '/assets/images/past_sponsors/salesforce.png', isLarge: true },
+ { name: 'vmware', logo: '/assets/images/past_sponsors/vmware.png', isLarge: true },
+ { name: 'zoho', logo: '/assets/images/past_sponsors/zoho.png', isLarge: true },
+ { name: 'Team bi0s', logo: '/assets/images/logos/bi0s_dark.png' },
+];
+
+const PastSponsorsTable = () => {
+ return (
+
+ );
+};
+
+export default PastSponsorsTable;
From d048eac92c29943419196def5a7f4a911d2d9fcd Mon Sep 17 00:00:00 2001
From: Nitansh Shankar <167768158+BIJJUDAMA@users.noreply.github.com>
Date: Wed, 1 Apr 2026 15:55:02 +0530
Subject: [PATCH 2/5] feat: optimize speaker bio modal with mobile scroll-lock,
navbar occlusion, and z-index priority; deactivate abhishek jm profile state
---
src/components/landing/CurrentSpeakers.tsx | 27 ++++++++++++++++++----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/src/components/landing/CurrentSpeakers.tsx b/src/components/landing/CurrentSpeakers.tsx
index 764ec94..5ce9125 100644
--- a/src/components/landing/CurrentSpeakers.tsx
+++ b/src/components/landing/CurrentSpeakers.tsx
@@ -99,6 +99,23 @@ const CurrentSpeakers: React.FC = () => {
const isTitleInView = useInView(titleRef, { once: true });
const [selectedSpeaker, setSelectedSpeaker] = React.useState(null);
+ React.useEffect(() => {
+ const header = document.querySelector('header');
+ if (selectedSpeaker) {
+ document.body.style.overflow = 'hidden';
+ if (window.innerWidth <= 768 && header) {
+ header.style.display = 'none';
+ }
+ } else {
+ document.body.style.overflow = 'unset';
+ if (header) header.style.display = 'flex';
+ }
+ return () => {
+ document.body.style.overflow = 'unset';
+ if (header) header.style.display = 'flex';
+ };
+ }, [selectedSpeaker]);
+
const scroll = (direction: 'left' | 'right') => {
if (scrollRef.current) {
const amount = 320;
@@ -166,22 +183,22 @@ const CurrentSpeakers: React.FC = () => {
{/* Speaker Bio Modal */}
{selectedSpeaker && (
-
+
{/* Backdrop */}
setSelectedSpeaker(null)}
- className="absolute inset-0 bg-black/80 backdrop-blur-xl"
+ className="absolute inset-0 bg-black/90 backdrop-blur-xl"
/>
{/* Modal Content */}
{/* Tactical Accents */}
From 9616ba837937818e2ef9436a52e221adfb622312 Mon Sep 17 00:00:00 2001
From: Nitansh Shankar <167768158+BIJJUDAMA@users.noreply.github.com>
Date: Wed, 1 Apr 2026 15:57:17 +0530
Subject: [PATCH 3/5] chore: Update Abhishek JM info
---
src/components/landing/CurrentSpeakers.tsx | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/components/landing/CurrentSpeakers.tsx b/src/components/landing/CurrentSpeakers.tsx
index 5ce9125..c636bbf 100644
--- a/src/components/landing/CurrentSpeakers.tsx
+++ b/src/components/landing/CurrentSpeakers.tsx
@@ -21,11 +21,10 @@ const speakers: Speaker[] = [
},
{
name: 'Abhishek JM',
- title: '',
+ title: 'Lead Security Engineer at CRED',
company: 'Cred',
image: '/inctf/assets/images/current_speakers/Abhishek_JM.jpeg',
- // Keeping bio and role blank/unclickable
- bio: ''
+ bio: `Abhishek JM is a Lead Security Engineer at CRED, specializing in mobile security and application security for large-scale fintech systems. He is also a trainer at 7ASecurity, where he has delivered hands-on training at global conferences including OWASP AppSec New Zealand, 44Con, and ThreatCon.\n\nWith extensive experience in offensive security, Abhishek leads security research projects such as Adhrit and EVABS, focusing on advanced mobile and application security testing. His work has been presented at premier venues like Black Hat (Asia, US, Europe) and OWASP Seasides, with his tool Adhrit gaining industry recognition.\n\nHe is an active contributor to the security community, regularly speaking at conferences and meetups, and has also served as a trainer for international security programs, helping mentor the next generation of cybersecurity professionals.`
},
];
From 94d9dc237a86c2928b97b1189ef3d494c3a81c2d Mon Sep 17 00:00:00 2001
From: Nitansh Shankar <167768158+BIJJUDAMA@users.noreply.github.com>
Date: Wed, 1 Apr 2026 16:00:48 +0530
Subject: [PATCH 4/5] chore: Update Abhishek's title
---
src/components/landing/CurrentSpeakers.tsx | 77 +++++++++++++++-------
1 file changed, 54 insertions(+), 23 deletions(-)
diff --git a/src/components/landing/CurrentSpeakers.tsx b/src/components/landing/CurrentSpeakers.tsx
index c636bbf..be76c6b 100644
--- a/src/components/landing/CurrentSpeakers.tsx
+++ b/src/components/landing/CurrentSpeakers.tsx
@@ -1,7 +1,14 @@
'use client';
import React, { useRef } from 'react';
-import { motion, useInView } from 'framer-motion';
+import { motion, AnimatePresence } from 'framer-motion';
import { ChevronLeft, ChevronRight, X } from 'lucide-react';
+import gsap from 'gsap';
+import { useGSAP } from '@gsap/react';
+import { ScrollTrigger } from 'gsap/ScrollTrigger';
+
+if (typeof window !== 'undefined') {
+ gsap.registerPlugin(ScrollTrigger);
+}
interface Speaker {
name: string;
@@ -29,17 +36,11 @@ const speakers: Speaker[] = [
];
const SpeakerCard: React.FC<{ speaker: Speaker; index: number; onClick: () => void }> = ({ speaker, index, onClick }) => {
- const ref = useRef(null);
- const isInView = useInView(ref, { once: true });
const isClickable = !!speaker.bio;
return (
-
-
+
);
};
const CurrentSpeakers: React.FC = () => {
+ const containerRef = useRef
(null);
const scrollRef = useRef(null);
- const titleRef = useRef(null);
- const isTitleInView = useInView(titleRef, { once: true });
const [selectedSpeaker, setSelectedSpeaker] = React.useState(null);
+ useGSAP(() => {
+ if (!containerRef.current) return;
+
+ const tl = gsap.timeline({
+ scrollTrigger: {
+ trigger: containerRef.current,
+ start: 'top 85%',
+ toggleActions: 'play none none none'
+ }
+ });
+
+ // Animate Title
+ tl.fromTo('.speakers-header',
+ { opacity: 0, y: 30 },
+ { opacity: 1, y: 0, duration: 0.8, ease: 'power3.out' }
+ );
+
+ // Stagger Cards
+ tl.fromTo('.speaker-card',
+ {
+ opacity: 0,
+ y: 40,
+ scale: 0.95
+ },
+ {
+ opacity: 1,
+ y: 0,
+ scale: 1,
+ duration: 0.8,
+ stagger: 0.1,
+ ease: 'power3.out'
+ },
+ '-=0.6'
+ );
+ }, { scope: containerRef });
+
React.useEffect(() => {
const header = document.querySelector('header');
if (selectedSpeaker) {
@@ -126,15 +162,10 @@ const CurrentSpeakers: React.FC = () => {
};
return (
-
+
{/* Section Header */}
-
-
+
+
[ Expert Speakers ]
@@ -159,7 +190,7 @@ const CurrentSpeakers: React.FC = () => {
-
+
@@ -180,7 +211,7 @@ const CurrentSpeakers: React.FC = () => {
{/* Speaker Bio Modal */}
-
+
{selectedSpeaker && (
{/* Backdrop */}
@@ -248,7 +279,7 @@ const CurrentSpeakers: React.FC = () => {
)}
-
+
);
};
From 8dd965a30523600dfe1ee86c394a95b3bb0a9cec Mon Sep 17 00:00:00 2001
From: Nitansh Shankar <167768158+BIJJUDAMA@users.noreply.github.com>
Date: Wed, 1 Apr 2026 16:05:38 +0530
Subject: [PATCH 5/5] feat: added + nodes for sponsors
---
src/components/landing/PastSponsorsTable.tsx | 95 +++++++++++++++++---
1 file changed, 82 insertions(+), 13 deletions(-)
diff --git a/src/components/landing/PastSponsorsTable.tsx b/src/components/landing/PastSponsorsTable.tsx
index 67c95ed..917b8f4 100644
--- a/src/components/landing/PastSponsorsTable.tsx
+++ b/src/components/landing/PastSponsorsTable.tsx
@@ -1,7 +1,13 @@
"use client";
-import React from 'react';
-import { motion } from 'framer-motion';
+import React, { useRef } from 'react';
+import gsap from 'gsap';
+import { useGSAP } from '@gsap/react';
+import { ScrollTrigger } from 'gsap/ScrollTrigger';
+
+if (typeof window !== 'undefined') {
+ gsap.registerPlugin(ScrollTrigger);
+}
const sponsors = [
{ name: 'Schneider Electric', logo: '/assets/images/past_sponsors/Schneider.png' },
@@ -19,8 +25,62 @@ const sponsors = [
];
const PastSponsorsTable = () => {
+ const containerRef = useRef(null);
+
+ useGSAP(() => {
+ if (!containerRef.current) return;
+
+ const cells = containerRef.current.querySelectorAll('.sponsor-cell');
+
+ // Initial state set via CSS (opacity: 0)
+
+ gsap.to(cells, {
+ opacity: 1,
+ y: 0,
+ scale: 1,
+ duration: 0.8,
+ stagger: 0.1,
+ ease: 'expo.out',
+ scrollTrigger: {
+ trigger: containerRef.current,
+ start: 'top 85%',
+ toggleActions: 'play none none none'
+ },
+ onStart: (target) => {
+ // Simplified Decoding jitter effect using random opacity jumps
+ gsap.to(cells, {
+ opacity: 1,
+ overwrite: 'auto'
+ });
+ }
+ });
+
+ // Add a secondary "decoding" flutter for each element
+ cells.forEach((cell, i) => {
+ gsap.fromTo(cell,
+ { opacity: 0 },
+ {
+ opacity: 1,
+ duration: 0.1,
+ repeat: 4,
+ repeatDelay: 0.05,
+ yoyo: true,
+ delay: i * 0.1, // Match stagger
+ scrollTrigger: {
+ trigger: containerRef.current,
+ start: 'top 85%',
+ },
+ onComplete: () => {
+ gsap.set(cell, { opacity: 1 });
+ }
+ }
+ );
+ });
+
+ }, { scope: containerRef });
+
return (
-