Button Group
Related actions joined into one unified surface with gliding highlights, sub-pixel accuracy, and optional overflow menus.
Installation
npx viora-ui@latest add button-grouppnpm dlx viora-ui@latest add button-groupnpx viora-ui@latest add button-groupbunx viora-ui@latest add button-groupStep 1: Install Dependencies
npm install @radix-ui/react-dropdown-menu motion lucide-reactStep 2: Copy the Source Code
Copy button-group.tsx into your @/components/arc/button-group/ directory.
Usage
import { useState } from "react";
import { Archive, Check, CopyPlus, Link, Pin, Trash2 } from "lucide-react";
import { ButtonGroup } from "@/components/arc/button-group/button-group";
export function DocumentActions({ doc }: { doc: { id: string; url: string } }) {
const [copied, setCopied] = useState(false);
return (
<ButtonGroup
label="Document actions"
items={[
{
id: "share",
label: copied ? "Copied" : "Share",
reserve: ["Share", "Copied"],
icon: copied ? <Check /> : <Link />,
onSelect: async () => {
await navigator.clipboard.writeText(doc.url);
setCopied(true);
setTimeout(() => setCopied(false), 1800);
},
},
{ id: "duplicate", label: "Duplicate", icon: <CopyPlus />, onSelect: () => duplicate(doc.id) },
{ id: "archive", label: "Archive", icon: <Archive />, onSelect: () => archive(doc.id) },
]}
menu={{
label: "More actions",
items: [
{ id: "pin", label: "Pin to sidebar", icon: <Pin />, onSelect: () => pin(doc.id) },
{ id: "delete", label: "Delete", icon: <Trash2 />, destructive: true, onSelect: () => remove(doc.id) },
],
}}
/>
);
}Props
| Prop | Type | Default | Description |
|---|---|---|---|
items | ButtonGroupItem[] | — | Segment items in the group. |
menu | ButtonGroupMenu | — | Optional trailing dropdown menu. |
label | string | — | Accessible group aria-label. |
variant | "outline" | "solid" | "outline" | Visual style of container. |
size | "sm" | "md" | "md" | Size of segments. |
orientation | "horizontal" | "vertical" | "horizontal" | Group layout direction. |
collapseLabels | boolean | true | Drops labels on container overflow. |
disabled | boolean | false | Disables entire group. |
Built by Otis
Last updated: 10/12/2026