Toast
xph0000xUso
Utilice el componente useToast para mostrar un brindis en su aplicación.
<script setup lang="ts">
const toast = useToast()
function addToCalendar() {
const eventDate = new Date(Date.now() + Math.random() * 31536000000)
const formattedDate = eventDate.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric'
})
toast.add({
title: 'Event added to calendar',
description: `This event is scheduled for ${formattedDate}.`,
icon: 'i-lucide-calendar-days'
})
}
</script>
<template>
<UButton
label="Add to calendar"
color="neutral"
variant="outline"
icon="i-lucide-plus"
@click="addToCalendar"
/>
</template>App que utiliza nuestro componente Toaster que utiliza el componente ToastProvider de Reka UI.Nombre
Pasa un campo title al método toast.add para mostrar un título.
<script setup lang="ts">
const props = defineProps<{
title: string
}>()
const toast = useToast()
function showToast() {
toast.add(props)
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Descripción
Pase un campo description al método toast.add para mostrar una descripción.
<script setup lang="ts">
const props = defineProps<{
title: string
description: string
}>()
const toast = useToast()
function showToast() {
toast.add(props)
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Icon
Pase un campo icon al método toast.add para mostrar un Icon.
<script setup lang="ts">
const props = defineProps<{
icon: string
}>()
const toast = useToast()
function showToast() {
toast.add({
title: 'Uh oh! Something went wrong.',
description: 'There was a problem with your request.',
icon: props.icon
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Avatar en Español
Pase un campo avatar al método toast.add para mostrar un Avatar.
<script setup lang="ts">
import type { AvatarProps } from '@nuxt/ui'
const props = defineProps<{
avatar: AvatarProps
}>()
const toast = useToast()
function showToast() {
toast.add({
title: 'User invited',
description: 'benjamincanac was invited to the team.',
avatar: props.avatar
})
}
</script>
<template>
<UButton label="Invite user" color="neutral" variant="outline" @click="showToast" />
</template>
Color (Edición)
Pasa un campo color al método toast.add para cambiar el color de la tostada.
<script setup lang="ts">
import type { ToastProps } from '@nuxt/ui'
const props = defineProps<{
color: ToastProps['color']
}>()
const toast = useToast()
function showToast() {
toast.add({
title: 'Uh oh! Something went wrong.',
description: 'There was a problem with your request.',
icon: 'i-lucide-wifi',
color: props.color
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Cerrado
Pase un campo close para personalizar u ocultar el cierre Button (con el valor false).
<script setup lang="ts">
const toast = useToast()
function showToast() {
toast.add({
title: 'Uh oh! Something went wrong.',
description: 'There was a problem with your request.',
icon: 'i-lucide-wifi',
close: {
color: 'primary',
variant: 'outline',
class: 'rounded-full'
}
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Cerrar Icono
Pase un campo closeIcon para personalizar el botón de cierre Icon.
<script setup lang="ts">
const props = defineProps<{
closeIcon: string
}>()
const toast = useToast()
function showToast() {
toast.add({
title: 'Uh oh! Something went wrong.',
description: 'There was a problem with your request.',
closeIcon: props.closeIcon
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Acción
Pase un campo actions para agregar algunas acciones Button a la Tostada.
<script setup lang="ts">
const toast = useToast()
const props = defineProps<{
description: string
}>()
function showToast() {
toast.add({
title: 'Uh oh! Something went wrong.',
description: props.description,
actions: [{
icon: 'i-lucide-refresh-cw',
label: 'Retry',
color: 'neutral',
variant: 'outline',
onClick: (e) => {
e?.stopPropagation()
}
}]
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Duración
Pase un campo duration al método toast.add para cambiar el tiempo que permanece visible la Tostada (en milisegundos).
duration en 0 para mantener abierta la Tostada hasta que se cierre manualmente.<script setup lang="ts">
const toast = useToast()
const props = defineProps<{
duration: number
}>()
function showToast() {
toast.add({
title: 'Uh oh! Something went wrong.',
description: 'There was a problem with your request.',
duration: props.duration
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Progress (Edición española)
Pase un campo progress para personalizar u ocultar la barra Progress (con el valor false).
progress.color.<script setup lang="ts">
const toast = useToast()
function showToast() {
toast.add({
title: 'Uh oh! Something went wrong.',
description: 'There was a problem with your request.',
icon: 'i-lucide-wifi',
progress: false
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Orientación
Pase un campo orientation al método toast.add para cambiar la orientación de la Tostada.
<script setup lang="ts">
const toast = useToast()
const props = defineProps<{
orientation: 'horizontal' | 'vertical'
}>()
function showToast() {
toast.add({
title: 'Uh oh! Something went wrong.',
orientation: props.orientation,
actions: [{
icon: 'i-lucide-refresh-cw',
label: 'Retry',
color: 'neutral',
variant: 'outline',
onClick: (e) => {
e?.stopPropagation()
}
}]
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Ejemplos
Cambiar la posición global
Cambie el soporte toaster.position en el componente App para cambiar la posición de las tostadas.
<script setup lang="ts">
const toaster = { position: 'bottom-right' }
</script>
<template>
<UApp :toaster="toaster">
<NuxtPage />
</UApp>
</template>
<script setup lang="ts">
const toast = useToast()
function addToCalendar() {
const eventDate = new Date(Date.now() + Math.random() * 31536000000)
const formattedDate = eventDate.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric'
})
toast.add({
title: 'Event added to calendar',
description: `This event is scheduled for ${formattedDate}.`,
icon: 'i-lucide-calendar-days'
})
}
</script>
<template>
<UButton
label="Add to calendar"
color="neutral"
variant="outline"
icon="i-lucide-plus"
@click="addToCalendar"
/>
</template>Cambiar la duración global
Cambie el prop toaster.duration en el componente App para cambiar la duración de las tostadas.
<script setup lang="ts">
const toaster = { duration: 5000 }
</script>
<template>
<UApp :toaster="toaster">
<NuxtPage />
</UApp>
</template>
<script setup lang="ts">
const toast = useToast()
function addToCalendar() {
const eventDate = new Date(Date.now() + Math.random() * 31536000000)
const formattedDate = eventDate.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric'
})
toast.add({
title: 'Event added to calendar',
description: `This event is scheduled for ${formattedDate}.`,
icon: 'i-lucide-calendar-days'
})
}
</script>
<template>
<UButton
label="Add to calendar"
color="neutral"
variant="outline"
icon="i-lucide-plus"
@click="addToCalendar"
/>
</template>Change global máx.: badge{label="4.1+" class="align-text-top"}
Cambie el prop toaster.max en el componente App para cambiar el número máximo de tostadas que se muestran a la vez.
<script setup lang="ts">
const toaster = { max: 3 }
</script>
<template>
<UApp :toaster="toaster">
<NuxtPage />
</UApp>
</template>
<script setup lang="ts">
const toast = useToast()
function addToCalendar() {
const eventDate = new Date(Date.now() + Math.random() * 31536000000)
const formattedDate = eventDate.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric'
})
toast.add({
title: 'Event added to calendar',
description: `This event is scheduled for ${formattedDate}.`,
icon: 'i-lucide-calendar-days'
})
}
</script>
<template>
<UButton
label="Add to calendar"
color="neutral"
variant="outline"
icon="i-lucide-plus"
@click="addToCalendar"
/>
</template>Stacked tostadas
Configure el prop toaster.expand en false en el componente App para mostrar tostadas apiladas (inspirado en Sonner).
<script setup lang="ts">
const toaster = { expand: true }
</script>
<template>
<UApp :toaster="toaster">
<NuxtPage />
</UApp>
</template>
<script setup lang="ts">
const toast = useToast()
function addToCalendar() {
const eventDate = new Date(Date.now() + Math.random() * 31536000000)
const formattedDate = eventDate.toLocaleDateString('en-US', {
month: 'short',
day: 'numeric',
year: 'numeric'
})
toast.add({
title: 'Event added to calendar',
description: `This event is scheduled for ${formattedDate}.`,
icon: 'i-lucide-calendar-days'
})
}
</script>
<template>
<UButton
label="Add to calendar"
color="neutral"
variant="outline"
icon="i-lucide-plus"
@click="addToCalendar"
/>
</template>Tostados desduplicados: badge{label="4.5+" class="align-text-top"}
Al llamar a toast.add con un id que ya existe, el tostado existente pulsará en lugar de crear un duplicado.
<script setup lang="ts">
const toast = useToast()
function showToast() {
toast.add({
id: 'copy',
title: 'Copied to clipboard',
icon: 'i-lucide-circle-check',
duration: 0
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Con callback
Pase un campo onUpdateOpen para ejecutar una devolución de llamada cuando se cierre el toast (ya sea por vencimiento o por despido del usuario).
<script setup lang="ts">
const toast = useToast()
function showToast() {
const t = toast.add({
'title': 'Uploading file...',
'description': 'Your file is being uploaded.',
'icon': 'i-lucide-cloud-upload',
'duration': 3000,
'onUpdate:open': (open: boolean) => {
if (open) {
return
}
toast.update(t.id, {
'title': 'File uploaded!',
'description': 'Your file has been successfully uploaded.',
'icon': 'i-lucide-check',
'color': 'success',
'onUpdate:open': undefined
})
}
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
Con contenido HTML
Utilice la función de renderizado h() en los campos title o description para renderizar elementos HTML o componentes de Vue con un estilo personalizado.
<script setup lang="ts">
const toast = useToast()
function showToast() {
toast.add({
title: h('span', {}, [
'Item ',
h('span', { class: 'text-primary font-bold' }, '#15'),
' deleted'
]),
description: h('span', {}, [
'You have successfully deleted the item from your ',
h('span', { class: 'font-bold' }, 'account'),
'.'
]),
icon: 'i-lucide-trash-2'
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
<script setup lang="ts">
import { h } from 'vue'
const toast = useToast()
function showToast() {
toast.add({
title: h('span', {}, [
'Item ',
h('span', { class: 'text-primary font-bold' }, '#15'),
' deleted'
]),
description: h('span', {}, [
'You have successfully deleted the item from your ',
h('span', { class: 'font-bold' }, 'account'),
'.'
]),
icon: 'i-lucide-trash-2'
})
}
</script>
<template>
<UButton label="Show toast" color="neutral" variant="outline" @click="showToast" />
</template>
API (Edición española)
Props (Edición española)
| Prop | Default | Type |
|---|---|---|
as | 'li' | anyThe element or component this component should render as. |
title | string | VNode<RendererNode, RendererElement, { [key: string]: any; }> | (): VNode<RendererNode, RendererElement, { [key: string]: any; }> | |
description | string | VNode<RendererNode, RendererElement, { [key: string]: any; }> | (): VNode<RendererNode, RendererElement, { [key: string]: any; }> | |
icon | any | |
avatar | AvatarProps | |
color | 'primary' | "error" | "primary" | "secondary" | "success" | "info" | "warning" | "neutral" |
orientation | 'vertical' | "vertical" | "horizontal"The orientation between the content and the actions. |
close | true | boolean | Omit<ButtonProps, LinkPropsKeys> Display a close button to dismiss the toast.
|
closeIcon | appConfig.ui.icons.close | anyThe icon displayed in the close button. |
actions | ButtonProps[]Display a list of actions:
| |
duration | 5000 | numberThe time in milliseconds before the toast automatically closes. Overrides the global Set to |
progress | true | boolean | Pick<ProgressProps, "color" | "ui"> Display a progress bar showing the toast's remaining duration.
|
defaultOpen | boolean The open state of the dialog when it is initially rendered. Use when you do not need to control its open state. | |
open | boolean The controlled open state of the dialog. Can be bind as | |
type | "foreground" | "background"Control the sensitivity of the toast for accessibility purposes. For toasts that are the result of a user action, choose | |
ui | { root?: SlotClass; wrapper?: SlotClass; title?: SlotClass; description?: SlotClass; icon?: SlotClass; avatar?: SlotClass; avatarSize?: SlotClass; actions?: SlotClass; progress?: SlotClass; close?: SlotClass; } |
Slots
| Slot | Type |
|---|---|
leading | { ui: object; } |
title | {} |
description | {} |
actions | {} |
close | { ui: object; } |
Emisiones
| Event | Type |
|---|---|
pause | [] |
escapeKeyDown | [event: KeyboardEvent] |
resume | [] |
swipeStart | [event: SwipeEvent] |
swipeMove | [event: SwipeEvent] |
swipeCancel | [event: SwipeEvent] |
swipeEnd | [event: SwipeEvent] |
update:open | [value: boolean] |
Exposición
Al acceder al componente a través de una referencia de plantilla, puede utilizar lo siguiente:
| Nombre | Tipo |
|---|---|
heightx{lang="ts-type"} | Ref<number>x{lang="ts-type"} |
Temas
export default defineAppConfig({
ui: {
toast: {
slots: {
root: 'relative group overflow-hidden bg-default shadow-lg rounded-lg ring ring-default p-4 flex gap-2.5',
wrapper: 'w-0 flex-1 flex flex-col',
title: 'text-sm font-medium text-highlighted',
description: 'text-sm text-muted',
icon: 'shrink-0 size-5',
avatar: 'shrink-0',
avatarSize: '2xl',
actions: 'flex gap-1.5 shrink-0',
progress: 'absolute inset-x-0 bottom-0',
close: 'p-0'
},
variants: {
color: {
primary: {
root: 'outline-primary/25 focus-visible:outline-3 focus-visible:ring-primary',
icon: 'text-primary'
},
secondary: {
root: 'outline-secondary/25 focus-visible:outline-3 focus-visible:ring-secondary',
icon: 'text-secondary'
},
success: {
root: 'outline-success/25 focus-visible:outline-3 focus-visible:ring-success',
icon: 'text-success'
},
info: {
root: 'outline-info/25 focus-visible:outline-3 focus-visible:ring-info',
icon: 'text-info'
},
warning: {
root: 'outline-warning/25 focus-visible:outline-3 focus-visible:ring-warning',
icon: 'text-warning'
},
error: {
root: 'outline-error/25 focus-visible:outline-3 focus-visible:ring-error',
icon: 'text-error'
},
neutral: {
root: 'outline-inverted/25 focus-visible:outline-3 focus-visible:ring-inverted',
icon: 'text-highlighted'
}
},
orientation: {
horizontal: {
root: 'items-center',
actions: 'items-center'
},
vertical: {
root: 'items-start',
actions: 'items-start mt-2.5'
}
},
title: {
true: {
description: 'mt-1'
}
}
},
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: {
toast: {
slots: {
root: 'relative group overflow-hidden bg-default shadow-lg rounded-lg ring ring-default p-4 flex gap-2.5',
wrapper: 'w-0 flex-1 flex flex-col',
title: 'text-sm font-medium text-highlighted',
description: 'text-sm text-muted',
icon: 'shrink-0 size-5',
avatar: 'shrink-0',
avatarSize: '2xl',
actions: 'flex gap-1.5 shrink-0',
progress: 'absolute inset-x-0 bottom-0',
close: 'p-0'
},
variants: {
color: {
primary: {
root: 'outline-primary/25 focus-visible:outline-3 focus-visible:ring-primary',
icon: 'text-primary'
},
secondary: {
root: 'outline-secondary/25 focus-visible:outline-3 focus-visible:ring-secondary',
icon: 'text-secondary'
},
success: {
root: 'outline-success/25 focus-visible:outline-3 focus-visible:ring-success',
icon: 'text-success'
},
info: {
root: 'outline-info/25 focus-visible:outline-3 focus-visible:ring-info',
icon: 'text-info'
},
warning: {
root: 'outline-warning/25 focus-visible:outline-3 focus-visible:ring-warning',
icon: 'text-warning'
},
error: {
root: 'outline-error/25 focus-visible:outline-3 focus-visible:ring-error',
icon: 'text-error'
},
neutral: {
root: 'outline-inverted/25 focus-visible:outline-3 focus-visible:ring-inverted',
icon: 'text-highlighted'
}
},
orientation: {
horizontal: {
root: 'items-center',
actions: 'items-center'
},
vertical: {
root: 'items-start',
actions: 'items-start mt-2.5'
}
},
title: {
true: {
description: 'mt-1'
}
}
},
defaultVariants: {
color: 'primary'
}
}
}
})
]
})