Breadcrumb
Utilisation
Utilisez le composant Breadcrumb pour afficher l'emplacement de la page actuelle dans la hiérarchie de votre site.
<script setup lang="ts">
import type { BreadcrumbItem } from '@nuxt/ui'
const items = ref<BreadcrumbItem[]>([
{
label: 'Docs',
icon: 'i-lucide-book-open',
to: '/docs'
},
{
label: 'Components',
icon: 'i-lucide-box',
to: '/docs/components'
},
{
label: 'Breadcrumb',
icon: 'i-lucide-link',
to: '/docs/components/breadcrumb'
}
])
</script>
<template>
<UBreadcrumb :items="items" />
</template><script setup lang="ts">
import { ref } from 'vue'
import type { BreadcrumbItem } from '@nuxt/ui'
const items = ref<BreadcrumbItem[]>([
{
label: 'Docs',
icon: 'i-lucide-book-open',
to: '/docs'
},
{
label: 'Components',
icon: 'i-lucide-box',
to: '/docs/components'
},
{
label: 'Breadcrumb',
icon: 'i-lucide-link',
to: '/docs/components/breadcrumb'
}
])
</script>
<template>
<UBreadcrumb :items="items" />
</template>Éléments
Utilisez le prop items comme un tableau d'objets avec les propriétés suivantes:
- x
label?: stringx{lang="ts-type"} - x
icon?: stringx{lang="ts-type"} - x
avatar?: AvatarPropsx{lang="ts-type"} Xph032xxxslot?: stringx{lang="ts-type"} - x
class?: anyx{lang="ts-type"} - x
ui?: { item?: ClassNameValue, link?: ClassNameValue, linkLeadingIcon?: ClassNameValue, linkLeadingAvatar?: ClassNameValue, linkLabel?: ClassNameValue, separator?: ClassNameValue, separatorIcon?: ClassNameValue }x{lang="ts-type"}
Vous pouvez passer n'importe quelle propriété du composant Link telle que to, target, etc.
<script setup lang="ts">
import type { BreadcrumbItem } from '@nuxt/ui'
const items = ref<BreadcrumbItem[]>([
{
label: 'Docs',
icon: 'i-lucide-book-open',
to: '/docs'
},
{
label: 'Components',
icon: 'i-lucide-box',
to: '/docs/components'
},
{
label: 'Breadcrumb',
icon: 'i-lucide-link',
to: '/docs/components/breadcrumb'
}
])
</script>
<template>
<UBreadcrumb :items="items" />
</template><script setup lang="ts">
import { ref } from 'vue'
import type { BreadcrumbItem } from '@nuxt/ui'
const items = ref<BreadcrumbItem[]>([
{
label: 'Docs',
icon: 'i-lucide-book-open',
to: '/docs'
},
{
label: 'Components',
icon: 'i-lucide-box',
to: '/docs/components'
},
{
label: 'Breadcrumb',
icon: 'i-lucide-link',
to: '/docs/components/breadcrumb'
}
])
</script>
<template>
<UBreadcrumb :items="items" />
</template>span est rendu à la place d'un lien lorsque la propriété to n'est pas définie.Separateur Icône
Utilisez la prop separator-icon pour personnaliser le Icon entre chaque élément.
<script setup lang="ts">
import type { BreadcrumbItem } from '@nuxt/ui'
const items = ref<BreadcrumbItem[]>([
{
label: 'Docs',
icon: 'i-lucide-book-open',
to: '/docs'
},
{
label: 'Components',
icon: 'i-lucide-box',
to: '/docs/components'
},
{
label: 'Breadcrumb',
icon: 'i-lucide-link',
to: '/docs/components/breadcrumb'
}
])
</script>
<template>
<UBreadcrumb separator-icon="i-lucide-arrow-right" :items="items" />
</template><script setup lang="ts">
import { ref } from 'vue'
import type { BreadcrumbItem } from '@nuxt/ui'
const items = ref<BreadcrumbItem[]>([
{
label: 'Docs',
icon: 'i-lucide-book-open',
to: '/docs'
},
{
label: 'Components',
icon: 'i-lucide-box',
to: '/docs/components'
},
{
label: 'Breadcrumb',
icon: 'i-lucide-link',
to: '/docs/components/breadcrumb'
}
])
</script>
<template>
<UBreadcrumb separator-icon="i-lucide-arrow-right" :items="items" />
</template>app.config.ts sous la touche ui.icons.chevronRight.vite.config.ts sous la touche ui.icons.chevronRight.Couleur: badge{label="4.8+" class="align-text-top"}
Utilisez le prop color pour changer la couleur du fil de pain actif.
<script setup lang="ts">
import type { BreadcrumbItem } from '@nuxt/ui'
const items = ref<BreadcrumbItem[]>([
{
label: 'Docs',
icon: 'i-lucide-book-open',
to: '/docs'
},
{
label: 'Components',
icon: 'i-lucide-box',
to: '/docs/components'
},
{
label: 'Breadcrumb',
icon: 'i-lucide-link',
to: '/docs/components/breadcrumb'
}
])
</script>
<template>
<UBreadcrumb color="secondary" :items="items" />
</template><script setup lang="ts">
import { ref } from 'vue'
import type { BreadcrumbItem } from '@nuxt/ui'
const items = ref<BreadcrumbItem[]>([
{
label: 'Docs',
icon: 'i-lucide-book-open',
to: '/docs'
},
{
label: 'Components',
icon: 'i-lucide-box',
to: '/docs/components'
},
{
label: 'Breadcrumb',
icon: 'i-lucide-link',
to: '/docs/components/breadcrumb'
}
])
</script>
<template>
<UBreadcrumb color="secondary" :items="items" />
</template>exemples
Avec fente de séparation
Utilisez le slot #separator pour personnaliser le séparateur entre chaque élément.
<script setup lang="ts">
import type { BreadcrumbItem } from '@nuxt/ui'
const items: BreadcrumbItem[] = [
{
label: 'Docs',
to: '/docs'
},
{
label: 'Components',
to: '/docs/components'
},
{
label: 'Breadcrumb',
to: '/docs/components/breadcrumb'
}
]
</script>
<template>
<UBreadcrumb :items="items">
<template #separator>
<span class="mx-2 text-muted">/</span>
</template>
</UBreadcrumb>
</template>
With slot personnalisé
Utilisez la propriété slot pour personnaliser un élément spécifique.
Vous aurez accès aux slots suivants:
#{{ item.slot }}x{lang="ts-type"}- x
#{{ item.slot }}-leadingx{lang="ts-type"} - x
#{{ item.slot }}-labelx{lang="ts-type"} - x
#{{ item.slot }}-trailingx{lang="ts-type"}
<script setup lang="ts">
import type { BreadcrumbItem } from '@nuxt/ui'
const items = [
{
label: 'Home',
to: '/'
},
{
slot: 'dropdown' as const,
icon: 'i-lucide-ellipsis',
children: [
{
label: 'Documentation',
to: '/docs'
},
{
label: 'Themes'
},
{
label: 'GitHub'
}
]
},
{
label: 'Components',
to: '/docs/components'
},
{
label: 'Breadcrumb',
to: '/docs/components/breadcrumb'
}
] satisfies BreadcrumbItem[]
</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 et #item-trailing pour personnaliser tous les éléments.API équipement
Props équipement
| Prop | Default | Type |
|---|---|---|
as | 'nav' | anyThe element or component this component should render as. |
items | T[] | |
separatorIcon | appConfig.ui.icons.chevronRight | anyThe icon to use as a separator. |
color | 'primary' | "primary" | "secondary" | "success" | "info" | "warning" | "error" | "neutral" |
labelKey | 'label' | keyof Extract<NestedItem<T>, object> & string | DotPathKeys<Extract<NestedItem<T>, object>>The key used to get the label from the item. |
ui | { root?: SlotClass; list?: SlotClass; item?: SlotClass; link?: SlotClass; linkLeadingIcon?: SlotClass; linkLeadingAvatar?: SlotClass; linkLeadingAvatarSize?: SlotClass; linkLabel?: SlotClass; separator?: SlotClass; separatorIcon?: SlotClass; } |
Slots
| Slot | Type |
|---|---|
item | { item: T; index: number; active: boolean; ui: object; } |
item-leading | { item: T; index: number; active: boolean; ui: object; } |
item-label | { item: T; index: number; active: boolean; } |
item-trailing | { item: T; index: number; active: boolean; } |
separator | { ui: object; } |
Thème
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 rounded-md',
linkLeadingIcon: 'shrink-0 size-5',
linkLeadingAvatar: 'shrink-0',
linkLeadingAvatarSize: '2xs',
linkLabel: 'truncate',
separator: 'flex',
separatorIcon: 'shrink-0 size-5 text-muted'
},
variants: {
active: {
true: {
link: 'font-semibold'
},
false: {
link: 'text-muted font-medium'
}
},
disabled: {
true: {
link: 'cursor-not-allowed opacity-75'
}
},
to: {
true: ''
},
color: {
primary: {
link: 'outline-primary/25 focus-visible:outline-3'
},
secondary: {
link: 'outline-secondary/25 focus-visible:outline-3'
},
success: {
link: 'outline-success/25 focus-visible:outline-3'
},
info: {
link: 'outline-info/25 focus-visible:outline-3'
},
warning: {
link: 'outline-warning/25 focus-visible:outline-3'
},
error: {
link: 'outline-error/25 focus-visible:outline-3'
},
neutral: {
link: 'outline-inverted/25 focus-visible:outline-3'
}
}
},
compoundVariants: [
{
disabled: false,
active: false,
to: true,
class: {
link: [
'hover:text-default',
'transition-colors'
]
}
},
{
color: 'primary',
active: true,
class: {
link: 'text-primary'
}
},
{
color: 'neutral',
active: true,
class: {
link: 'text-highlighted'
}
}
],
defaultVariants: {
color: 'primary'
}
}
}
})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 rounded-md',
linkLeadingIcon: 'shrink-0 size-5',
linkLeadingAvatar: 'shrink-0',
linkLeadingAvatarSize: '2xs',
linkLabel: 'truncate',
separator: 'flex',
separatorIcon: 'shrink-0 size-5 text-muted'
},
variants: {
active: {
true: {
link: 'font-semibold'
},
false: {
link: 'text-muted font-medium'
}
},
disabled: {
true: {
link: 'cursor-not-allowed opacity-75'
}
},
to: {
true: ''
},
color: {
primary: {
link: 'outline-primary/25 focus-visible:outline-3'
},
secondary: {
link: 'outline-secondary/25 focus-visible:outline-3'
},
success: {
link: 'outline-success/25 focus-visible:outline-3'
},
info: {
link: 'outline-info/25 focus-visible:outline-3'
},
warning: {
link: 'outline-warning/25 focus-visible:outline-3'
},
error: {
link: 'outline-error/25 focus-visible:outline-3'
},
neutral: {
link: 'outline-inverted/25 focus-visible:outline-3'
}
}
},
compoundVariants: [
{
disabled: false,
active: false,
to: true,
class: {
link: [
'hover:text-default',
'transition-colors'
]
}
},
{
color: 'primary',
active: true,
class: {
link: 'text-primary'
}
},
{
color: 'neutral',
active: true,
class: {
link: 'text-highlighted'
}
}
],
defaultVariants: {
color: 'primary'
}
}
}
})
]
})