import { useRef } from 'react' import Link from 'next/link' import { useRouter } from 'next/router' import clsx from 'clsx' import { AnimatePresence, motion, useIsPresent } from 'framer-motion' import { Button } from '@/components/Button' import { useIsInsideMobileNavigation } from '@/components/MobileNavigation' import { useSectionStore } from '@/components/SectionProvider' import { Tag } from '@/components/Tag' import { remToPx } from '@/lib/remToPx' function useInitialValue(value, condition = true) { let initialValue = useRef(value).current return condition ? initialValue : value } function TopLevelNavItem({ href, children }) { return (
  • {children}
  • ) } function NavLink({ href, tag, active, isAnchorLink = false, children }) { return ( {children} {tag && ( {tag} )} ) } function VisibleSectionHighlight({ group, pathname }) { let [sections, visibleSections] = useInitialValue( [ useSectionStore((s) => s.sections), useSectionStore((s) => s.visibleSections), ], useIsInsideMobileNavigation() ) let isPresent = useIsPresent() let firstVisibleSectionIndex = Math.max( 0, [{ id: '_top' }, ...sections].findIndex( (section) => section.id === visibleSections[0] ) ) let itemHeight = remToPx(2) let height = isPresent ? Math.max(1, visibleSections.length) * itemHeight : itemHeight let top = group.links.findIndex((link) => link.href === pathname) * itemHeight + firstVisibleSectionIndex * itemHeight return ( ) } function ActivePageMarker({ group, pathname }) { let itemHeight = remToPx(2) let offset = remToPx(0.25) let activePageIndex = group.links.findIndex((link) => link.href === pathname) let top = offset + activePageIndex * itemHeight return ( ) } function NavigationGroup({ group, className }) { // If this is the mobile navigation then we always render the initial // state, so that the state does not change during the close animation. // The state will still update when we re-open (re-render) the navigation. let isInsideMobileNavigation = useIsInsideMobileNavigation() let [router, sections] = useInitialValue( [useRouter(), useSectionStore((s) => s.sections)], isInsideMobileNavigation ) let isActiveGroup = group.links.findIndex((link) => link.href === router.pathname) !== -1 return (
  • {group.title}
    {isActiveGroup && ( )} {isActiveGroup && ( )}
      {group.links.map((link) => ( {link.title} {link.href === router.pathname && sections.length > 0 && ( {sections.map((section) => (
    • {section.title}
    • ))}
      )}
      ))}
  • ) } export const navigation = [ { title: 'General', links: [ { title: 'Welcome', href: '/' }, { title: 'Tools', href: '/tools' }, ], }, { title: 'Zed', links: [{ title: 'Release Process', href: '/release-process' }, { title: 'Environment Setup', href: '/setup' }, { title: 'Backend', href: '/backend' }, ], }, { title: 'Design', links: [{ title: 'Tools', href: '/design/tools' }], }, ] export function Navigation(props) { return ( ) }