ContentNavigation专业版
用法
使用 navigation
prop,其值为您获取应用程序导航时获得的数据。
<script setup lang="ts">
import type { ContentNavigationItem } from '@nuxt/content'
const navigation = inject<Ref<ContentNavigationItem[]>>('navigation')
</script>
<template>
<UContentNavigation :navigation="navigation" highlight />
</template>
类型
将 type
prop 设置为 single
只允许一次打开一个项目。默认为 multiple
。
<script setup lang="ts">
const navigation = ref([
{
title: 'Guide',
icon: 'i-lucide-book-open',
path: '#getting-started',
children: [
{
title: 'Introduction',
path: '#introduction',
active: true
},
{
title: 'Installation',
path: '#installation'
}
]
},
{
title: 'Composables',
icon: 'i-lucide-database',
path: '#composables',
children: [
{
title: 'defineShortcuts',
path: '#defineshortcuts'
},
{
title: 'useModal',
path: '#usemodal'
}
]
}
])
</script>
<template>
<UContentNavigation type="single" />
</template>
颜色
使用 color
prop 更改导航链接的颜色。
<script setup lang="ts">
const navigation = ref([
{
title: 'Guide',
icon: 'i-lucide-book-open',
path: '#getting-started',
children: [
{
title: 'Introduction',
path: '#introduction',
active: true
},
{
title: 'Installation',
path: '#installation'
}
]
},
{
title: 'Composables',
icon: 'i-lucide-database',
path: '#composables',
children: [
{
title: 'defineShortcuts',
path: '#defineshortcuts'
},
{
title: 'useModal',
path: '#usemodal'
}
]
}
])
</script>
<template>
<UContentNavigation color="neutral" />
</template>
变体
使用 variant
prop 更改导航链接的变体。
<script setup lang="ts">
const navigation = ref([
{
title: 'Guide',
icon: 'i-lucide-book-open',
path: '#getting-started',
children: [
{
title: 'Introduction',
path: '#introduction',
active: true
},
{
title: 'Installation',
path: '#installation'
}
]
},
{
title: 'Composables',
icon: 'i-lucide-database',
path: '#composables',
children: [
{
title: 'defineShortcuts',
path: '#defineshortcuts'
},
{
title: 'useModal',
path: '#usemodal'
}
]
}
])
</script>
<template>
<UContentNavigation variant="link" />
</template>
高亮
使用 highlight
prop 为活动链接显示高亮边框。
使用 highlight-color
prop 更改边框颜色。默认为 color
prop。
<script setup lang="ts">
const navigation = ref([
{
title: 'Guide',
icon: 'i-lucide-book-open',
path: '#getting-started',
children: [
{
title: 'Introduction',
path: '#introduction',
active: true
},
{
title: 'Installation',
path: '#installation'
}
]
},
{
title: 'Composables',
icon: 'i-lucide-database',
path: '#composables',
children: [
{
title: 'defineShortcuts',
path: '#defineshortcuts'
},
{
title: 'useModal',
path: '#usemodal'
}
]
}
])
</script>
<template>
<UContentNavigation highlight highlight-color="primary" color="primary" variant="pill" />
</template>
尾部图标
<script setup lang="ts">
const navigation = ref([
{
title: 'Guide',
icon: 'i-lucide-book-open',
path: '#getting-started',
children: [
{
title: 'Introduction',
path: '#introduction',
active: true
},
{
title: 'Installation',
path: '#installation'
}
]
},
{
title: 'Composables',
icon: 'i-lucide-database',
path: '#composables',
children: [
{
title: 'defineShortcuts',
path: '#defineshortcuts'
},
{
title: 'useModal',
path: '#usemodal'
}
]
}
])
</script>
<template>
<UContentNavigation trailing-icon="i-lucide-arrow-up" />
</template>
示例
在布局中
在布局中使用 PageAside 组件内的 ContentNavigation 组件来显示页面导航
<script setup lang="ts">
import type { ContentNavigationItem } from '@nuxt/content'
const navigation = inject<Ref<ContentNavigationItem[]>>('navigation')
</script>
<template>
<UPage>
<template #left>
<UPageAside>
<UContentNavigation :navigation="navigation" highlight />
</UPageAside>
</template>
<slot />
</UPage>
</template>
在头部中
在 Header 组件的 content
slot 中使用 ContentNavigation 组件来在移动端显示页面导航
<script setup lang="ts">
import type { ContentNavigationItem } from '@nuxt/content'
const navigation = inject<Ref<ContentNavigationItem[]>>('navigation')
</script>
<template>
<UHeader>
<template #body>
<UContentNavigation :navigation="navigation" highlight />
</template>
</UHeader>
</template>
API
Props
Prop | 默认值 | 类型 |
---|---|---|
as |
|
此组件应渲染为的元素或组件。 |
defaultOpen |
|
当 |
trailingIcon |
|
用于切换手风琴的图标。 |
color |
|
|
variant |
|
|
highlight |
|
在活动链接旁边显示一条线。 |
highlightColor |
|
|
collapsible |
|
当 type 为 "single" 时,允许在点击已打开项目的触发器时关闭内容。当 type 为 "multiple" 时,此 prop 无效。 |
level |
|
|
navigation |
| |
disabled |
|
当 |
type |
|
确定一次可以选择“单个”还是“多个”项目。 此 prop 将覆盖从 |
ui |
|
插槽
插槽 | 类型 |
---|---|
link |
|
link-leading |
|
link-title |
|
link-trailing |
|
Emits
事件 | 类型 |
---|---|
update:modelValue |
|
主题
export default defineAppConfig({
uiPro: {
contentNavigation: {
slots: {
root: '',
content: 'data-[state=open]:animate-[accordion-down_200ms_ease-out] data-[state=closed]:animate-[accordion-up_200ms_ease-out] overflow-hidden focus:outline-none',
list: 'isolate -mx-2.5 -mt-1.5',
item: '',
listWithChildren: 'ms-5 border-s border-default',
itemWithChildren: 'flex flex-col data-[state=open]:mb-1.5',
trigger: 'font-semibold',
link: 'group relative w-full px-2.5 py-1.5 before:inset-y-px before:inset-x-0 flex items-center gap-1.5 text-sm before:absolute before:z-[-1] before:rounded-md focus:outline-none focus-visible:outline-none focus-visible:before:ring-inset focus-visible:before:ring-2',
linkLeadingIcon: 'shrink-0 size-5',
linkTrailing: 'ms-auto inline-flex gap-1.5 items-center',
linkTrailingBadge: 'shrink-0',
linkTrailingBadgeSize: 'sm',
linkTrailingIcon: 'size-5 transform transition-transform duration-200 shrink-0 group-data-[state=open]:rotate-180',
linkTitle: 'truncate',
linkTitleExternalIcon: 'size-3 align-top text-dimmed'
},
variants: {
color: {
primary: {
trigger: 'focus-visible:ring-primary',
link: 'focus-visible:before:ring-primary'
},
secondary: {
trigger: 'focus-visible:ring-secondary',
link: 'focus-visible:before:ring-secondary'
},
success: {
trigger: 'focus-visible:ring-success',
link: 'focus-visible:before:ring-success'
},
info: {
trigger: 'focus-visible:ring-info',
link: 'focus-visible:before:ring-info'
},
warning: {
trigger: 'focus-visible:ring-warning',
link: 'focus-visible:before:ring-warning'
},
error: {
trigger: 'focus-visible:ring-error',
link: 'focus-visible:before:ring-error'
},
neutral: {
trigger: 'focus-visible:ring-inverted',
link: 'focus-visible:before:ring-inverted'
}
},
highlightColor: {
primary: '',
secondary: '',
success: '',
info: '',
warning: '',
error: '',
neutral: ''
},
variant: {
pill: '',
link: ''
},
active: {
true: {
link: 'font-medium'
},
false: {
link: 'text-muted',
linkLeadingIcon: 'text-dimmed'
}
},
disabled: {
true: {
link: 'cursor-not-allowed opacity-75'
}
},
highlight: {
true: {}
},
level: {
true: {
item: 'ps-1.5 -ms-px',
itemWithChildren: 'ps-1.5 -ms-px'
}
}
},
compoundVariants: [
{
highlight: true,
level: true,
class: {
link: [
'after:absolute after:-left-1.5 after:inset-y-0.5 after:block after:w-px after:rounded-full',
'after:transition-colors'
]
}
},
{
disabled: false,
active: false,
variant: 'pill',
class: {
link: [
'hover:text-highlighted hover:before:bg-elevated/50 data-[state=open]:text-highlighted',
'transition-colors before:transition-colors'
],
linkLeadingIcon: [
'group-hover:text-default group-data-[state=open]:text-default',
'transition-colors'
]
}
},
{
color: 'primary',
variant: 'pill',
active: true,
class: {
link: 'text-primary',
linkLeadingIcon: 'text-primary group-data-[state=open]:text-primary'
}
},
{
color: 'neutral',
variant: 'pill',
active: true,
class: {
link: 'text-highlighted',
linkLeadingIcon: 'text-highlighted group-data-[state=open]:text-highlighted'
}
},
{
variant: 'pill',
active: true,
highlight: false,
class: {
link: 'before:bg-elevated'
}
},
{
variant: 'pill',
active: true,
highlight: true,
class: {
link: [
'hover:before:bg-elevated/50',
'before:transition-colors'
]
}
},
{
disabled: false,
active: false,
variant: 'link',
class: {
link: [
'hover:text-highlighted data-[state=open]:text-highlighted',
'transition-colors'
],
linkLeadingIcon: [
'group-hover:text-default group-data-[state=open]:text-default',
'transition-colors'
]
}
},
{
color: 'primary',
variant: 'link',
active: true,
class: {
link: 'text-primary',
linkLeadingIcon: 'text-primary group-data-[state=open]:text-primary'
}
},
{
color: 'neutral',
variant: 'link',
active: true,
class: {
link: 'text-highlighted',
linkLeadingIcon: 'text-highlighted group-data-[state=open]:text-highlighted'
}
},
{
highlightColor: 'primary',
highlight: true,
level: true,
active: true,
class: {
link: 'after:bg-primary'
}
},
{
highlightColor: 'neutral',
highlight: true,
level: true,
active: true,
class: {
link: 'after:bg-inverted'
}
}
],
defaultVariants: {
color: 'primary',
highlightColor: 'primary',
variant: 'pill'
}
}
}
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
uiPro: {
contentNavigation: {
slots: {
root: '',
content: 'data-[state=open]:animate-[accordion-down_200ms_ease-out] data-[state=closed]:animate-[accordion-up_200ms_ease-out] overflow-hidden focus:outline-none',
list: 'isolate -mx-2.5 -mt-1.5',
item: '',
listWithChildren: 'ms-5 border-s border-default',
itemWithChildren: 'flex flex-col data-[state=open]:mb-1.5',
trigger: 'font-semibold',
link: 'group relative w-full px-2.5 py-1.5 before:inset-y-px before:inset-x-0 flex items-center gap-1.5 text-sm before:absolute before:z-[-1] before:rounded-md focus:outline-none focus-visible:outline-none focus-visible:before:ring-inset focus-visible:before:ring-2',
linkLeadingIcon: 'shrink-0 size-5',
linkTrailing: 'ms-auto inline-flex gap-1.5 items-center',
linkTrailingBadge: 'shrink-0',
linkTrailingBadgeSize: 'sm',
linkTrailingIcon: 'size-5 transform transition-transform duration-200 shrink-0 group-data-[state=open]:rotate-180',
linkTitle: 'truncate',
linkTitleExternalIcon: 'size-3 align-top text-dimmed'
},
variants: {
color: {
primary: {
trigger: 'focus-visible:ring-primary',
link: 'focus-visible:before:ring-primary'
},
secondary: {
trigger: 'focus-visible:ring-secondary',
link: 'focus-visible:before:ring-secondary'
},
success: {
trigger: 'focus-visible:ring-success',
link: 'focus-visible:before:ring-success'
},
info: {
trigger: 'focus-visible:ring-info',
link: 'focus-visible:before:ring-info'
},
warning: {
trigger: 'focus-visible:ring-warning',
link: 'focus-visible:before:ring-warning'
},
error: {
trigger: 'focus-visible:ring-error',
link: 'focus-visible:before:ring-error'
},
neutral: {
trigger: 'focus-visible:ring-inverted',
link: 'focus-visible:before:ring-inverted'
}
},
highlightColor: {
primary: '',
secondary: '',
success: '',
info: '',
warning: '',
error: '',
neutral: ''
},
variant: {
pill: '',
link: ''
},
active: {
true: {
link: 'font-medium'
},
false: {
link: 'text-muted',
linkLeadingIcon: 'text-dimmed'
}
},
disabled: {
true: {
link: 'cursor-not-allowed opacity-75'
}
},
highlight: {
true: {}
},
level: {
true: {
item: 'ps-1.5 -ms-px',
itemWithChildren: 'ps-1.5 -ms-px'
}
}
},
compoundVariants: [
{
highlight: true,
level: true,
class: {
link: [
'after:absolute after:-left-1.5 after:inset-y-0.5 after:block after:w-px after:rounded-full',
'after:transition-colors'
]
}
},
{
disabled: false,
active: false,
variant: 'pill',
class: {
link: [
'hover:text-highlighted hover:before:bg-elevated/50 data-[state=open]:text-highlighted',
'transition-colors before:transition-colors'
],
linkLeadingIcon: [
'group-hover:text-default group-data-[state=open]:text-default',
'transition-colors'
]
}
},
{
color: 'primary',
variant: 'pill',
active: true,
class: {
link: 'text-primary',
linkLeadingIcon: 'text-primary group-data-[state=open]:text-primary'
}
},
{
color: 'neutral',
variant: 'pill',
active: true,
class: {
link: 'text-highlighted',
linkLeadingIcon: 'text-highlighted group-data-[state=open]:text-highlighted'
}
},
{
variant: 'pill',
active: true,
highlight: false,
class: {
link: 'before:bg-elevated'
}
},
{
variant: 'pill',
active: true,
highlight: true,
class: {
link: [
'hover:before:bg-elevated/50',
'before:transition-colors'
]
}
},
{
disabled: false,
active: false,
variant: 'link',
class: {
link: [
'hover:text-highlighted data-[state=open]:text-highlighted',
'transition-colors'
],
linkLeadingIcon: [
'group-hover:text-default group-data-[state=open]:text-default',
'transition-colors'
]
}
},
{
color: 'primary',
variant: 'link',
active: true,
class: {
link: 'text-primary',
linkLeadingIcon: 'text-primary group-data-[state=open]:text-primary'
}
},
{
color: 'neutral',
variant: 'link',
active: true,
class: {
link: 'text-highlighted',
linkLeadingIcon: 'text-highlighted group-data-[state=open]:text-highlighted'
}
},
{
highlightColor: 'primary',
highlight: true,
level: true,
active: true,
class: {
link: 'after:bg-primary'
}
},
{
highlightColor: 'neutral',
highlight: true,
level: true,
active: true,
class: {
link: 'after:bg-inverted'
}
}
],
defaultVariants: {
color: 'primary',
highlightColor: 'primary',
variant: 'pill'
}
}
}
})
]
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import uiPro from '@nuxt/ui-pro/vite'
export default defineConfig({
plugins: [
vue(),
uiPro({
uiPro: {
contentNavigation: {
slots: {
root: '',
content: 'data-[state=open]:animate-[accordion-down_200ms_ease-out] data-[state=closed]:animate-[accordion-up_200ms_ease-out] overflow-hidden focus:outline-none',
list: 'isolate -mx-2.5 -mt-1.5',
item: '',
listWithChildren: 'ms-5 border-s border-default',
itemWithChildren: 'flex flex-col data-[state=open]:mb-1.5',
trigger: 'font-semibold',
link: 'group relative w-full px-2.5 py-1.5 before:inset-y-px before:inset-x-0 flex items-center gap-1.5 text-sm before:absolute before:z-[-1] before:rounded-md focus:outline-none focus-visible:outline-none focus-visible:before:ring-inset focus-visible:before:ring-2',
linkLeadingIcon: 'shrink-0 size-5',
linkTrailing: 'ms-auto inline-flex gap-1.5 items-center',
linkTrailingBadge: 'shrink-0',
linkTrailingBadgeSize: 'sm',
linkTrailingIcon: 'size-5 transform transition-transform duration-200 shrink-0 group-data-[state=open]:rotate-180',
linkTitle: 'truncate',
linkTitleExternalIcon: 'size-3 align-top text-dimmed'
},
variants: {
color: {
primary: {
trigger: 'focus-visible:ring-primary',
link: 'focus-visible:before:ring-primary'
},
secondary: {
trigger: 'focus-visible:ring-secondary',
link: 'focus-visible:before:ring-secondary'
},
success: {
trigger: 'focus-visible:ring-success',
link: 'focus-visible:before:ring-success'
},
info: {
trigger: 'focus-visible:ring-info',
link: 'focus-visible:before:ring-info'
},
warning: {
trigger: 'focus-visible:ring-warning',
link: 'focus-visible:before:ring-warning'
},
error: {
trigger: 'focus-visible:ring-error',
link: 'focus-visible:before:ring-error'
},
neutral: {
trigger: 'focus-visible:ring-inverted',
link: 'focus-visible:before:ring-inverted'
}
},
highlightColor: {
primary: '',
secondary: '',
success: '',
info: '',
warning: '',
error: '',
neutral: ''
},
variant: {
pill: '',
link: ''
},
active: {
true: {
link: 'font-medium'
},
false: {
link: 'text-muted',
linkLeadingIcon: 'text-dimmed'
}
},
disabled: {
true: {
link: 'cursor-not-allowed opacity-75'
}
},
highlight: {
true: {}
},
level: {
true: {
item: 'ps-1.5 -ms-px',
itemWithChildren: 'ps-1.5 -ms-px'
}
}
},
compoundVariants: [
{
highlight: true,
level: true,
class: {
link: [
'after:absolute after:-left-1.5 after:inset-y-0.5 after:block after:w-px after:rounded-full',
'after:transition-colors'
]
}
},
{
disabled: false,
active: false,
variant: 'pill',
class: {
link: [
'hover:text-highlighted hover:before:bg-elevated/50 data-[state=open]:text-highlighted',
'transition-colors before:transition-colors'
],
linkLeadingIcon: [
'group-hover:text-default group-data-[state=open]:text-default',
'transition-colors'
]
}
},
{
color: 'primary',
variant: 'pill',
active: true,
class: {
link: 'text-primary',
linkLeadingIcon: 'text-primary group-data-[state=open]:text-primary'
}
},
{
color: 'neutral',
variant: 'pill',
active: true,
class: {
link: 'text-highlighted',
linkLeadingIcon: 'text-highlighted group-data-[state=open]:text-highlighted'
}
},
{
variant: 'pill',
active: true,
highlight: false,
class: {
link: 'before:bg-elevated'
}
},
{
variant: 'pill',
active: true,
highlight: true,
class: {
link: [
'hover:before:bg-elevated/50',
'before:transition-colors'
]
}
},
{
disabled: false,
active: false,
variant: 'link',
class: {
link: [
'hover:text-highlighted data-[state=open]:text-highlighted',
'transition-colors'
],
linkLeadingIcon: [
'group-hover:text-default group-data-[state=open]:text-default',
'transition-colors'
]
}
},
{
color: 'primary',
variant: 'link',
active: true,
class: {
link: 'text-primary',
linkLeadingIcon: 'text-primary group-data-[state=open]:text-primary'
}
},
{
color: 'neutral',
variant: 'link',
active: true,
class: {
link: 'text-highlighted',
linkLeadingIcon: 'text-highlighted group-data-[state=open]:text-highlighted'
}
},
{
highlightColor: 'primary',
highlight: true,
level: true,
active: true,
class: {
link: 'after:bg-primary'
}
},
{
highlightColor: 'neutral',
highlight: true,
level: true,
active: true,
class: {
link: 'after:bg-inverted'
}
}
],
defaultVariants: {
color: 'primary',
highlightColor: 'primary',
variant: 'pill'
}
}
}
})
]
})