Installation
Copy and paste the following code into your project.
components/magicui/animated-subscribe-button.tsx
"use client";
import { AnimatePresence, motion } from "framer-motion";
import React, { useState } from "react";
interface AnimatedSubscribeButtonProps {
buttonColor: string;
buttonTextColor?: string;
subscribeStatus: boolean;
initialText: React.ReactElement | string;
changeText: React.ReactElement | string;
}
export const AnimatedSubscribeButton: React.FC<
AnimatedSubscribeButtonProps
> = ({
buttonColor,
subscribeStatus,
buttonTextColor,
changeText,
initialText,
}) => {
const [isSubscribed, setIsSubscribed] = useState<boolean>(subscribeStatus);
return (
<AnimatePresence mode="wait">
{isSubscribed ? (
<motion.button
className="relative flex w-[200px] items-center justify-center overflow-hidden rounded-md bg-white p-[10px] outline outline-1 outline-black"
onClick={() => setIsSubscribed(false)}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
>
<motion.span
key="action"
className="relative block h-full w-full font-semibold"
initial={{ y: -50 }}
animate={{ y: 0 }}
style={{ color: buttonColor }}
>
{changeText}
</motion.span>
</motion.button>
) : (
<motion.button
className="relative flex w-[200px] cursor-pointer items-center justify-center rounded-md border-none p-[10px]"
style={{ backgroundColor: buttonColor, color: buttonTextColor }}
onClick={() => setIsSubscribed(true)}
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
>
<motion.span
key="reaction"
className="relative block font-semibold"
initial={{ x: 0 }}
exit={{ x: 50, transition: { duration: 0.1 } }}
>
{initialText}
</motion.span>
</motion.button>
)}
</AnimatePresence>
);
};
Props
Prop | Type | Description |
---|---|---|
buttonColor | string | The accent color for the button. This allows you to set a custom color that matches your brand's theme. |
buttonTextColor | string | The color of the button text. This allows you to ensure the text is visible and matches your desired color scheme. |
subscribeStatus | boolean | A boolean flag to check the condition for the button. This property can be used to toggle the button's state, such as subscribed or unsubscribed. |
initialText | string | The initial text displayed on the button. This is useful for setting a default label when the button first appears. |
changeText | string | The final text displayed on the button after an action has been taken. This can be used to indicate a state change, such as from "Subscribe" to "Subscribed". |
Credits
- Credit to @dipesh