Floating Button
Floating Button é um componente de botão para React e Tailwind CSS, da biblioteca Bund UI, com licença MIT. Copia e cola no teu projeto.
Bund UI
MIT
buttons
O que é
Floating Button é um componente de botão para React e Tailwind CSS, da biblioteca Bund UI, com licença MIT. Copia e cola no teu projeto.
Como usar
Abre o componente no catálogo, carrega em copiar, e cola no teu projeto. O prompt copiado leva o código e as regras para o teu agente o reproduzir sem alterar nada.
Cinco cópias grátis por mês. Sem cartão.
Precisa de
npm i motion usehooks-ts lucide-react
Licença
Este componente vem de Bund UI e é redistribuído sob a licença MIT, que permite uso comercial. O aviso de copyright viaja com o código.
Floating Button
"use client";
import React, { ReactNode } from "react";
import { AnimatePresence, motion } from "motion/react";
import { useOnClickOutside } from "usehooks-ts";
type FloatingButtonProps = {
className?: string;
children: ReactNode;
triggerContent: ReactNode;
};
type FloatingButtonItemProps = {
children: ReactNode;
};
const list = {
visible: {
opacity: 1,
transition: {
staggerChildren: 0.1,
staggerDirection: -1
}
},
hidden: {
opacity: 0,
transition: {
when: "afterChildren",
staggerChildren: 0.1
}
}
};
const item = {
visible: { opacity: 1, y: 0 },
hidden: { opacity: 0, y: 5 }
};
const btn = {
visible: { rotate: "45deg" },
hidden: { rotate: 0 }
};
function FloatingButton({ children, triggerContent }: FloatingButtonProps) {
const ref = React.useRef<HTMLDivElement | null>(null);
const [isOpen, setIsOpen] = React.useState(false);
useOnClickOutside(ref as React.RefObject<HTMLDivElement>, () => setIsOpen(false));
return (
<div className="relative flex flex-col items-center">
<AnimatePresence>
<motion.ul
key="list"
className="absolute bottom-14 flex flex-col items-center gap-2"
initial="hidden"
animate={isOpen ? "visible" : "hidden"}
variants={list}>
{children}
</motion.ul>
<motion.div
key="button"
variants={btn}
animate={isOpen ? "visible" : "hidden"}
ref={ref}
onClick={() => setIsOpen(!isOpen)}
className="cursor-pointer">
{triggerContent}
</motion.div>
</AnimatePresence>
</div>
);
}
function FloatingButtonItem({ children }: FloatingButtonItemProps) {
return <motion.li variants={item}>{children}</motion.li>;
}
export { FloatingButton, FloatingButtonItem };
import { cn } from "@/lib/utils";
import { DribbbleIcon, FacebookIcon, LinkedinIcon, PlusIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import { FloatingButton, FloatingButtonItem } from "./floating-button";
export default function FloatingButtonExample() {
const items = [
{
id: "facebook",
icon: <FacebookIcon />,
bgColor: "bg-[#1877f2]"
},
{
id: "dribbble",
icon: <DribbbleIcon />,
bgColor: "bg-[#ea4c89]"
},
{
id: "linkedin",
icon: <LinkedinIcon />,
bgColor: "bg-[#0a66c2]"
}
];
return (
<FloatingButton
triggerContent={
<Button size="icon" className="size-12 rounded-full">
<PlusIcon className="size-5" />
</Button>
}>
{items.map((item) => (
<FloatingButtonItem key={item.id}>
<Button size="icon" className={cn("size-12 rounded-full", item.bgColor)}>
{item.icon}
</Button>
</FloatingButtonItem>
))}
</FloatingButton>
);
}