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 {
brand: string;
subscribeStatus: boolean;
buttonTextColor?: string;
initialText: React.ReactElement | string;
changeText: React.ReactElement | string;
}
export const AnimatedSubscribeButton: React.FC<
AnimatedSubscribeButtonProps
> = ({ brand, 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 bg-white p-[10px]"
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: brand }}
>
{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: brand, 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 |
---|---|---|
brand | string | The accent color for the button. This allows you to set a custom color that matches your brand's theme. |
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. |
buttonTextColor | string | The color of the button text. This allows you to ensure the text is visible and matches your desired color scheme. |
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