1- import { useContext , useEffect , useState } from "react" ;
1+ import { useContext , useEffect , useRef , useState } from "react" ;
22import { ProfileContext } from "../state/profile" ;
33import { Padding } from "./padding" ;
44import { useSiteConfig } from "../hooks/useSiteConfig" ;
@@ -13,6 +13,7 @@ export function Header({ children }: { children?: React.ReactNode }) {
1313 const layoutDefinition = getHeaderLayoutDefinition ( headerLayout ) ;
1414 const [ isRevealed , setIsRevealed ] = useState ( true ) ;
1515 const [ isAtTop , setIsAtTop ] = useState ( true ) ;
16+ const headerRef = useRef < HTMLDivElement | null > ( null ) ;
1617
1718 useEffect ( ( ) => {
1819 let lastScrollY = window . scrollY ;
@@ -33,6 +34,31 @@ export function Header({ children }: { children?: React.ReactNode }) {
3334 } ;
3435 } , [ headerBehavior ] ) ;
3536
37+ useEffect ( ( ) => {
38+ const root = document . documentElement ;
39+ const setHeaderScrollOffset = ( ) => {
40+ const headerHeight = headerRef . current ?. getBoundingClientRect ( ) . height ?? 0 ;
41+ root . style . setProperty ( "--header-scroll-offset" , `${ Math . ceil ( headerHeight + 16 ) } px` ) ;
42+ } ;
43+
44+ setHeaderScrollOffset ( ) ;
45+
46+ const resizeObserver = new ResizeObserver ( ( ) => {
47+ setHeaderScrollOffset ( ) ;
48+ } ) ;
49+
50+ if ( headerRef . current ) {
51+ resizeObserver . observe ( headerRef . current ) ;
52+ }
53+
54+ window . addEventListener ( "resize" , setHeaderScrollOffset ) ;
55+
56+ return ( ) => {
57+ resizeObserver . disconnect ( ) ;
58+ window . removeEventListener ( "resize" , setHeaderScrollOffset ) ;
59+ } ;
60+ } , [ headerBehavior , headerLayout ] ) ;
61+
3662 const useTopHeader = layoutDefinition . kind === "top" ;
3763 const headerPaddingClassName = headerLayout === "compact" ? "mx-0 mt-0" : "mx-4 mt-4" ;
3864 const containerClassName =
@@ -48,7 +74,7 @@ export function Header({ children }: { children?: React.ReactNode }) {
4874 { headerLayout === "compact" ? (
4975 < div className = "pointer-events-none fixed inset-x-0 top-0 -z-10 h-64 bg-gradient-to-b from-theme/15 to-white/0 dark:from-theme/20 dark:to-transparent" />
5076 ) : null }
51- < div className = { containerClassName } >
77+ < div ref = { headerRef } className = { containerClassName } >
5278 < div className = "w-screen" >
5379 { headerLayout === "compact" ? (
5480 < div className = "w-full" >
0 commit comments