'use client' import * as React from 'react' import { SvgTaillessLineArrowExpandVerticalSort, SvgLineArrowBendDownRight, } from '@chainlink/blocks-icons' import { useIsMobile, useIsTablet } from '../../hooks/MediaQueries' import { cn } from '../../utils' import type { CollapsibleBreadcrumbItemProps, CollapsibleBreadcrumbProps, } from '../Breadcrumb' import { Drawer, DrawerClose, DrawerTrigger, DrawerTitle, } from '../Drawer/Drawer' import { useSidebarContext, SidebarTrigger } from '../Navigation' import { HeaderNavTabs, type HeaderNavTabsProps, } from '../NavTabs/HeaderNavTabs' import { Typography, typographyVariants } from '../Typography' import { MobileMenuDrawerContent } from './MobileMenuDrawerContent' // Scroll context for header border visibility const ScrollContext = React.createContext<{ isScrolled: boolean }>({ isScrolled: false, }) /** * Shared styles for transparent header triggers (buttons, dropdowns, etc.) * Used in PageHeader and other header components for consistent styling. */ export const transparentTriggerStyles = cn( 'bg-foreground/[0.03]', 'border-solid border-border border-transparent', 'hover:border-border-hover hover:!bg-foreground/[0.03]', 'data-[state=open]:border-border-active data-[state=open]:bg-background', 'hover:data-[state=open]:!border-border-active hover:data-[state=open]:!bg-background', 'focus-visible:!border-border-active focus-visible:!outline-none focus-visible:!ring-0', '[transition:background-color_100ms_ease-linear]', ) type PageHeaderSpacingProps = | { reserveSpace?: 'sibling' spacerClassName?: never } | { reserveSpace: 'spacer' spacerClassName?: string } | { reserveSpace: 'none' spacerClassName?: never } export type PageHeaderProps = React.HTMLAttributes & PageHeaderSpacingProps type PageHeaderPropsWithRef = PageHeaderProps & { ref?: React.Ref } const PageHeader = ({ className, children, reserveSpace = 'sibling', spacerClassName: _spacerClassName, ref, ...props }: PageHeaderPropsWithRef) => { const isInsideSidebar = Boolean(useSidebarContext()) const [isScrolled, setIsScrolled] = React.useState(false) const sentinelRef = React.useRef(null) const spacerClassName = reserveSpace === 'spacer' ? _spacerClassName : undefined React.useEffect(() => { const observer = new IntersectionObserver( ([entry]) => { setIsScrolled(!entry.isIntersecting) }, { root: null, // Use viewport as root rootMargin: '0px', threshold: 0, }, ) const sentinel = sentinelRef.current if (sentinel) { observer.observe(sentinel) } return () => { observer.disconnect() } }, []) return (
{isInsideSidebar && ( )} {children}
{/* Spacer Mode: Render a visible spacer div */} {reserveSpace === 'spacer' && (