+ {/* Person Info with Logo */}
+
+
+
{item.name}
+
{item.role}
+
{item.company}
+
+ {item.logos && item.logos.length > 0 && (
+
+ {item.logos.map((logo, index) => {
+ const logoImg = (
+

{
+ const target = e.target as HTMLImageElement
+ target.style.display = 'none'
+ }}
+ />
+ )
+ return logo.url ? (
+
+ {logoImg}
+
+ ) : (
+
+ {logoImg}
+
+ )
+ })}
+
+ )}
- {/* Story */}
{/* Story */}
)}
- {/* Date Badge - between image and content */}
-
+
{event.name}
diff --git a/lib/hooks.ts b/lib/hooks.ts
new file mode 100644
index 0000000..7740dfa
--- /dev/null
+++ b/lib/hooks.ts
@@ -0,0 +1,31 @@
+"use client"
+
+import { useState, useEffect, useRef } from 'react'
+
+// Re-export useAnimatedNumber from its dedicated file
+export { useAnimatedNumber } from './useAnimatedNumber'
+
+/**
+ * Hook to detect when an element enters the viewport
+ * @param threshold - Intersection threshold (default: 0.2)
+ * @returns Object with ref to attach to element and visible boolean
+ */
+export function useInView(threshold = 0.2) {
+ const ref = useRef(null)
+ const [visible, setVisible] = useState(false)
+ useEffect(() => {
+ if (!ref.current) return
+ const obs = new IntersectionObserver(
+ ([e]) => {
+ if (e.isIntersecting) {
+ setVisible(true)
+ obs.disconnect()
+ }
+ },
+ { threshold }
+ )
+ obs.observe(ref.current)
+ return () => obs.disconnect()
+ }, [threshold])
+ return { ref, visible }
+}
diff --git a/lib/useAnimatedNumber.ts b/lib/useAnimatedNumber.ts
index 45b0bb9..92a2695 100644
--- a/lib/useAnimatedNumber.ts
+++ b/lib/useAnimatedNumber.ts
@@ -6,7 +6,7 @@ import { useState, useEffect, useRef } from 'react'
* @param loading - Whether the component is still loading
* @param duration - Animation duration in milliseconds (default: 1500)
* @param steps - Number of animation steps (default: 60)
- * @returns The current animated value
+ * @returns The current animated value (floored to integer)
*/
export function useAnimatedNumber(
target: number,
@@ -34,7 +34,7 @@ export function useAnimatedNumber(
setAnimatedValue(target)
clearInterval(timer)
} else {
- setAnimatedValue(currentValue)
+ setAnimatedValue(Math.floor(currentValue))
}
}, interval)
diff --git a/public/memberJourney/alumni/FelixHaas.png b/public/memberJourney/alumni/FelixHaas.png
new file mode 100644
index 0000000..dcbc433
Binary files /dev/null and b/public/memberJourney/alumni/FelixHaas.png differ
diff --git a/public/memberJourney/alumni/JoshuaCornelius.png b/public/memberJourney/alumni/JoshuaCornelius.png
new file mode 100644
index 0000000..16830b6
Binary files /dev/null and b/public/memberJourney/alumni/JoshuaCornelius.png differ
diff --git a/public/ourMembers/hero.png b/public/ourMembers/hero.png
new file mode 100644
index 0000000..398f099
Binary files /dev/null and b/public/ourMembers/hero.png differ