UNavigationMenu

Vert or Horiz Links Menu


Description

UNavigationMenu provides a horiz or vert links menu from a data array.

Config

UNavigationMenu can be globally customized in app.config.ts:

export default defineAppConfig({
  ui: {
    navigationMenu: {
      variants: {
        // Base variants
      },
      compoundVariants: [
        // Hover && Inactive
        {
          disabled: false,
          active: false,
          variant: 'pill',
          class: {
            link: [
              'hover:text-(--ui-text-highlighted) hover:before:bg-(--ui-bg-elevated)/50 data-[state=open]:text-(--ui-text-highlighted)',
              'transition-colors before:transition-colors'
            ],
            linkLeadingIcon: [
              'group-hover:text-(--ui-text) group-data-[state=open]:text-(--ui-text)',
              'transition-colors'
            ]
          }
        }, // Hover
        //
        {
          color: 'primary',
          variant: 'pill',
          active: true,
          class: {
            link: 'text-(--ui-primary)',
            linkLeadingIcon: 'text-(--ui-primary) group-data-[state=open]:text-(--ui-primary)'
          }
        }
        // Other compound variants
      ]
    }
  }
})

Palette

Using secondary for link states:

export default defineAppConfig({
  ui: {
    navigationMenu: {
      compoundVariants: [
        // Hover && Inactive
        {
          disabled: false,
          active: false,
          variant: 'pill',
          class: {
            link: [
              'hover:text-(--ui-secondary) hover:before:bg-(--ui-secondary)/10',
              'transition-colors before:transition-colors'
            ],
            linkLeadingIcon: [
              'group-hover:text-(--ui-secondary)',
              'transition-colors'
            ]
          }
        },
        // Active
        {
          color: 'primary',
          variant: 'pill',
          active: true,
          class: {
            link: 'text-(--ui-secondary)',
            linkLeadingIcon: 'text-(--ui-secondary) group-data-[state=open]:text-(--ui-secondary)'
          }
        },
        // Focus
        {
          disabled: false,
          class: {
            link: 'focus-visible:before:ring-(--ui-secondary)'
          }
        }
      ]
    }
  }
})

Example

Complete example from Nuxt 3 AI Service:

export default defineAppConfig({
  ui: {
    navigationMenu: {
      slots: {
        // Keep the default slots
        link: 'group relative w-full flex items-center gap-1.5 font-medium text-sm before:absolute before:z-[-1] before:rounded-[calc(var(--ui-radius)*1.5)] focus:outline-none focus-visible:outline-none focus-visible:before:ring-inset focus-visible:before:ring-2'
      },
      variants: {
        color: {
          primary: {
            link: 'focus-visible:before:ring-(--ui-secondary)'
          }
        }
      },
      compoundVariants: [
        // Normal state
        {
          disabled: false,
          active: false,
          variant: 'pill',
          class: {
            link: [
              'text-(--ui-text) hover:text-(--ui-secondary) hover:before:bg-(--ui-secondary)/10',
              'transition-colors before:transition-colors'
            ],
            linkLeadingIcon: [
              'text-(--ui-text-dimmed) group-hover:text-(--ui-secondary)',
              'transition-colors'
            ]
          }
        },
        // Active state
        {
          active: true,
          class: {
            link: 'text-(--ui-secondary)',
            linkLeadingIcon: 'text-(--ui-secondary)'
          }
        }
      ]
    }
  }
})

Copyright @ 2025 Anne Brown