diff --git a/.changeset/breezy-bees-worry.md b/.changeset/breezy-bees-worry.md new file mode 100644 index 000000000..d6031b043 --- /dev/null +++ b/.changeset/breezy-bees-worry.md @@ -0,0 +1,5 @@ +--- +"@suid/material": patch +--- + +Ensure exit transition runs by delaying modal unmount. diff --git a/packages/material/src/Dialog/Dialog.tsx b/packages/material/src/Dialog/Dialog.tsx index 5b5864e74..6506120a2 100644 --- a/packages/material/src/Dialog/Dialog.tsx +++ b/packages/material/src/Dialog/Dialog.tsx @@ -6,8 +6,7 @@ import Paper from "../Paper"; import styled from "../styles/styled"; import useTheme from "../styles/useTheme"; import DialogContext from "./DialogContext"; -import { getDialogUtilityClass } from "./dialogClasses"; -import dialogClasses from "./dialogClasses"; +import dialogClasses, { getDialogUtilityClass } from "./dialogClasses"; import createComponentFactory from "@suid/base/createComponentFactory"; import { Breakpoint } from "@suid/system"; import createRef from "@suid/system/createRef"; @@ -15,7 +14,7 @@ import { EventParam, PropsOf } from "@suid/types"; import { createUniqueId } from "@suid/utils"; import capitalize from "@suid/utils/capitalize"; import clsx from "clsx"; -import { splitProps, mergeProps } from "solid-js"; +import { createEffect, createSignal, mergeProps, splitProps } from "solid-js"; type OwnerState = PropsOf; @@ -281,6 +280,19 @@ const Dialog = $.defineComponent(function Dialog(inProps) { }, }; + const [rootOpen, setRootOpen] = createSignal(props.open); + + const handleExited = () => { + if (props.TransitionProps?.onExited) { + props.TransitionProps?.onExited(); + } + setRootOpen(false); + }; + + createEffect(() => { + if (props.open) setRootOpen(true); + }); + return ( ()({ name: "MuiMenu", @@ -107,7 +106,7 @@ const Menu = $.defineComponent(function Menu(inProps) { const [, TransitionProps] = splitProps( mergeProps(() => props.TransitionProps || {}), - ["onEntering"] + ["onEntering", "onExited"] ); const theme = useTheme(); @@ -136,6 +135,12 @@ const Menu = $.defineComponent(function Menu(inProps) { } }; + const handleExited = () => { + if (props.TransitionProps?.onExited) { + props.TransitionProps?.onExited(); + } + }; + const handleListKeyDown = (event: KeyboardEvent) => { if (event.key === "Tab") { event.preventDefault(); @@ -191,7 +196,7 @@ const Menu = $.defineComponent(function Menu(inProps) { ); const transitionProps = mergeProps( - { onEntering: handleEntering }, + { onEntering: handleEntering, onExited: handleExited }, TransitionProps ); diff --git a/packages/material/src/Popover/Popover.tsx b/packages/material/src/Popover/Popover.tsx index 02264e76a..ab0a3870e 100644 --- a/packages/material/src/Popover/Popover.tsx +++ b/packages/material/src/Popover/Popover.tsx @@ -11,7 +11,14 @@ import debounce from "@suid/utils/debounce"; import ownerDocument from "@suid/utils/ownerDocument"; import ownerWindow from "@suid/utils/ownerWindow"; import clsx from "clsx"; -import { createEffect, on, splitProps, mergeProps, onCleanup } from "solid-js"; +import { + createEffect, + createSignal, + mergeProps, + on, + onCleanup, + splitProps, +} from "solid-js"; const $ = createComponentFactory()({ name: "MuiPopover", @@ -156,7 +163,7 @@ const Popover = $.defineComponent(function Popover(inProps) { const [, TransitionProps] = splitProps( mergeProps(() => props.TransitionProps || {}), - ["onEntering"] + ["onEntering", "onExited"] ); const paperRef = createRef(() => baseProps.PaperProps.ref); const ownerState = mergeProps(props, { @@ -359,8 +366,18 @@ const Popover = $.defineComponent(function Popover(inProps) { setPositioningStyles(); }; + const [rootOpen, setRootOpen] = createSignal(props.open); + + const handleExited = () => { + if (props.TransitionProps?.onExited) { + props.TransitionProps?.onExited(); + } + setRootOpen(false); + }; + createEffect(() => { if (props.open) { + setRootOpen(true); setPositioningStyles(); } }); @@ -440,7 +457,7 @@ const Popover = $.defineComponent(function Popover(inProps) { BackdropProps={{ invisible: true }} class={clsx(classes.root, props.class)} container={container()} - open={props.open} + open={rootOpen()} ownerState={ownerState} {...other} > @@ -448,6 +465,7 @@ const Popover = $.defineComponent(function Popover(inProps) { appear in={props.open} onEntering={handleEntering} + onExited={handleExited} timeout={transitionDuration()} {...TransitionProps} >