import type { NavItem, NavItemWithChildren, NavItemWithLink, NavItemWithLinkAndChildren, } from '@rspress/core'; import { matchNavbar, useLocation } from '@rspress/core/runtime'; import type { HoverGroupProps } from '@rspress/core/theme'; import { IconArrowDown, Link, SvgWrapper, Tag, useHoverGroup, } from '@rspress/core/theme'; import cls from 'clsx'; import { type ReactNode, useMemo } from 'react'; import { useLangsMenu, useVersionsMenu } from './hooks'; import './NavMenu.scss'; import clsx from 'clsx'; export const SvgDown = (props: React.SVGProps) => { return ; }; export function NavMenuItemInner({ menuItem, children, }: { menuItem: Partial; children?: ReactNode; }) { return ( <> {'link' in menuItem && typeof menuItem.link === 'string' ? ( {menuItem.text} {menuItem.tag && } {children} ) : (
{menuItem.text} {menuItem.tag && } {children}
)} ); } export function NavMenuItemWithChildren({ menuItem, activeMatcher, }: { menuItem: NavItemWithChildren | NavItemWithLinkAndChildren; activeMatcher?: HoverGroupProps['activeMatcher']; }) { const { handleMouseEnter, handleMouseLeave, hoverGroup } = useHoverGroup({ items: menuItem.items, activeMatcher, }); const hasItems = menuItem.items.length > 0; return (
  • {hasItems && } {hoverGroup}
  • ); } export function NavMenuItemWithLink({ menuItem, }: { menuItem: NavItemWithLink; }) { const { pathname } = useLocation(); const isActive = useMemo(() => { return matchNavbar(menuItem, pathname); }, [menuItem, pathname]); return (
  • ); } export function NavMenuItem({ menuItem }: { menuItem: NavItem }) { if ( 'items' in menuItem && Array.isArray(menuItem.items) && menuItem.items.length > 0 ) { return ; } if ('link' in menuItem && menuItem.link.length > 0) { return ; } return (
  • ); } export function NavMenuDivider() { return
    ; } export function NavLangs() { const { items, activeValue } = useLangsMenu(); return items.length > 1 ? ( item.text === activeValue} /> ) : null; } export function NavVersions() { const { activeValue, items } = useVersionsMenu(); return items.length > 1 ? ( item.text === activeValue} /> ) : null; } export function NavMenu({ menuItems, position, }: { menuItems: NavItem[]; position: 'left' | 'right'; }) { const getPosition = (menuItem: NavItem) => menuItem.position ?? 'right'; const leftOrRightMenuItems = useMemo(() => { return menuItems.filter(item => getPosition(item) === position); }, [menuItems]); if (leftOrRightMenuItems.length === 0) { return null; } return (
      {leftOrRightMenuItems.map((item, index) => { return ; })}
    ); }