@@ -3,6 +3,7 @@ import { useEffectEvent, useElementTransitionStatus, useEventListener, usePrevio
3
3
import type { PrimitiveProps } from "../../primitives" ;
4
4
import { PopperAriaContext } from "../../primitives/popper/popper-aria-context" ;
5
5
import { PopperDispatchContext } from "../../primitives/popper/popper-dispatch-context" ;
6
+ import { getPopperAnimationProps } from "../../primitives/popper/utils" ;
6
7
import { tx } from "../../utils" ;
7
8
import { Alert , type AlertProps } from "../alert/alert" ;
8
9
import { useToastComponent } from "./toast-context" ;
@@ -21,7 +22,16 @@ export type ToastRootProps = AlertProps & {
21
22
} ;
22
23
23
24
export const ToastRoot = ( props : PrimitiveProps < "div" , ToastRootProps , "role" | "id" > ) => {
24
- const { priority = "high" , onDismiss, color = "primary" , variant = "soft" , children, className, ...rest } = props ;
25
+ const {
26
+ priority = "high" ,
27
+ onDismiss,
28
+ color = "primary" ,
29
+ variant = "soft" ,
30
+ children,
31
+ className,
32
+ style,
33
+ ...rest
34
+ } = props ;
25
35
26
36
const { id, duration, placement, dismiss, update, remove } = useToastComponent ( ) ;
27
37
@@ -57,8 +67,6 @@ export const ToastRoot = (props: PrimitiveProps<"div", ToastRootProps, "role" |
57
67
useEventListener ( "blur" , clear ) ;
58
68
useEventListener ( "focus" , reset ) ;
59
69
60
- const translateStyle = placementTranslateStyles [ placement ?. split ( "-" ) [ 0 ] as keyof typeof placementTranslateStyles ] ;
61
-
62
70
if ( ! isMounted ) {
63
71
return null ;
64
72
}
@@ -71,19 +79,24 @@ export const ToastRoot = (props: PrimitiveProps<"div", ToastRootProps, "role" |
71
79
descriptionId,
72
80
} ;
73
81
82
+ const translateStyle = placementTranslateStyles [ placement ?. split ( "-" ) [ 0 ] as keyof typeof placementTranslateStyles ] ;
83
+
84
+ const animationProps = getPopperAnimationProps ( {
85
+ status,
86
+ duration : 300 ,
87
+ transitionClassName : "transition-[opacity,translate]" ,
88
+ defaultClassName : [ "opacity-0" , translateStyle . close ] ,
89
+ openClassName : [ "opacity-100" , translateStyle . open ] ,
90
+ } ) ;
91
+
74
92
return (
75
93
< div
76
94
role = "status"
77
95
aria-live = { priority == "high" ? "assertive" : "polite" }
78
96
aria-atomic = "true"
79
97
ref = { setElement }
80
- className = { tx (
81
- "flex flex-col items-center" ,
82
- "transition-[opacity,translate] duration-300" ,
83
- transitionEnable && status == "open" && [ "opacity-100" , translateStyle . open ] ,
84
- transitionEnable && status == "close" && [ "opacity-0" , translateStyle . close ] ,
85
- transitionEnable && status == "initial" && [ "opacity-0" , translateStyle . close ] ,
86
- ) }
98
+ style = { { ...style , ...animationProps . style , viewTransitionName : `${ id } ` } }
99
+ className = { tx ( "flex flex-col items-center" , transitionEnable && animationProps . className ) }
87
100
onFocus = { clear }
88
101
onBlur = { reset }
89
102
onMouseOver = { clear }
0 commit comments