mirror of
https://github.com/hanzoai/shadcn.git
synced 2026-11-03 03:18:52 +00:00
Upstream sync from shadcn-ui/ui (1686 commits since last merge base). Key changes: - packages/shadcn upgraded to 4.1.0 (CLI font transformers, scaffold from github, chart colors) - apps/v4 replaces apps/www as the primary docs/registry app - Font system: 25+ heading font registries, font markers utility, @supports override - Chart improvements: recharts v3 compat, radial chart fixes - templates/ updated with monorepo variants (astro, vite, react-router, start) - skills/shadcn AI skill definitions added - deprecated/ removed (auth, auth-firebase, cli, www) Preserved Hanzo-only paths: app/, pkg/, demo/, docs/, template/next/
170 lines
4.6 KiB
TypeScript
170 lines
4.6 KiB
TypeScript
import * as React from "react"
|
|
import { cva } from "class-variance-authority"
|
|
import { NavigationMenu as NavigationMenuPrimitive } from "radix-ui"
|
|
|
|
import { cn } from "@/registry/bases/radix/lib/utils"
|
|
import { IconPlaceholder } from "@/app/(create)/components/icon-placeholder"
|
|
|
|
function NavigationMenu({
|
|
className,
|
|
children,
|
|
viewport = true,
|
|
...props
|
|
}: React.ComponentProps<typeof NavigationMenuPrimitive.Root> & {
|
|
viewport?: boolean
|
|
}) {
|
|
return (
|
|
<NavigationMenuPrimitive.Root
|
|
data-slot="navigation-menu"
|
|
data-viewport={viewport}
|
|
className={cn(
|
|
"cn-navigation-menu group/navigation-menu relative flex max-w-max flex-1 items-center justify-center",
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
{children}
|
|
{viewport && <NavigationMenuViewport />}
|
|
</NavigationMenuPrimitive.Root>
|
|
)
|
|
}
|
|
|
|
function NavigationMenuList({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof NavigationMenuPrimitive.List>) {
|
|
return (
|
|
<NavigationMenuPrimitive.List
|
|
data-slot="navigation-menu-list"
|
|
className={cn(
|
|
"cn-navigation-menu-list group flex flex-1 list-none items-center justify-center",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function NavigationMenuItem({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof NavigationMenuPrimitive.Item>) {
|
|
return (
|
|
<NavigationMenuPrimitive.Item
|
|
data-slot="navigation-menu-item"
|
|
className={cn("cn-navigation-menu-item relative", className)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
const navigationMenuTriggerStyle = cva(
|
|
"cn-navigation-menu-trigger group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center outline-none disabled:pointer-events-none"
|
|
)
|
|
|
|
function NavigationMenuTrigger({
|
|
className,
|
|
children,
|
|
...props
|
|
}: React.ComponentProps<typeof NavigationMenuPrimitive.Trigger>) {
|
|
return (
|
|
<NavigationMenuPrimitive.Trigger
|
|
data-slot="navigation-menu-trigger"
|
|
className={cn(navigationMenuTriggerStyle(), "group", className)}
|
|
{...props}
|
|
>
|
|
{children}{" "}
|
|
<IconPlaceholder
|
|
lucide="ChevronDownIcon"
|
|
tabler="IconChevronDown"
|
|
hugeicons="ArrowDown01Icon"
|
|
phosphor="CaretDownIcon"
|
|
remixicon="RiArrowDownSLine"
|
|
className="cn-navigation-menu-trigger-icon"
|
|
aria-hidden="true"
|
|
/>
|
|
</NavigationMenuPrimitive.Trigger>
|
|
)
|
|
}
|
|
|
|
function NavigationMenuContent({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof NavigationMenuPrimitive.Content>) {
|
|
return (
|
|
<NavigationMenuPrimitive.Content
|
|
data-slot="navigation-menu-content"
|
|
className={cn(
|
|
"cn-navigation-menu-content top-0 left-0 w-full group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-1.5 group-data-[viewport=false]/navigation-menu:overflow-hidden **:data-[slot=navigation-menu-link]:focus:ring-0 **:data-[slot=navigation-menu-link]:focus:outline-none md:absolute md:w-auto",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function NavigationMenuViewport({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof NavigationMenuPrimitive.Viewport>) {
|
|
return (
|
|
<div
|
|
className={cn(
|
|
"cn-navigation-menu-viewport-wrapper absolute top-full left-0 isolate z-50 flex justify-center"
|
|
)}
|
|
>
|
|
<NavigationMenuPrimitive.Viewport
|
|
data-slot="navigation-menu-viewport"
|
|
className={cn(
|
|
"cn-navigation-menu-viewport origin-top-center relative mt-1.5 h-(--radix-navigation-menu-viewport-height) w-full overflow-hidden md:w-(--radix-navigation-menu-viewport-width)",
|
|
className
|
|
)}
|
|
{...props}
|
|
/>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
function NavigationMenuLink({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof NavigationMenuPrimitive.Link>) {
|
|
return (
|
|
<NavigationMenuPrimitive.Link
|
|
data-slot="navigation-menu-link"
|
|
className={cn("cn-navigation-menu-link", className)}
|
|
{...props}
|
|
/>
|
|
)
|
|
}
|
|
|
|
function NavigationMenuIndicator({
|
|
className,
|
|
...props
|
|
}: React.ComponentProps<typeof NavigationMenuPrimitive.Indicator>) {
|
|
return (
|
|
<NavigationMenuPrimitive.Indicator
|
|
data-slot="navigation-menu-indicator"
|
|
className={cn(
|
|
"cn-navigation-menu-indicator top-full z-1 flex h-1.5 items-end justify-center overflow-hidden",
|
|
className
|
|
)}
|
|
{...props}
|
|
>
|
|
<div className="cn-navigation-menu-indicator-arrow relative top-[60%] h-2 w-2 rotate-45" />
|
|
</NavigationMenuPrimitive.Indicator>
|
|
)
|
|
}
|
|
|
|
export {
|
|
NavigationMenu,
|
|
NavigationMenuList,
|
|
NavigationMenuItem,
|
|
NavigationMenuContent,
|
|
NavigationMenuTrigger,
|
|
NavigationMenuLink,
|
|
NavigationMenuIndicator,
|
|
NavigationMenuViewport,
|
|
navigationMenuTriggerStyle,
|
|
}
|