Breadcrumb
Usage
Items
Use the items
prop as an array of objects with the following properties:
label?: string
icon?: string
avatar?: AvatarProps
class?: any
slot?: string
You can also pass any property from the Link component such as to
, target
, etc.
<script setup lang="ts">
const items = ref([
{
label: 'Home',
icon: 'i-lucide-house'
},
{
label: 'Components',
icon: 'i-lucide-box',
to: '/components'
},
{
label: 'Breadcrumb',
icon: 'i-lucide-link',
to: '/components/breadcrumb'
}
])
</script>
<template>
<UBreadcrumb :items="items" />
</template>
span
is rendered instead of a link when the to
property is not defined.Separator Icon
Use the separator-icon
prop to customize the Icon between each item. Defaults to i-lucide-chevron-right
.
<script setup lang="ts">
const items = ref([
{
label: 'Home',
icon: 'i-lucide-house'
},
{
label: 'Components',
icon: 'i-lucide-box',
to: '/components'
},
{
label: 'Breadcrumb',
icon: 'i-lucide-link',
to: '/components/breadcrumb'
}
])
</script>
<template>
<UBreadcrumb separator-icon="i-lucide-arrow-right" :items="items" />
</template>
Examples
With separator slot
Use the #separator
slot to customize the separator between each item.
<script setup lang="ts">
const items = [{
label: 'Home',
to: '/'
}, {
label: 'Components',
to: '/components'
}, {
label: 'Breadcrumb',
to: '/components/breadcrumb'
}]
</script>
<template>
<UBreadcrumb :items="items">
<template #separator>
<span class="mx-2 text-[var(--ui-text-muted)]">/</span>
</template>
</UBreadcrumb>
</template>
With custom slot
Use the slot
property to customize a specific item.
You will have access to the following slots:
#{{ item.slot }}
#{{ item.slot }}-leading
#{{ item.slot }}-label
#{{ item.slot }}-trailing
<script setup lang="ts">
const items = [{
label: 'Home',
to: '/'
}, {
slot: 'dropdown',
icon: 'i-lucide-ellipsis',
children: [{
label: 'Documentation'
}, {
label: 'Themes'
}, {
label: 'GitHub'
}]
}, {
label: 'Components',
to: '/components'
}, {
label: 'Breadcrumb',
to: '/components/breadcrumb'
}]
</script>
<template>
<UBreadcrumb :items="items">
<template #dropdown="{ item }">
<UDropdownMenu :items="item.children">
<UButton :icon="item.icon" color="neutral" variant="link" class="p-0.5" />
</UDropdownMenu>
</template>
</UBreadcrumb>
</template>
#item
, #item-leading
, #item-label
and #item-trailing
slots to customize all items.API
Props
Prop | Default | Type |
---|---|---|
as |
|
The element or component this component should render as. |
items |
| |
separatorIcon |
|
The icon to use as a separator. |
labelKey |
|
The key used to get the label from the item. |
ui |
|
Slots
Slot | Type |
---|---|
item |
|
item-leading |
|
item-label |
|
item-trailing |
|
separator |
|
Theme
export default defineAppConfig({
ui: {
breadcrumb: {
slots: {
root: 'relative min-w-0',
list: 'flex items-center gap-1.5',
item: 'flex min-w-0',
link: 'group relative flex items-center gap-1.5 text-sm min-w-0 focus-visible:outline-[var(--ui-primary)]',
linkLeadingIcon: 'shrink-0 size-5',
linkLeadingAvatar: 'shrink-0',
linkLeadingAvatarSize: '2xs',
linkLabel: 'truncate',
separator: 'flex',
separatorIcon: 'shrink-0 size-5 text-[var(--ui-text-muted)]'
},
variants: {
active: {
true: {
link: 'text-[var(--ui-primary)] font-semibold'
},
false: {
link: 'text-[var(--ui-text-muted)] font-medium'
}
},
disabled: {
true: {
link: 'cursor-not-allowed opacity-75'
}
},
to: {
true: ''
}
},
compoundVariants: [
{
disabled: false,
active: false,
to: true,
class: {
link: [
'hover:text-[var(--ui-text)]',
'transition-colors'
]
}
}
]
}
}
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
ui: {
breadcrumb: {
slots: {
root: 'relative min-w-0',
list: 'flex items-center gap-1.5',
item: 'flex min-w-0',
link: 'group relative flex items-center gap-1.5 text-sm min-w-0 focus-visible:outline-[var(--ui-primary)]',
linkLeadingIcon: 'shrink-0 size-5',
linkLeadingAvatar: 'shrink-0',
linkLeadingAvatarSize: '2xs',
linkLabel: 'truncate',
separator: 'flex',
separatorIcon: 'shrink-0 size-5 text-[var(--ui-text-muted)]'
},
variants: {
active: {
true: {
link: 'text-[var(--ui-primary)] font-semibold'
},
false: {
link: 'text-[var(--ui-text-muted)] font-medium'
}
},
disabled: {
true: {
link: 'cursor-not-allowed opacity-75'
}
},
to: {
true: ''
}
},
compoundVariants: [
{
disabled: false,
active: false,
to: true,
class: {
link: [
'hover:text-[var(--ui-text)]',
'transition-colors'
]
}
}
]
}
}
})
]
})