Strike
Strike check card animation
Post on Linkedin
Installation
Run the following command
It will create a new file strike.tsx
inside the components/cards/strike.tsx
directory.
mkdir -p components/cards && touch components/cards/strike.tsx && components/cards/check-box.tsx
Paste the code
Open the newly created check-box file and paste the following code:
import React, { Dispatch, SetStateAction, useState } from "react";
import { motion } from "framer-motion";
interface CheckboxProps {
isChecked: boolean;
setIsChecked: Dispatch<SetStateAction<boolean>>;
}
const Checkbox: React.FC<CheckboxProps> = ({ isChecked, setIsChecked }) => {
const checkboxVariants = {
checked: {
backgroundColor: "black",
borderColor: "black",
transition: {
duration: 0.5,
},
},
unchecked: {
backgroundColor: "#ccc",
borderColor: "#ccc",
transition: {
duration: 0.5,
},
},
};
const checkmarkVariants = {
checked: {
pathLength: 1,
opacity: 1,
transition: {
duration: 0.5,
},
},
unchecked: {
pathLength: 0,
opacity: 0,
transition: {
duration: 0.5,
},
},
};
const spring = {};
return (
<motion.div
className="w-6 h-6 border-2 rounded-md flex items-center justify-center cursor-pointer"
variants={checkboxVariants}
animate={isChecked ? "checked" : "unchecked"}
onClick={() => setIsChecked(!isChecked)}
whileTap={{
scale: 0.8,
}}
>
<svg width="12" height="10" viewBox="0 0 12 10" className="stroke-white">
<motion.path
fill="none"
strokeWidth="2"
stroke="white"
d="M1 5.5L4 8.5L11 1.5"
variants={checkmarkVariants}
initial="unchecked"
transition={spring}
animate={isChecked ? "checked" : "unchecked"}
/>
</svg>
</motion.div>
);
};
export default Checkbox;
Paste the code
Open the newly created file and paste the following code:
"use client";
import React, { useState } from "react";
import { AnimatePresence, motion } from "framer-motion";
import Checkbox from "@/components/hand-crafted/check-box";
const CheckCard = () => {
const [checked, setChecked] = useState(false);
const variants = {
initial: {
width: 0,
height: 2,
x: -100,
transition: {
duration: 0.5,
},
},
animate: {
width: "100%",
height: 2,
x: 0,
transition: {
duration: 0.5,
},
},
exit: {
width: 0,
height: 0,
x: -100,
transition: {
duration: 0.5,
},
},
};
return (
<div className="h-full center w-full">
<motion.div className="bg-muted w-60 items-center rounded-lg flex p-5 ">
<Checkbox isChecked={checked} setIsChecked={setChecked} />
<div className="px-5 overflow-hidden">
<div className="relative">
<span className="cursor-pointer" onClick={()=>setChecked(!checked)}>Post on Linkedin</span>
<AnimatePresence>
{checked && (
<motion.span
variants={variants}
initial="initial"
animate="animate"
exit="exit"
className="absolute left-0 bg-white w-full top-0 bottom-0 my-auto rounded-full pointer-events-none
"
/>
)}
</AnimatePresence>
</div>
</div>
</motion.div>
</div>
);
};
export default CheckCard;
Credits
Built by Bossadi Zenith