Skip to content

Commit abd2be1

Browse files
committedFeb 5, 2025
feat(Toast): handle vnodes in title and description
Resolves #3226
1 parent d94b304 commit abd2be1

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed
 

‎src/runtime/components/Toast.vue

+13-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import theme from '#build/ui/toast'
77
import { extendDevtoolsMeta } from '../composables/extendDevtoolsMeta'
88
import { tv } from '../utils/tv'
99
import type { AvatarProps, ButtonProps } from '../types'
10+
import type { StringOrVNode } from '../types/utils'
1011
1112
const appConfigToast = _appConfig as AppConfig & { ui: { toast: Partial<typeof theme> } }
1213
@@ -20,8 +21,8 @@ export interface ToastProps extends Pick<ToastRootProps, 'defaultOpen' | 'open'
2021
* @defaultValue 'li'
2122
*/
2223
as?: any
23-
title?: string
24-
description?: string
24+
title?: StringOrVNode
25+
description?: StringOrVNode
2526
icon?: string
2627
avatar?: AvatarProps
2728
color?: ToastVariants['color']
@@ -124,12 +125,20 @@ defineExpose({
124125
<div :class="ui.wrapper({ class: props.ui?.wrapper })">
125126
<ToastTitle v-if="title || !!slots.title" :class="ui.title({ class: props.ui?.title })">
126127
<slot name="title">
127-
{{ title }}
128+
<component :is="title()" v-if="typeof title === 'function'" />
129+
<component :is="title" v-else-if="typeof title === 'object'" />
130+
<template v-else>
131+
{{ title }}
132+
</template>
128133
</slot>
129134
</ToastTitle>
130135
<ToastDescription v-if="description || !!slots.description" :class="ui.description({ class: props.ui?.description })">
131136
<slot name="description">
132-
{{ description }}
137+
<component :is="description()" v-if="typeof description === 'function'" />
138+
<component :is="description" v-else-if="typeof description === 'object'" />
139+
<template v-else>
140+
{{ description }}
141+
</template>
133142
</slot>
134143
</ToastDescription>
135144

‎src/runtime/types/utils.ts

+5
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,8 @@ export type SelectItemKey<T> = T extends Record<string, any> ? keyof T : string
3333
export type SelectModelValueEmits<T, V, M extends boolean = false, DV = T> = {
3434
'update:modelValue': [payload: SelectModelValue<T, V, M, DV>]
3535
}
36+
37+
export type StringOrVNode =
38+
| string
39+
| VNode
40+
| (() => VNode)

0 commit comments

Comments
 (0)
Please sign in to comment.