diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte index 3cf7b94..5a93286 100644 --- a/src/lib/components/Header.svelte +++ b/src/lib/components/Header.svelte @@ -3,29 +3,37 @@ import SegmentedController from './SegmentedController.svelte' let scrollY = $state(0) - let hasScrolled = $state(false) - let gradientOpacity = $derived(Math.min(scrollY / 40, 1)) + // Smooth gradient opacity from 0 to 1 over the first 100px of scroll + let gradientOpacity = $derived(Math.min(scrollY / 100, 1)) + // Padding transition happens more quickly + let paddingProgress = $derived(Math.min(scrollY / 50, 1)) $effect(() => { - const handleScroll = () => { - scrollY = window.scrollY + let ticking = false - // Add hysteresis to prevent flickering - if (!hasScrolled && scrollY > 30) { - hasScrolled = true - } else if (hasScrolled && scrollY < 20) { - hasScrolled = false + const updateScroll = () => { + scrollY = window.scrollY + ticking = false + } + + const handleScroll = () => { + if (!ticking) { + requestAnimationFrame(updateScroll) + ticking = true } } - window.addEventListener('scroll', handleScroll) + // Set initial value + scrollY = window.scrollY + + window.addEventListener('scroll', handleScroll, { passive: true }) return () => window.removeEventListener('scroll', handleScroll) })