import type { NavItem, NavItemWithChildren, NavItemWithLink, NavItemWithLinkAndChildren, } from '@rspress/core'; import { matchNavbar, useLocation } from '@rspress/core/runtime'; import { IconArrowDown, Link, SvgWrapper, Tag } from '@rspress/core/theme'; import clsx from 'clsx'; import type React from 'react'; import { useMemo, useState } from 'react'; import './NavScreenMenuItem.scss'; interface NavScreenMenuItemWithLinkProps { menuItem: NavItemWithLink; } export const SvgDown = (props: React.SVGProps) => { return ; }; export function NavScreenMenuItemRaw({ left, right, isOpen, isActive, onClick, href, download, }: { left: React.ReactNode; right: React.ReactNode; isOpen?: boolean; isActive?: boolean; onClick?: () => void; href?: string; download?: boolean; }) { if (href) { return (
{left}
{right}
); } return (
{left}
{right}
); } export function NavScreenMenuItemWithLink({ menuItem, }: NavScreenMenuItemWithLinkProps) { const { pathname } = useLocation(); const isActive = useMemo(() => { return matchNavbar(menuItem, pathname); }, [menuItem, pathname]); return ( {menuItem.text} {menuItem.tag && } } right={null} href={menuItem.link} download={menuItem.download} isActive={isActive} /> ); } interface NavScreenMenuItemWithChildrenProps { menuItem: NavItemWithChildren | NavItemWithLinkAndChildren; } export function NavScreenMenuItemWithChildren({ menuItem, }: NavScreenMenuItemWithChildrenProps) { const [isOpen, setIsOpen] = useState(false); return ( <> {menuItem.text} {menuItem.tag && } } right={} isOpen={isOpen} onClick={() => setIsOpen(!isOpen)} href={'link' in menuItem ? menuItem.link : undefined} />
{menuItem.items.map(item => ( ))}
); } interface NavScreenMenuItemProps { menuItem: NavItem; } export function NavScreenMenuItem({ menuItem }: NavScreenMenuItemProps) { if ( 'items' in menuItem && Array.isArray(menuItem.items) && menuItem.items.length > 0 ) { return ; } if ('link' in menuItem && typeof menuItem.link === 'string') { return ; } return ( {menuItem.text} {menuItem.tag && } } right={null} /> ); }