Paper2Code / components /ui /shadcn /toggle.tsx
AUXteam's picture
Upload folder using huggingface_hub
d530f14 verified
import { motion } from "motion/react";
import { useState } from "react";
import { cn } from "@/utils/cn";
export default function Toggle({
checked,
onChange,
disabled,
}: {
checked: boolean;
onChange?: (checked: boolean) => void;
disabled?: boolean;
}) {
const [isHovering, setIsHovering] = useState(false);
return (
<button
className={cn(
"transition-all relative rounded-full group",
checked ? "bg-heat-100" : "bg-black-alpha-10",
)}
style={{
width: "50px",
height: "20px",
boxShadow: checked
? "0px 6px 12px 0px rgba(174, 37, 0, 0.12) inset, 0px 0.75px 0.75px 0px rgba(174, 37, 0, 0.06) inset, 0px 0.25px 0.25px 0px rgba(174, 37, 0, 0.06) inset"
: "0px 6px 12px 0px rgba(0, 0, 0, 0.02) inset, 0px 0.75px 0.75px 0px rgba(0, 0, 0, 0.02) inset, 0px 0.25px 0.25px 0px rgba(0, 0, 0, 0.04) inset",
}}
type="button"
onClick={() => onChange?.(!checked)}
onMouseEnter={() => setIsHovering(true)}
onMouseLeave={() => setIsHovering(false)}
disabled={disabled}
>
<div
className={cn(
"overlay bg-[#FA4500] transition-opacity",
checked
? "opacity-0 group-hover:opacity-100"
: "opacity-0 group-hover:opacity-0",
)}
style={{
background: "color(display-p3 0.9059 0.3294 0.0784)",
}}
/>
<motion.div
animate={{
x: checked ? 18 : 0,
}}
className="top-[2px] left-[2px] transition-[box-shadow] absolute rounded-full bg-accent-white"
initial={{
x: checked ? 18 : 0,
}}
style={{
width: "28px",
height: "16px",
boxShadow: (() => {
if (checked) {
if (isHovering) {
return "0px 6px 12px -3px rgba(174, 36, 0, 0.30), 0px 3px 6px -1px rgba(174, 37, 0, 0.12), 0px 1px 2px 0px rgba(174, 37, 0, 0.12), 0px 0.5px 0.5px 0px rgba(174, 37, 0, 0.24)";
}
return "0px 6px 12px -3px rgba(174, 36, 0, 0.30), 0px 3px 6px -1px rgba(174, 37, 0, 0.12), 0px 1px 2px 0px rgba(174, 37, 0, 0.12), 0px 0.5px 0.5px 0px rgba(174, 37, 0, 0.24)";
}
if (isHovering) {
return "0px 6px 12px -3px rgba(0, 0, 0, 0.06), 0px 3px 6px -1px rgba(0, 0, 0, 0.06), 0px 1px 2px 0px rgba(0, 0, 0, 0.04), 0px 0.5px 0.5px 0px rgba(0, 0, 0, 0.08)";
}
return "0px 6px 12px -3px rgba(0, 0, 0, 0.06), 0px 3px 6px -1px rgba(0, 0, 0, 0.06), 0px 1px 2px 0px rgba(0, 0, 0, 0.04), 0px 0.5px 0.5px 0px rgba(0, 0, 0, 0.08)";
})(),
}}
/>
</button>
);
}