UI: Support link item properties in menu items

This commit is contained in:
Fuma Nama
2025-09-01 17:18:57 +08:00
parent ebcfdacac7
commit ba3382f58d
7 changed files with 28 additions and 19 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'fumadocs-ui': patch
---
Support link item properties in menu items
+1 -1
View File
@@ -342,7 +342,7 @@ function SidebarLinkItem({
return (
<SidebarFolder {...props}>
{item.url ? (
<SidebarFolderLink href={item.url}>
<SidebarFolderLink href={item.url} external={item.external}>
{item.icon}
{item.text}
</SidebarFolderLink>
-11
View File
@@ -17,17 +17,6 @@ import { I18nLabel } from '@/contexts/i18n';
import ClerkTOCItems from '@/components/layout/toc-clerk';
import type { AnchorProviderProps } from 'fumadocs-core/toc';
/**
* Apply `prose` on div
*/
export function PageProse(props: ComponentProps<'div'>) {
return (
<div {...props} className={cn('prose', props.className)}>
{props.children}
</div>
);
}
export function PageTOCTitle(props: ComponentProps<'h2'>) {
return (
<h3
+7 -1
View File
@@ -235,7 +235,13 @@ function NavbarLinkItem({
return (
<NavbarMenu>
<NavbarMenuTrigger {...props}>
{item.url ? <Link href={item.url}>{item.text}</Link> : item.text}
{item.url ? (
<Link href={item.url} external={item.external}>
{item.text}
</Link>
) : (
item.text
)}
</NavbarMenuTrigger>
<NavbarMenuContent>{children}</NavbarMenuContent>
</NavbarMenu>
+3 -1
View File
@@ -54,7 +54,9 @@ export function MenuLinkItem({
<p className="mb-1 text-sm text-fd-muted-foreground">
{item.url ? (
<NavigationMenuLink asChild>
<Link href={item.url}>{header}</Link>
<Link href={item.url} external={item.external}>
{header}
</Link>
</NavigationMenuLink>
) : (
header
+11 -3
View File
@@ -8,6 +8,7 @@ import {
import {
type BaseLayoutProps,
BaseLinkItem,
type BaseLinkType,
getLinks,
type LinkItemType,
} from '@/layouts/shared';
@@ -481,9 +482,16 @@ function NavbarLinkItem({
<Popover>
<PopoverTrigger
{...props}
className={cn('inline-flex items-center gap-1.5', props.className)}
className={cn(
'inline-flex items-center gap-1.5 has-data-[active=true]:text-fd-primary',
props.className,
)}
>
{item.text}
{item.url ? (
<BaseLinkItem item={item as BaseLinkType}>{item.text}</BaseLinkItem>
) : (
item.text
)}
<ChevronDown className="size-3" />
</PopoverTrigger>
<PopoverContent className="flex flex-col">
@@ -527,7 +535,7 @@ function SidebarLinkItem({
return (
<SidebarFolder {...props}>
{item.url ? (
<SidebarFolderLink href={item.url}>
<SidebarFolderLink href={item.url} external={item.external}>
{item.icon}
{item.text}
</SidebarFolderLink>
+1 -2
View File
@@ -111,12 +111,11 @@ export interface ButtonItemType extends BaseLinkType {
secondary?: boolean;
}
export interface MenuItemType extends BaseItem {
export interface MenuItemType extends Partial<BaseLinkType> {
type: 'menu';
icon?: ReactNode;
text: ReactNode;
url?: string;
items: (
| (MainItemType & {
/**