Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[POC] unmountRef prop #1236

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft

[POC] unmountRef prop #1236

wants to merge 4 commits into from

Conversation

atomiks
Copy link
Contributor

@atomiks atomiks commented Dec 27, 2024

Closes #1160

Branched off #1222 (diff of only these changes)

JavaScript animations page. I focused on Motion fairly exclusively. The unmountRef is for when animating opacity doesn't work in other libraries for the most part, as opacity: 0.9999 is really the simplest solution.

Motion experiments

Adding the onAnimationComplete prop results in this warning when composing motion.div with Popup, which seems odd:

Screenshot 2024-12-27 at 3 22 17 pm

Remove keepMounted on portal child parts

Remove unused imports

Remove keepMounted prop in tests
@atomiks atomiks added the core Infrastructure work going on behind the scenes label Dec 27, 2024
@mui-bot
Copy link

mui-bot commented Dec 27, 2024

Netlify deploy preview

https://deploy-preview-1236--base-ui.netlify.app/

Generated by 🚫 dangerJS against 9a0860a


const onFinished = useEventCallback(onFinishedParam);
const runOnceAnimationsFinish = useAnimationsFinished(animatedElementRef);
const openRef = useLatestRef(open);

useEnhancedEffect(() => {
React.useEffect(() => {
Copy link
Contributor Author

@atomiks atomiks Dec 27, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Change to regular useEffect as the timing lets Motion know the exit animation styles have been applied inside a single requestAnimationFrame when checking for element.getAnimations() when keepMounted=true

});

React.useImperativeHandle(params.unmountRef, () => ({ unmount: handleUnmount }), [handleUnmount]);
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An API with a bunch of imperative methods could be useful in general, not just for this, so it could be named something more generic to future-proof it. This concept may be similar to using hooks, or component stores as in Ariakit. One difference is you can't "read" values in render, it's just for accessing internal methods/state inside event handlers & effects (since it's a ref).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
core Infrastructure work going on behind the scenes
Projects
None yet
Development

Successfully merging this pull request may close these issues.

JavaScript exit animations aren't properly supported
2 participants