From 483b4fabdd0458d19267376b8cd3fe5a2c76fdd9 Mon Sep 17 00:00:00 2001 From: Viktor Date: Wed, 22 Oct 2025 19:51:38 +0200 Subject: [PATCH 1/4] Easter egg? --- .../molecules/OnlineHero/OnlineHero.tsx | 55 +++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx b/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx index dc160e2dda..227c015558 100644 --- a/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx +++ b/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx @@ -19,6 +19,12 @@ export const OnlineHero: FC = () => { const [isLoading, setIsLoading] = useState(true) const [mounted, setMounted] = useState(false) + // easter egg + const [switchCount, setSwitchCount] = useState(0) + const [showBlackScreen, setShowBlackScreen] = useState(false) + const [mousePosition, setMousePosition] = useState<{ x: number; y: number }>({ x: 0, y: 0 }) + const [cooldown, setCooldown] = useState(false) + const themeState = useRef(resolvedTheme) const splineRef = useRef(null) @@ -34,6 +40,18 @@ export const OnlineHero: FC = () => { } }, [resolvedTheme, mounted]) + useEffect(() => { + const handleMouseMove = (event: MouseEvent) => { + setMousePosition({ x: event.clientX, y: event.clientY }); + }; + + window.addEventListener('mousemove', handleMouseMove); + + return () => { + window.removeEventListener('mousemove', handleMouseMove); + }; + }, []); + const onSplineLoad = (spline: SplineInstance) => { splineRef.current = spline // Initialize Spline with current theme @@ -55,19 +73,34 @@ export const OnlineHero: FC = () => { const currentTheme = themeState.current setTheme(currentTheme === "dark" ? "light" : "dark") - if (splineRef.current?.getVariable) { - const numberValue = splineRef.current.getVariable("lightSwitchCounter") as number - - // Potential for an easteregg if you spam the lightswitch - // For now just an alert - if (numberValue > 1 && numberValue % 69 === 0) { - alert("Ey yo, det holder nå") - } - } + setSwitchCount(prev => { + const newCount = prev + 1 + + setShowBlackScreen(prev => { + if (newCount > 1 && newCount % 16 === 0) { + setTimeout(() => setTheme("dark"), 0) + setCooldown(true); + setTimeout(() => setCooldown(false), 400); + return true + } + return false + }) + + return newCount + }) } return ( -
+ <> + {showBlackScreen && ( +
+ )} +
+ ) } From 36abe06e9e2eb9e87b93da821a1d04839d4ac6a3 Mon Sep 17 00:00:00 2001 From: Viktor Date: Wed, 22 Oct 2025 20:09:07 +0200 Subject: [PATCH 2/4] hopefully works with mobile?? --- .../molecules/OnlineHero/OnlineHero.tsx | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx b/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx index 227c015558..f07634bff1 100644 --- a/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx +++ b/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx @@ -41,14 +41,32 @@ export const OnlineHero: FC = () => { }, [resolvedTheme, mounted]) useEffect(() => { - const handleMouseMove = (event: MouseEvent) => { - setMousePosition({ x: event.clientX, y: event.clientY }); + let frame: number; + + const handleMove = (x: number, y: number) => { + cancelAnimationFrame(frame); + frame = requestAnimationFrame(() => { // only update once per frame + setMousePosition({ x, y }); + }); + }; + + const handleMouseMove = (event: MouseEvent) => handleMove(event.clientX, event.clientY); + + const handleTouch = (event: TouchEvent) => { + const touch = event.touches[0] ?? event.changedTouches[0]; + if (touch) handleMove(touch.clientX, touch.clientY); }; - window.addEventListener('mousemove', handleMouseMove); + // Add listeners for both mouse and touch + window.addEventListener("mousemove", handleMouseMove); + window.addEventListener("touchstart", handleTouch); + window.addEventListener("touchmove", handleTouch); return () => { - window.removeEventListener('mousemove', handleMouseMove); + cancelAnimationFrame(frame); + window.removeEventListener("mousemove", handleMouseMove); + window.removeEventListener("touchstart", handleTouch); + window.removeEventListener("touchmove", handleTouch); }; }, []); From 2d579b7d13f30b877a38fc291741e2ae7fc396c4 Mon Sep 17 00:00:00 2001 From: Viktor Date: Wed, 22 Oct 2025 20:29:55 +0200 Subject: [PATCH 3/4] longer cooldown, 20 clicks --- apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx b/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx index f07634bff1..55982a745b 100644 --- a/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx +++ b/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx @@ -95,10 +95,10 @@ export const OnlineHero: FC = () => { const newCount = prev + 1 setShowBlackScreen(prev => { - if (newCount > 1 && newCount % 16 === 0) { + if (newCount > 1 && newCount % 20 === 0) { setTimeout(() => setTheme("dark"), 0) setCooldown(true); - setTimeout(() => setCooldown(false), 400); + setTimeout(() => setCooldown(false), 1000); return true } return false From 1dadef2215298cadc0fa1af5406104fe58ae9637 Mon Sep 17 00:00:00 2001 From: Viktor Date: Wed, 22 Oct 2025 20:33:47 +0200 Subject: [PATCH 4/4] Lint --- .../molecules/OnlineHero/OnlineHero.tsx | 151 +++++++++--------- 1 file changed, 76 insertions(+), 75 deletions(-) diff --git a/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx b/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx index 55982a745b..4dab5b53b3 100644 --- a/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx +++ b/apps/web/src/components/molecules/OnlineHero/OnlineHero.tsx @@ -41,34 +41,35 @@ export const OnlineHero: FC = () => { }, [resolvedTheme, mounted]) useEffect(() => { - let frame: number; + let frame: number const handleMove = (x: number, y: number) => { - cancelAnimationFrame(frame); - frame = requestAnimationFrame(() => { // only update once per frame - setMousePosition({ x, y }); - }); - }; + cancelAnimationFrame(frame) + frame = requestAnimationFrame(() => { + // only update once per frame + setMousePosition({ x, y }) + }) + } - const handleMouseMove = (event: MouseEvent) => handleMove(event.clientX, event.clientY); + const handleMouseMove = (event: MouseEvent) => handleMove(event.clientX, event.clientY) const handleTouch = (event: TouchEvent) => { - const touch = event.touches[0] ?? event.changedTouches[0]; - if (touch) handleMove(touch.clientX, touch.clientY); - }; + const touch = event.touches[0] ?? event.changedTouches[0] + if (touch) handleMove(touch.clientX, touch.clientY) + } // Add listeners for both mouse and touch - window.addEventListener("mousemove", handleMouseMove); - window.addEventListener("touchstart", handleTouch); - window.addEventListener("touchmove", handleTouch); + window.addEventListener("mousemove", handleMouseMove) + window.addEventListener("touchstart", handleTouch) + window.addEventListener("touchmove", handleTouch) return () => { - cancelAnimationFrame(frame); - window.removeEventListener("mousemove", handleMouseMove); - window.removeEventListener("touchstart", handleTouch); - window.removeEventListener("touchmove", handleTouch); - }; - }, []); + cancelAnimationFrame(frame) + window.removeEventListener("mousemove", handleMouseMove) + window.removeEventListener("touchstart", handleTouch) + window.removeEventListener("touchmove", handleTouch) + } + }, []) const onSplineLoad = (spline: SplineInstance) => { splineRef.current = spline @@ -91,14 +92,14 @@ export const OnlineHero: FC = () => { const currentTheme = themeState.current setTheme(currentTheme === "dark" ? "light" : "dark") - setSwitchCount(prev => { + setSwitchCount((prev) => { const newCount = prev + 1 - setShowBlackScreen(prev => { + setShowBlackScreen((prev) => { if (newCount > 1 && newCount % 20 === 0) { setTimeout(() => setTheme("dark"), 0) - setCooldown(true); - setTimeout(() => setCooldown(false), 1000); + setCooldown(true) + setTimeout(() => setCooldown(false), 1000) return true } return false @@ -114,67 +115,67 @@ export const OnlineHero: FC = () => {
)}
-
- - - - Linjeforeningen for informatikk ved NTNU - - - - Linjeforeningens oppgave er å forbedre studiemiljøet ved å fremme sosialt samvær, faglig kompetanse og kontakt - med næringslivet. - - -
-
- - Er du fra en bedrift og ønsker samarbeid? -
+
+ + + + Linjeforeningen for informatikk ved NTNU + + + + Linjeforeningens oppgave er å forbedre studiemiljøet ved å fremme sosialt samvær, faglig kompetanse og + kontakt med næringslivet. + + +
+
+ + Er du fra en bedrift og ønsker samarbeid? +
- + +
-
-
-
- {(!mounted || isLoading) && ( -
- )} - - {mounted && ( -
- -
- )} +
+
+ {(!mounted || isLoading) && ( +
+ )} + + {mounted && ( +
+ +
+ )} +
-
) }