Button

Clickable element that triggers an action.

import { Button } from "ui-lab-components";
 
export function Example() {
  return <Button>Click me</Button>;
}

Button Group

Joined view switcher using the Group compound component with active state.

"use client";
 
import { useState } from 'react'
import { Divider, Group } from 'ui-lab-components'
import { FaGrip, FaList, FaTable } from 'react-icons/fa6'
 
export const metadata = {
  title: 'Button Group',
  description: 'Joined view switcher using the Group compound component with active state.',
  access: 'free' as const,
};
 
export default function Example() {
  const [viewMode, setViewMode] = useState("list");
 
  return (
    <Group orientation="horizontal" spacing="xs">
      <Group.Button active={viewMode === "list"} onPress={() => setViewMode("list")}>
        <FaList className="mr-1.5 text-foreground-400" /> List
      </Group.Button>
      <Divider orientation="vertical" />
      <Group.Button active={viewMode === "grid"} onPress={() => setViewMode("grid")}>
        <FaGrip className="mr-1.5 text-foreground-400" /> Grid
      </Group.Button>
      <Divider orientation="vertical" />
      <Group.Button active={viewMode === "table"} onPress={() => setViewMode("table")}>
        <FaTable className="mr-1.5 text-foreground-400" /> Table
      </Group.Button>
    </Group>
  )
}
 

Icons

Left, right, and icon-only button patterns.

import { Button, Flex } from 'ui-lab-components'
import { FaArrowRight, FaDownload, FaEllipsisVertical, FaPlus } from 'react-icons/fa6'
 
export const metadata = {
  title: 'Icons',
  description: 'Left, right, and icon-only button patterns.',
  access: 'free' as const,
};
 
export default function Example() {
  return (
    <Flex gap="md" align="center" justify="center">
      <Button icon={<FaPlus />}>
        New Project
      </Button>
      <Button icon={{ right: <FaDownload /> }}>
        Download
      </Button>
      <Button variant="ghost" aria-label="More actions" icon={<FaEllipsisVertical />} />
    </Flex>
  )
}
 

Joined Toggle Buttons

Multiple buttons grouped together for view/mode selection with active state indication.

"use client";
 
import { useState } from 'react'
import { Button, Group, Divider, Flex } from 'ui-lab-components'
import { FaList, FaGrip, FaTable, FaPlus } from "react-icons/fa6";
 
export const metadata = {
  title: 'Joined Toggle Buttons',
  description: 'Multiple buttons grouped together for view/mode selection with active state indication.',
  access: 'free' as const,
};
 
export default function Example() {
  const [viewMode, setViewMode] = useState("list");
  return (
    <Flex styles="w-fit">
      <Group orientation="horizontal" value={viewMode} onChange={setViewMode}>
        <Group.Button size="icon" value="list"><FaList /></Group.Button>
        <Divider orientation="vertical" />
        <Group.Button size="icon" value="grid"><FaGrip /></Group.Button>
        <Divider orientation="vertical" />
        <Group.Button size="icon" value="table"><FaTable /></Group.Button>
      </Group>
      <Button size="sm" icon={{ left: <FaPlus size={12} /> }} >New</Button>
    </Flex>
  );
}
 

Split Button

Group + Select primitives for a classic split button with a primary action and a separate menu trigger.

Select an option
"use client";
 
import { useState } from 'react'
import { Button, Divider, Flex, Group, Select } from 'ui-lab-components'
import { FaChevronDown } from 'react-icons/fa6'
 
const splitActions = [
  { value: "publish", label: "Publish now" },
  { value: "schedule", label: "Schedule publish" },
  { value: "save", label: "Save draft" },
] as const;
 
export const metadata = {
  title: 'Split Button',
  description: 'Group + Select primitives for a classic split button with a primary action and a separate menu trigger.',
  access: 'free' as const,
};
 
export default function Example() {
  const [action, setAction] = useState<string | number | null>(splitActions[0].value);
  const selectedAction = splitActions.find((item) => item.value === action) ?? splitActions[0];
 
  return (
    <Flex direction="column" gap="sm" align="center">
      <Group orientation="horizontal">
        <Group.Select className="w-full" selectedKey={action} onSelectionChange={setAction}>
          <Select.Value>
            <Button variant="primary">{selectedAction.label}</Button>
          </Select.Value>
          <Divider />
          <Select.Trigger
            chevron={<FaChevronDown className="h-3.5 w-3.5" />}
            aria-label="Choose split action"
          />
          <Select.Content>
            <Select.List>
              {splitActions.map((item) => (
                <Select.Item key={item.value} value={item.value} textValue={item.label}>
                  {item.label}
                </Select.Item>
              ))}
            </Select.List>
          </Select.Content>
        </Group.Select>
      </Group>
    </Flex>
  )
}
 

Sub Stack Actions

A collection of buttons arranged horizontally for grouped actions and quick controls.

"use client";
 
import { useState } from 'react'
import { Button, Group, Flex } from 'ui-lab-components'
import { FaList, FaGrip, FaPlus } from "react-icons/fa6";
 
export const metadata = {
  title: 'Sub Stack Actions',
  description: 'A collection of buttons arranged horizontally for grouped actions and quick controls.',
  access: 'free' as const,
};
 
export default function Example() {
  const [viewMode, setViewMode] = useState("list");
  return (
    <Flex styles='w-fit' align="center" gap="xl">
      <Group orientation="horizontal" spacing="xs" value={viewMode} onChange={setViewMode}>
        <Group.Button size="icon" value="list"><FaList /></Group.Button>
        <Group.Button size="icon" value="grid"><FaGrip /></Group.Button>
      </Group>
      <Button size="sm" icon={{ right: <FaPlus size={12} /> }} >Upload</Button>
    </Flex>
  );
}
 
UI Lab