Introduction to Design Systems

Animating our modal exercise

First install react-spring

npm i react-spring

Let's first create the state we'll need to show and hide the modal.

Inside index.js let's create new state called showModal. Then let's add a button underneath the theme switcher buttons which will toggle the visibility of our modal. You can add this underneath the theme switcher buttons.

const [showModal, setShowModal] = useState(false);

...

<button
  style={{ margin: "0 16px 24px", padding: "8px", background: "none" }}
  onClick={() => setShowModal(true)}
>
  Show modal
</button>

Lastly, let's pass showModal and setShowModal as properties to our SignUpModal component.

<SignUpModal showModal={showModal} setShowModal={setShowModal} />

Inside Modals.js we can now destructure showModal and setShowModal from props.

export const SignUpModal = ({ showModal, setShowModal }) => {

We'll use react-spring to show and hide our modal.

Import animated and useSpring from react-spring.

import { useSpring, animated } from "react-spring";

Now let's define our animation. We can use the hook state showModal to determine the styling of our modal.

const animation = useSpring({
  opacity: showModal ? 1 : 0,
  transform: showModal ? `translateY(0)` : `translateY(-200%)`
});

Lastly, let's wrap WrapperModal in an animated.div element and pass our animation as the style prop.

<animated.div style={animation}>
  <ModalWrapper>
    <SignUp />
    <SignUpHeader>Sign Up</SignUpHeader>
    <SignUpText>
      Sign up today to get access to all of our content and features!
    </SignUpText>
    <PrimaryButton onClick={() => console.log("You signed up!")}>
      Sign Up
    </PrimaryButton>
    <CloseModalButton onClick={() => setShowModal(false)}>
      <CloseIcon />
    </CloseModalButton>
  </ModalWrapper>
</animated.div>

react-spring comes with a config which can be used to change the mass and tension of our components. Let's test it out.

Import config from react-spring.

import { useSpring, animated, config } from "react-spring";

Now we can add it as property in the useSpring definition. We'll use the slow configuration.

const animation = useSpring({
  opacity: showModal ? 1 : 0,
  transform: showModal ? `translateY(0)` : `translateY(-200%)`,
  config: config.slow
});

If we go back to the UI and click 'Show modal' we should see our modal animating in. This is a bit slow for my liking so I'll remove it but config provides some nice configurations for your animations.

Now, go ahead add the anmimation to your other modal.