gsap.to(window, { duration: 0.8, scrollTo: { y: "#mission-grid", offsetY: 240 }, ease: "power2.inOut" })}
diff --git a/src/components/landing/JoinMissionControl.tsx b/src/components/landing/JoinMissionControl.tsx
index 951e6e4..08df192 100644
--- a/src/components/landing/JoinMissionControl.tsx
+++ b/src/components/landing/JoinMissionControl.tsx
@@ -31,7 +31,7 @@ const JoinMissionControl = () => {
whileHover={{ scale: 1.03, boxShadow: "0 0 40px rgba(244,63,94,0.6), 4px 4px 0 rgba(255,255,255,0.7)" }}
whileTap={{ scale: 0.95 }}
style={{ boxShadow: "4px 4px 0 rgba(255,255,255,0.5)" }}
- className="px-8 py-4 bg-gradient-to-br from-red-900 to-red-800 border-2 border-white/60 text-white font-mono font-bold text-lg tracking-wide rounded"
+ className="px-16 py-6 bg-gradient-to-br from-red-900 to-red-800 border-2 border-white/60 text-white font-mono font-bold text-lg tracking-wide rounded"
>
[ Enter Mission Control ]
@@ -42,7 +42,7 @@ const JoinMissionControl = () => {
whileHover={{ scale: 1.03, boxShadow: "0 0 40px rgba(244,63,94,0.6), 4px 4px 0 rgba(255,255,255,0.7)" }}
whileTap={{ scale: 0.95 }}
style={{ boxShadow: "4px 4px 0 rgba(255,255,255,0.5)" }}
- className="px-8 py-4 bg-gradient-to-br from-red-900 to-red-800 border-2 border-white/60 text-white font-mono font-bold text-lg tracking-wide rounded"
+ className="px-16 py-6 bg-gradient-to-br from-red-900 to-red-800 border-2 border-white/60 text-white font-mono font-bold text-lg tracking-wide rounded"
>
[ View Mission Brief ]
diff --git a/src/components/landing/OperationTimeline.tsx b/src/components/landing/OperationTimeline.tsx
new file mode 100644
index 0000000..8d258b4
--- /dev/null
+++ b/src/components/landing/OperationTimeline.tsx
@@ -0,0 +1,225 @@
+'use client';
+import React from 'react';
+import { motion } from 'framer-motion';
+import { Calendar, Target, Trophy, MousePointer2, ChevronRight, ChevronDown } from 'lucide-react';
+
+const timelineEvents = [
+ {
+ date: "APR 01 - APR 31",
+ title: "Masterclass",
+ description: "Talks + training + mock CTF",
+ icon:
,
+ status: "ready",
+ coords: "01.04"
+ },
+ {
+ date: "MAY 09 / 10",
+ title: "Qualifiers",
+ description: "Online jeopardy round",
+ icon:
,
+ status: "locked",
+ coords: "09.05"
+ },
+ {
+ date: "JULY",
+ title: "Finals",
+ description: "On-site competition",
+ icon:
,
+ status: "final",
+ coords: "07.26"
+ }
+];
+
+const RedReticleOverlay = () => (
+
+ {/* Red Corners */}
+
+
+
+
+
+);
+
+const OperationTimeline = () => {
+ return (
+
+ {/* HUD Scanlines */}
+
+
+ {/* Atmospheric Grid Overlay */}
+
+
+
+
+
+
+ [ Operation Milestones ]
+
+
+ Mission Timeline
+
+
+
+
+
+
+ {/* Energy Conduit SVG Line */}
+
+
+
+
+
+
+ {/* Card Flow Arrows (Red) - Visible on desktop only */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {timelineEvents.map((event, index) => (
+
+ {/* Node with Reticle */}
+
+
+ {/* Interior Scanlines */}
+
+
+
+ {event.icon}
+
+
+
+
+
+
+
+ {/* Glassmorphic Tactical Card */}
+
+
+ {/* Hover Glow Effect */}
+
+
+ {/* Top Detail Rail */}
+
+ SYSTEM_{event.status}
+
+
+
+
+
+ {event.date}
+
+
+ {event.title}
+
+
+ {event.description}
+
+
+
+ {/* Bottom Digital Artifacts */}
+
+
+
+
+ {/* Mobile Connector with Downward Chevrons - Enlarged with Gap */}
+ {index < timelineEvents.length - 1 && (
+
+ )}
+
+ ))}
+
+
+
+
+
+
+ );
+};
+
+export default OperationTimeline;
diff --git a/src/components/shared/TopBar/index.tsx b/src/components/shared/TopBar/index.tsx
index 8bb2d8f..d8b1f1b 100644
--- a/src/components/shared/TopBar/index.tsx
+++ b/src/components/shared/TopBar/index.tsx
@@ -315,7 +315,6 @@ const TopBar = ({ UTMSource = null }) => {
target="_blank"
onClick={(event) => {
trackRegisterClick(event, {
- ctaLocation: 'top_bar',
url: topbarConfig?.CTA?.link,
});
}}
@@ -357,7 +356,6 @@ const TopBar = ({ UTMSource = null }) => {
className="px-3 py-1 border border-alert-crimson bg-alert-crimson/10 text-alert-crimson font-bold uppercase tracking-wider text-xs rounded-none hover:bg-alert-crimson hover:text-white transition-all duration-300"
onClick={(event) => {
trackRegisterClick(event, {
- ctaLocation: 'top_bar_mobile',
url: topbarConfig.CTA.link,
});
}}
diff --git a/src/utils/trackRegisterClick.ts b/src/utils/trackRegisterClick.ts
index 6300bb4..9366869 100644
--- a/src/utils/trackRegisterClick.ts
+++ b/src/utils/trackRegisterClick.ts
@@ -1,8 +1,8 @@
import type { MouseEvent } from 'react';
type RegisterClickOptions = {
- ctaLocation: string;
url: string;
+ ctaLocation?: string;
target?: '_blank' | '_self';
};
@@ -10,7 +10,7 @@ const NAVIGATION_FALLBACK_DELAY_MS = 500;
export function trackRegisterClick(
event: MouseEvent
,
- { ctaLocation, url, target = '_blank' }: RegisterClickOptions,
+ { url, ctaLocation = 'general', target = '_blank' }: RegisterClickOptions,
) {
if (typeof window === 'undefined') {
return;
@@ -48,9 +48,9 @@ export function trackRegisterClick(
};
window.gtag('event', 'register_cta_click', {
- cta_location: ctaLocation,
transport_type: 'beacon',
event_callback: navigateOnce,
+ cta_location: ctaLocation,
});
window.setTimeout(navigateOnce, NAVIGATION_FALLBACK_DELAY_MS);