Viora LogoViora UI
Login

Button Group

Related actions joined into one unified surface with gliding highlights, sub-pixel accuracy, and optional overflow menus.

button-group.tsx
Loading source code...

Installation

npx viora-ui@latest add button-group
pnpm dlx viora-ui@latest add button-group
npx viora-ui@latest add button-group
bunx viora-ui@latest add button-group

Step 1: Install Dependencies

npm install @radix-ui/react-dropdown-menu motion lucide-react

Step 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

PropTypeDefaultDescription
itemsButtonGroupItem[]—Segment items in the group.
menuButtonGroupMenu—Optional trailing dropdown menu.
labelstring—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.
collapseLabelsbooleantrueDrops labels on container overflow.
disabledbooleanfalseDisables entire group.

Built by Otis

Last updated: 10/12/2026