Navigation Menu
Top-level site links with rich dropdown panels, for the navbar layout and landing page.
import { NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger,} from "@/components/ui/navigation-menu";
export default function Demo() { return ( <div className="flex min-h-56 items-start justify-center"> <NavigationMenu> <NavigationMenuList> <NavigationMenuItem> <NavigationMenuTrigger>Product</NavigationMenuTrigger> <NavigationMenuContent> <ul className="grid w-[320px] gap-1"> <li> <NavigationMenuLink href="#explore" className="flex-col items-start gap-0" > <span className="font-medium">Explore</span> <span className="text-xs text-muted-foreground"> Browse every live index. </span> </NavigationMenuLink> </li> <li> <NavigationMenuLink href="#create" className="flex-col items-start gap-0" > <span className="font-medium">Create index</span> <span className="text-xs text-muted-foreground"> Pick tokens, set weights. </span> </NavigationMenuLink> </li> </ul> </NavigationMenuContent> </NavigationMenuItem> <NavigationMenuItem> <NavigationMenuLink href="#docs" className="h-9 px-3 font-medium"> Docs </NavigationMenuLink> </NavigationMenuItem> </NavigationMenuList> </NavigationMenu> </div> );}<script setup lang="ts">import { NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger,} from "@/components/ui/navigation-menu";</script>
<template> <div class="flex min-h-56 items-start justify-center"> <NavigationMenu> <NavigationMenuList> <NavigationMenuItem> <NavigationMenuTrigger>Product</NavigationMenuTrigger> <NavigationMenuContent> <ul class="grid w-[320px] gap-1"> <li> <NavigationMenuLink href="#explore" class="flex-col items-start gap-0"> <span class="font-medium">Explore</span> <span class="text-xs text-muted-foreground">Browse every live index.</span> </NavigationMenuLink> </li> <li> <NavigationMenuLink href="#create" class="flex-col items-start gap-0"> <span class="font-medium">Create index</span> <span class="text-xs text-muted-foreground">Pick tokens, set weights.</span> </NavigationMenuLink> </li> </ul> </NavigationMenuContent> </NavigationMenuItem> <NavigationMenuItem> <NavigationMenuLink href="#docs" class="h-9 px-3 font-medium">Docs</NavigationMenuLink> </NavigationMenuItem> </NavigationMenuList> </NavigationMenu> </div></template><script lang="ts"> import * as NavigationMenu from "$lib/components/ui/navigation-menu";</script>
<div class="flex min-h-56 items-start justify-center"> <NavigationMenu.Root> <NavigationMenu.List> <NavigationMenu.Item> <NavigationMenu.Trigger>Product</NavigationMenu.Trigger> <NavigationMenu.Content> <ul class="grid w-[320px] gap-1"> <li> <NavigationMenu.Link href="#explore" class="flex-col items-start gap-0"> <span class="font-medium">Explore</span> <span class="text-xs text-muted-foreground">Browse every live index.</span> </NavigationMenu.Link> </li> <li> <NavigationMenu.Link href="#create" class="flex-col items-start gap-0"> <span class="font-medium">Create index</span> <span class="text-xs text-muted-foreground">Pick tokens, set weights.</span> </NavigationMenu.Link> </li> </ul> </NavigationMenu.Content> </NavigationMenu.Item> <NavigationMenu.Item> <NavigationMenu.Link href="#docs" class="h-9 px-3 font-medium">Docs</NavigationMenu.Link> </NavigationMenu.Item> </NavigationMenu.List> </NavigationMenu.Root></div>Installation
Section titled “Installation”npx shadcn@latest add @edmi-ui/navigation-menupnpm dlx shadcn@latest add @edmi-ui/navigation-menuyarn dlx shadcn@latest add @edmi-ui/navigation-menubunx shadcn@latest add @edmi-ui/navigation-menuPick your package manager above; the choice is remembered. Add the @edmi-ui registry first, see Getting started.
Install the dependencies:
Terminal window npm install @base-ui/react class-variance-authorityTerminal window pnpm add @base-ui/react class-variance-authorityTerminal window yarn add @base-ui/react class-variance-authorityTerminal window bun add @base-ui/react class-variance-authorityCopy the code from Component source into your project and update the import paths to match your aliases.
npx shadcn-vue@latest add @edmi-ui/navigation-menupnpm dlx shadcn-vue@latest add @edmi-ui/navigation-menuyarn dlx shadcn-vue@latest add @edmi-ui/navigation-menubunx shadcn-vue@latest add @edmi-ui/navigation-menuPick your package manager above; the choice is remembered. Add the @edmi-ui registry first, see Getting started.
Install the dependencies:
Terminal window npm install reka-ui class-variance-authority @vueuse/coreTerminal window pnpm add reka-ui class-variance-authority @vueuse/coreTerminal window yarn add reka-ui class-variance-authority @vueuse/coreTerminal window bun add reka-ui class-variance-authority @vueuse/coreCopy the code from Component source into your project and update the import paths to match your aliases.
npx shadcn-svelte@latest add https://viandwi24.github.io/edmi-ui/r/svelte/navigation-menu.jsonpnpm dlx shadcn-svelte@latest add https://viandwi24.github.io/edmi-ui/r/svelte/navigation-menu.jsonyarn dlx shadcn-svelte@latest add https://viandwi24.github.io/edmi-ui/r/svelte/navigation-menu.jsonbunx --bun shadcn-svelte@latest add https://viandwi24.github.io/edmi-ui/r/svelte/navigation-menu.jsonPick your package manager above; the choice is remembered. Add the @edmi-ui registry first, see Getting started.
Copy the code from Component source into your project and update the import paths to match your aliases.
import { NavigationMenu, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger,} from "@/components/ui/navigation-menu";
<div className="flex min-h-56 items-start justify-center"> <NavigationMenu> <NavigationMenuList> <NavigationMenuItem> <NavigationMenuTrigger>Product</NavigationMenuTrigger> {/* … */} </NavigationMenuItem> <NavigationMenuItem> <NavigationMenuLink href="#docs" className="h-9 px-3 font-medium"> Docs </NavigationMenuLink> </NavigationMenuItem> </NavigationMenuList> </NavigationMenu></div><script setup lang="ts">import { NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger,} from "@/components/ui/navigation-menu";</script>
<template> <div class="flex min-h-56 items-start justify-center"> <NavigationMenu> <NavigationMenuList> <NavigationMenuItem> <NavigationMenuTrigger>Product</NavigationMenuTrigger> <NavigationMenuContent> <ul class="grid w-[320px] gap-1"> <li> <NavigationMenuLink href="#explore" class="flex-col items-start gap-0"> <span class="font-medium">Explore</span> <span class="text-xs text-muted-foreground">Browse every live index.</span> </NavigationMenuLink> </li> <li> <NavigationMenuLink href="#create" class="flex-col items-start gap-0"> <span class="font-medium">Create index</span> <span class="text-xs text-muted-foreground">Pick tokens, set weights.</span> </NavigationMenuLink> </li> </ul> </NavigationMenuContent> </NavigationMenuItem> <!-- … --> </NavigationMenuList> </NavigationMenu> </div></template><script lang="ts"> import * as NavigationMenu from "$lib/components/ui/navigation-menu";</script>
<div class="flex min-h-56 items-start justify-center"> <NavigationMenu.Root> <NavigationMenu.List> <NavigationMenu.Item> <NavigationMenu.Trigger>Product</NavigationMenu.Trigger> <NavigationMenu.Content> <ul class="grid w-[320px] gap-1"> <li> <NavigationMenu.Link href="#explore" class="flex-col items-start gap-0"> <span class="font-medium">Explore</span> <span class="text-xs text-muted-foreground">Browse every live index.</span> </NavigationMenu.Link> </li> <li> <NavigationMenu.Link href="#create" class="flex-col items-start gap-0"> <span class="font-medium">Create index</span> <span class="text-xs text-muted-foreground">Pick tokens, set weights.</span> </NavigationMenu.Link> </li> </ul> </NavigationMenu.Content> </NavigationMenu.Item> <!-- … --> </NavigationMenu.List> </NavigationMenu.Root></div>Component source
Section titled “Component source”import { NavigationMenu as NavigationMenuPrimitive } from "@base-ui/react/navigation-menu";import { cva } from "class-variance-authority";import { cn } from "cn";import { CaretDownIcon } from "@phosphor-icons/react";
function NavigationMenu({ align = "start", className, children, ...props}: NavigationMenuPrimitive.Root.Props & Pick<NavigationMenuPrimitive.Positioner.Props, "align">) { return ( <NavigationMenuPrimitive.Root data-slot="navigation-menu" className={cn( "group/navigation-menu relative flex max-w-max flex-1 items-center justify-center", className, )} {...props} > {children} <NavigationMenuPositioner align={align} /> </NavigationMenuPrimitive.Root> );}
function NavigationMenuList({ className, ...props}: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.List>) { return ( <NavigationMenuPrimitive.List data-slot="navigation-menu-list" className={cn( "group flex flex-1 list-none items-center justify-center gap-0", className, )} {...props} /> );}
function NavigationMenuItem({ className, ...props}: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.Item>) { return ( <NavigationMenuPrimitive.Item data-slot="navigation-menu-item" className={cn("relative", className)} {...props} /> );}
const navigationMenuTriggerStyle = cva( "group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-md px-3 text-[13.5px] font-medium text-muted-foreground transition-colors outline-none hover:bg-accent hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 data-[popup-open]:bg-accent data-[popup-open]:text-foreground data-[open]:bg-accent data-[open]:text-foreground",);
function NavigationMenuTrigger({ className, children, ...props}: NavigationMenuPrimitive.Trigger.Props) { return ( <NavigationMenuPrimitive.Trigger data-slot="navigation-menu-trigger" className={cn(navigationMenuTriggerStyle(), "group", className)} {...props} > {children}{" "} <CaretDownIcon className="relative top-px ml-1 size-3 transition duration-300 group-data-[popup-open]/navigation-menu-trigger:rotate-180 group-data-[open]/navigation-menu-trigger:rotate-180" aria-hidden="true" /> </NavigationMenuPrimitive.Trigger> );}
function NavigationMenuContent({ className, ...props}: NavigationMenuPrimitive.Content.Props) { return ( <NavigationMenuPrimitive.Content data-slot="navigation-menu-content" className={cn( "h-full w-auto p-1.5 transition-[opacity,transform,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[ending-style]:data-[activation-direction=left]:translate-x-[50%] data-[ending-style]:data-[activation-direction=right]:translate-x-[-50%] data-[starting-style]:data-[activation-direction=left]:translate-x-[-50%] data-[starting-style]:data-[activation-direction=right]:translate-x-[50%] data-[ending-style]:opacity-0 data-[starting-style]:opacity-0 **:data-[slot=navigation-menu-link]:focus:outline-none", className, )} {...props} /> );}
function NavigationMenuPositioner({ className, side = "bottom", sideOffset = 8, align = "start", alignOffset = 0, ...props}: NavigationMenuPrimitive.Positioner.Props) { return ( <NavigationMenuPrimitive.Portal> <NavigationMenuPrimitive.Positioner side={side} sideOffset={sideOffset} align={align} alignOffset={alignOffset} className={cn( "isolate z-50 h-(--positioner-height) w-(--positioner-width) max-w-(--available-width) transition-[top,left,right,bottom] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] data-[instant]:transition-none data-[side=bottom]:before:top-[-10px] data-[side=bottom]:before:right-0 data-[side=bottom]:before:left-0", className, )} {...props} > <NavigationMenuPrimitive.Popup className="relative h-(--popup-height) w-(--popup-width) origin-(--transform-origin) rounded-xl border border-border bg-popover text-popover-foreground transition-[opacity,transform,width,height,scale,translate] duration-[0.35s] ease-[cubic-bezier(0.22,1,0.36,1)] outline-none data-[ending-style]:scale-90 data-[ending-style]:opacity-0 data-[ending-style]:duration-150 data-[starting-style]:scale-90 data-[starting-style]:opacity-0"> <NavigationMenuPrimitive.Viewport className="relative size-full overflow-hidden" /> </NavigationMenuPrimitive.Popup> </NavigationMenuPrimitive.Positioner> </NavigationMenuPrimitive.Portal> );}
function NavigationMenuLink({ className, ...props}: NavigationMenuPrimitive.Link.Props) { return ( <NavigationMenuPrimitive.Link data-slot="navigation-menu-link" className={cn( "flex items-center gap-2.5 rounded-lg p-2 text-[13.5px] transition-colors outline-none hover:bg-accent hover:text-accent-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring in-data-[slot=navigation-menu-content]:rounded-[7px] data-[active]:bg-accent data-[active]:text-accent-foreground [&_svg:not([class*='size-'])]:size-4", className, )} {...props} /> );}
function NavigationMenuIndicator({ className, ...props}: React.ComponentPropsWithRef<typeof NavigationMenuPrimitive.Icon>) { return ( <NavigationMenuPrimitive.Icon data-slot="navigation-menu-indicator" className={cn( "top-full z-1 flex h-1.5 items-end justify-center overflow-hidden data-[ending-style]:opacity-0 data-[starting-style]:opacity-0", className, )} {...props} > <div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border" /> </NavigationMenuPrimitive.Icon> );}
export { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuPositioner, NavigationMenuTrigger, navigationMenuTriggerStyle,};<script setup lang="ts">import type { NavigationMenuRootEmits, NavigationMenuRootProps } from "reka-ui"import type { HTMLAttributes } from "vue"import { reactiveOmit } from "@vueuse/core"import { NavigationMenuRoot, useForwardPropsEmits,} from "reka-ui"import { cn } from "@/registry/edmi/lib/utils"import NavigationMenuViewport from "./NavigationMenuViewport.vue"
const props = withDefaults(defineProps<NavigationMenuRootProps & { class?: HTMLAttributes["class"] viewport?: boolean}>(), { viewport: true,})const emits = defineEmits<NavigationMenuRootEmits>()
const delegatedProps = reactiveOmit(props, "class", "viewport")const forwarded = useForwardPropsEmits(delegatedProps, emits)</script>
<template> <NavigationMenuRoot v-slot="slotProps" data-slot="navigation-menu" :data-viewport="viewport" v-bind="forwarded" :class="cn('group/navigation-menu relative flex max-w-max flex-1 items-center justify-center', props.class)" > <slot v-bind="slotProps" /> <NavigationMenuViewport v-if="viewport" /> </NavigationMenuRoot></template><script setup lang="ts">import type { NavigationMenuContentEmits, NavigationMenuContentProps } from "reka-ui"import type { HTMLAttributes } from "vue"import { reactiveOmit } from "@vueuse/core"import { NavigationMenuContent, useForwardPropsEmits,} from "reka-ui"import { cn } from "@/registry/edmi/lib/utils"
const props = defineProps<NavigationMenuContentProps & { class?: HTMLAttributes["class"] }>()const emits = defineEmits<NavigationMenuContentEmits>()
const delegatedProps = reactiveOmit(props, "class")
const forwarded = useForwardPropsEmits(delegatedProps, emits)</script>
<template> <NavigationMenuContent data-slot="navigation-menu-content" v-bind="forwarded" :class="cn( 'data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 top-0 left-0 w-full p-1.5 md:absolute md:w-auto', 'group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 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 group-data-[viewport=false]/navigation-menu:rounded-xl group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:border-border group-data-[viewport=false]/navigation-menu:duration-200 **:data-[slot=navigation-menu-link]:focus:outline-none', props.class, )" > <slot /> </NavigationMenuContent></template><script setup lang="ts">import type { NavigationMenuIndicatorProps } from "reka-ui"import type { HTMLAttributes } from "vue"import { reactiveOmit } from "@vueuse/core"import { NavigationMenuIndicator, useForwardProps } from "reka-ui"import { cn } from "@/registry/edmi/lib/utils"
const props = defineProps<NavigationMenuIndicatorProps & { class?: HTMLAttributes["class"] }>()
const delegatedProps = reactiveOmit(props, "class")
const forwardedProps = useForwardProps(delegatedProps)</script>
<template> <NavigationMenuIndicator data-slot="navigation-menu-indicator" v-bind="forwardedProps" :class="cn('data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden', props.class)" > <div class="bg-border relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm" /> </NavigationMenuIndicator></template><script setup lang="ts">import type { NavigationMenuItemProps } from "reka-ui"import type { HTMLAttributes } from "vue"import { reactiveOmit } from "@vueuse/core"import { NavigationMenuItem } from "reka-ui"import { cn } from "@/registry/edmi/lib/utils"
const props = defineProps<NavigationMenuItemProps & { class?: HTMLAttributes["class"] }>()
const delegatedProps = reactiveOmit(props, "class")</script>
<template> <NavigationMenuItem data-slot="navigation-menu-item" v-bind="delegatedProps" :class="cn('relative', props.class)" > <slot /> </NavigationMenuItem></template><script setup lang="ts">import type { NavigationMenuLinkEmits, NavigationMenuLinkProps } from "reka-ui"import type { HTMLAttributes } from "vue"import { reactiveOmit } from "@vueuse/core"import { NavigationMenuLink, useForwardPropsEmits,} from "reka-ui"import { cn } from "@/registry/edmi/lib/utils"
const props = defineProps<NavigationMenuLinkProps & { class?: HTMLAttributes["class"] }>()const emits = defineEmits<NavigationMenuLinkEmits>()
const delegatedProps = reactiveOmit(props, "class")const forwarded = useForwardPropsEmits(delegatedProps, emits)</script>
<template> <NavigationMenuLink data-slot="navigation-menu-link" v-bind="forwarded" :class="cn(`flex items-center gap-2.5 rounded-lg p-2 text-[13.5px] transition-colors outline-none hover:bg-accent hover:text-accent-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring in-data-[slot=navigation-menu-content]:rounded-[7px] data-[active]:bg-accent data-[active]:text-accent-foreground [&_svg:not([class*=size-])]:size-4`, props.class)" > <slot /> </NavigationMenuLink></template><script setup lang="ts">import type { NavigationMenuListProps } from "reka-ui"import type { HTMLAttributes } from "vue"import { reactiveOmit } from "@vueuse/core"import { NavigationMenuList, useForwardProps } from "reka-ui"import { cn } from "@/registry/edmi/lib/utils"
const props = defineProps<NavigationMenuListProps & { class?: HTMLAttributes["class"] }>()
const delegatedProps = reactiveOmit(props, "class")
const forwardedProps = useForwardProps(delegatedProps)</script>
<template> <NavigationMenuList data-slot="navigation-menu-list" v-bind="forwardedProps" :class=" cn( 'group flex flex-1 list-none items-center justify-center gap-0', props.class, ) " > <slot /> </NavigationMenuList></template><script setup lang="ts">import type { NavigationMenuTriggerProps } from "reka-ui"import type { HTMLAttributes } from "vue"import { ChevronDown } from "@lucide/vue"import { reactiveOmit } from "@vueuse/core"import { NavigationMenuTrigger, useForwardProps,} from "reka-ui"import { cn } from "@/registry/edmi/lib/utils"import { navigationMenuTriggerStyle } from "."
const props = defineProps<NavigationMenuTriggerProps & { class?: HTMLAttributes["class"] }>()
const delegatedProps = reactiveOmit(props, "class")
const forwardedProps = useForwardProps(delegatedProps)</script>
<template> <NavigationMenuTrigger data-slot="navigation-menu-trigger" v-bind="forwardedProps" :class="cn(navigationMenuTriggerStyle(), 'group', props.class)" > <slot /> <ChevronDown class="relative top-px ml-1 size-3 transition duration-300 group-data-[state=open]:rotate-180" aria-hidden="true" /> </NavigationMenuTrigger></template><script setup lang="ts">import type { NavigationMenuViewportProps } from "reka-ui"import type { HTMLAttributes } from "vue"import { reactiveOmit } from "@vueuse/core"import { NavigationMenuViewport, useForwardProps,} from "reka-ui"import { cn } from "@/registry/edmi/lib/utils"
const props = defineProps<NavigationMenuViewportProps & { class?: HTMLAttributes["class"] }>()
const delegatedProps = reactiveOmit(props, "class")
const forwardedProps = useForwardProps(delegatedProps)</script>
<template> <div class="absolute top-full left-0 isolate z-50 flex justify-center"> <NavigationMenuViewport data-slot="navigation-menu-viewport" v-bind="forwardedProps" :class=" cn( 'origin-top-center bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 relative mt-2 h-(--reka-navigation-menu-viewport-height) w-full overflow-hidden rounded-xl border border-border md:w-(--reka-navigation-menu-viewport-width) left-(--reka-navigation-menu-viewport-left)', props.class, ) " /> </div></template>import { cva } from "class-variance-authority";
export { default as NavigationMenu } from "./NavigationMenu.vue";export { default as NavigationMenuContent } from "./NavigationMenuContent.vue";export { default as NavigationMenuIndicator } from "./NavigationMenuIndicator.vue";export { default as NavigationMenuItem } from "./NavigationMenuItem.vue";export { default as NavigationMenuLink } from "./NavigationMenuLink.vue";export { default as NavigationMenuList } from "./NavigationMenuList.vue";export { default as NavigationMenuTrigger } from "./NavigationMenuTrigger.vue";export { default as NavigationMenuViewport } from "./NavigationMenuViewport.vue";
export const navigationMenuTriggerStyle = cva( "group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-md px-3 text-[13.5px] font-medium text-muted-foreground transition-colors outline-none hover:bg-accent hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-accent data-[state=open]:text-foreground",);<script lang="ts"> import { NavigationMenu as NavigationMenuPrimitive } from "bits-ui"; import { cn } from "$lib/utils.js";
let { ref = $bindable(null), class: className, ...restProps }: NavigationMenuPrimitive.ContentProps = $props();</script>
<NavigationMenuPrimitive.Content bind:ref data-slot="navigation-menu-content" class={cn( "data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 top-0 left-0 w-full p-1.5 md:absolute md:w-auto group-data-[viewport=false]/navigation-menu:top-full group-data-[viewport=false]/navigation-menu:mt-2 group-data-[viewport=false]/navigation-menu:overflow-hidden group-data-[viewport=false]/navigation-menu:rounded-xl group-data-[viewport=false]/navigation-menu:border group-data-[viewport=false]/navigation-menu:border-border group-data-[viewport=false]/navigation-menu:bg-popover group-data-[viewport=false]/navigation-menu:text-popover-foreground group-data-[viewport=false]/navigation-menu:duration-200 group-data-[viewport=false]/navigation-menu:data-[state=open]:animate-in group-data-[viewport=false]/navigation-menu:data-[state=open]:fade-in-0 group-data-[viewport=false]/navigation-menu:data-[state=open]:zoom-in-95 group-data-[viewport=false]/navigation-menu:data-[state=closed]:animate-out group-data-[viewport=false]/navigation-menu:data-[state=closed]:fade-out-0 group-data-[viewport=false]/navigation-menu:data-[state=closed]:zoom-out-95 **:data-[slot=navigation-menu-link]:focus:outline-none", className )} {...restProps}/><script lang="ts"> import { NavigationMenu as NavigationMenuPrimitive } from "bits-ui"; import { cn } from "$lib/utils.js";
let { ref = $bindable(null), class: className, ...restProps }: NavigationMenuPrimitive.IndicatorProps = $props();</script>
<NavigationMenuPrimitive.Indicator bind:ref data-slot="navigation-menu-indicator" class={cn( "data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in top-full z-1 flex h-1.5 items-end justify-center overflow-hidden", className )} {...restProps}> <div class="bg-border rounded-tl-sm relative top-[60%] h-2 w-2 rotate-45"></div></NavigationMenuPrimitive.Indicator><script lang="ts"> import { NavigationMenu as NavigationMenuPrimitive } from "bits-ui"; import { cn } from "$lib/utils.js";
let { ref = $bindable(null), class: className, ...restProps }: NavigationMenuPrimitive.ItemProps = $props();</script>
<NavigationMenuPrimitive.Item bind:ref data-slot="navigation-menu-item" class={cn("relative", className)} {...restProps}/><script lang="ts"> import { NavigationMenu as NavigationMenuPrimitive } from "bits-ui"; import { cn } from "$lib/utils.js";
let { ref = $bindable(null), class: className, ...restProps }: NavigationMenuPrimitive.LinkProps = $props();</script>
<NavigationMenuPrimitive.Link bind:ref data-slot="navigation-menu-link" class={cn( "flex items-center gap-2.5 rounded-lg p-2 text-[13.5px] transition-colors outline-none hover:bg-accent hover:text-accent-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring in-data-[slot=navigation-menu-content]:rounded-[7px] data-[active]:bg-accent data-[active]:text-accent-foreground [&_svg:not([class*='size-'])]:size-4", className)} {...restProps}/><script lang="ts"> import { NavigationMenu as NavigationMenuPrimitive } from "bits-ui"; import { cn } from "$lib/utils.js";
let { ref = $bindable(null), class: className, ...restProps }: NavigationMenuPrimitive.ListProps = $props();</script>
<NavigationMenuPrimitive.List bind:ref data-slot="navigation-menu-list" class={cn( "group flex flex-1 list-none items-center justify-center gap-0", className )} {...restProps}/><script lang="ts" module> import { tv } from "tailwind-variants"; import { cn } from "$lib/utils.js";
export const navigationMenuTriggerStyle = tv({ base: "group/navigation-menu-trigger inline-flex h-9 w-max items-center justify-center rounded-md px-3 text-[13.5px] font-medium text-muted-foreground transition-colors outline-none hover:bg-accent hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-accent data-[state=open]:text-foreground", });</script>
<script lang="ts"> import { NavigationMenu as NavigationMenuPrimitive } from "bits-ui"; import CaretDownIcon from "phosphor-svelte/lib/CaretDown"; let { ref = $bindable(null), class: className, children, ...restProps }: NavigationMenuPrimitive.TriggerProps = $props();</script>
<NavigationMenuPrimitive.Trigger bind:ref data-slot="navigation-menu-trigger" class={cn(navigationMenuTriggerStyle(), "group", className)} {...restProps}> {@render children?.()} <CaretDownIcon class="relative top-px ml-1 size-3 transition duration-300 group-data-[state=open]/navigation-menu-trigger:rotate-180" aria-hidden="true" /></NavigationMenuPrimitive.Trigger><script lang="ts"> import { NavigationMenu as NavigationMenuPrimitive } from "bits-ui"; import { cn } from "$lib/utils.js";
let { ref = $bindable(null), class: className, ...restProps }: NavigationMenuPrimitive.ViewportProps = $props();</script>
<div class={cn( "absolute start-0 top-full isolate z-50 flex justify-center" )}> <NavigationMenuPrimitive.Viewport bind:ref data-slot="navigation-menu-viewport" class={cn( "origin-top-center relative mt-2 w-full overflow-hidden rounded-xl border border-border bg-popover text-popover-foreground duration-100 data-[state=open]:animate-in data-[state=open]:zoom-in-90 data-[state=closed]:animate-out data-[state=closed]:zoom-out-90", "h-[calc(var(--bits-navigation-menu-viewport-height)_+_1rem)] md:w-[calc(var(--bits-navigation-menu-viewport-width)_+_1rem)]", className )} {...restProps} /></div><script lang="ts"> import { NavigationMenu as NavigationMenuPrimitive } from "bits-ui"; import { cn } from "$lib/utils.js"; import NavigationMenuViewport from "./navigation-menu-viewport.svelte";
let { ref = $bindable(null), class: className, viewport = true, children, ...restProps }: NavigationMenuPrimitive.RootProps & { viewport?: boolean; } = $props();</script>
<NavigationMenuPrimitive.Root bind:ref data-slot="navigation-menu" data-viewport={viewport} class={cn( "group/navigation-menu relative flex max-w-max flex-1 items-center justify-center", className )} {...restProps}> {@render children?.()} {#if viewport} <NavigationMenuViewport /> {/if}</NavigationMenuPrimitive.Root>import Root from "./navigation-menu.svelte";import Content from "./navigation-menu-content.svelte";import Indicator from "./navigation-menu-indicator.svelte";import Item from "./navigation-menu-item.svelte";import Link from "./navigation-menu-link.svelte";import List from "./navigation-menu-list.svelte";import Trigger from "./navigation-menu-trigger.svelte";import Viewport from "./navigation-menu-viewport.svelte";
export { Content, Content as NavigationMenuContent, Indicator, Indicator as NavigationMenuIndicator, Item, Item as NavigationMenuItem, Link, Link as NavigationMenuLink, List, List as NavigationMenuList, Root, // Root as NavigationMenuRoot, Trigger, Trigger as NavigationMenuTrigger, Viewport, Viewport as NavigationMenuViewport,};| Prop | Type | Default |
|---|---|---|
NavigationMenu align |
start | center | end |
start |
NavigationMenuLink href / render |
string / ReactElement |
none |
navigationMenuTriggerStyle() |
cva | trigger classes for plain links |
Parts: NavigationMenu, NavigationMenuList, NavigationMenuItem, NavigationMenuTrigger, NavigationMenuContent, NavigationMenuLink, NavigationMenuIndicator, NavigationMenuPositioner.
✦ Edmi additions
Section titled “✦ Edmi additions”- Panel is a solid
--popoversurface with a 1px border, flat.