Skip to content

Button

Displays a button or a component that looks like a button.

Source Code

import ilha from "ilha";
import { Plus } from "lucide";
import { Button, Icon } from "areia";

export default ilha.render(() => (
  <div class="flex flex-wrap items-center gap-2">
    <Button variant="secondary">Button</Button>
    <Button
      variant="secondary"
      shape="square"
      icon={<Icon icon={Plus} />}
      aria-label="Add"
    />
  </div>
));

Import

import { Button, ButtonGroup } from "areia";

Usage

import ilha from "ilha";
import { Button } from "areia";

export default ilha.render(() => (
  <Button variant="secondary">Click me</Button>
));

Examples

Variants

Primary

import ilha from "ilha";
import { Button } from "areia";

export default ilha.render(() => (
  <Button variant="primary">Primary</Button>
));

Secondary

import ilha from "ilha";
import { Button } from "areia";

export default ilha.render(() => (
  <Button variant="secondary">Secondary</Button>
));

Ghost

import ilha from "ilha";
import { Button } from "areia";

export default ilha.render(() => (
  <Button variant="ghost">Ghost</Button>
));

Destructive

import ilha from "ilha";
import { Button } from "areia";

export default ilha.render(() => (
  <Button variant="destructive">Destructive</Button>
));

Outline

import ilha from "ilha";
import { Button } from "areia";

export default ilha.render(() => (
  <Button variant="outline">Outline</Button>
));

Secondary Destructive

import ilha from "ilha";
import { Button } from "areia";

export default ilha.render(() => (
  <Button variant="secondary-destructive">
    Secondary Destructive
  </Button>
));

Sizes

import ilha from "ilha";
import { Button } from "areia";

export default ilha.render(() => (
  <div class="flex flex-wrap items-center gap-3">
    <Button size="xs" variant="secondary">
      Extra Small
    </Button>
    <Button size="sm" variant="secondary">
      Small
    </Button>
    <Button size="base" variant="secondary">
      Base
    </Button>
    <Button size="lg" variant="secondary">
      Large
    </Button>
  </div>
));

With Icon

import ilha from "ilha";
import { Plus } from "lucide";
import { Button, Icon } from "areia";

export default ilha.render(() => (
  <Button variant="secondary" icon={<Icon icon={Plus} />}>
    Create Ilha app
  </Button>
));

Icon Only

For icon-only buttons, use shape="square" or shape="circle" with the icon prop. Always include aria-label for accessibility — without visible text, screen readers need the label to convey the button’s purpose.

import ilha from "ilha";
import { Plus } from "lucide";
import { Button, Icon } from "areia";

export default ilha.render(() => (
  <div class="flex flex-wrap items-center gap-3">
    <Button
      variant="secondary"
      shape="square"
      icon={<Icon icon={Plus} />}
      aria-label="Add item"
    />
    <Button
      variant="secondary"
      shape="circle"
      icon={<Icon icon={Plus} />}
      aria-label="Add item"
    />
  </div>
));

Loading State

import ilha from "ilha";
import { Button } from "areia";

export default ilha.render(() => (
  <Button variant="primary" loading>
    Loading...
  </Button>
));

Disabled State

import ilha from "ilha";
import { Button } from "areia";

export default ilha.render(() => (
  <Button variant="secondary" disabled>
    Disabled
  </Button>
));

Title

Use the native title attribute when additional context helps the user understand the action.

import ilha from "ilha";
import { Plus } from "lucide";
import { Button, Icon } from "areia";

export default ilha.render(() => (
  <div class="flex flex-wrap items-center gap-3">
    <Button variant="secondary" title="Create a new Ilha app">
      Create Ilha app
    </Button>
    <Button
      variant="secondary"
      shape="square"
      icon={<Icon icon={Plus} />}
      aria-label="Add item"
      title="Add item"
    />
  </div>
));

Button Group

Use ButtonGroup to visually join related buttons or controls.

import ilha from "ilha";
import { Bold, Italic, Underline } from "lucide";
import { Button, ButtonGroup, Icon } from "areia";

export default ilha.render(() => (
  <ButtonGroup aria-label="Text formatting">
    <Button
      variant="outline"
      shape="square"
      icon={<Icon icon={Bold} />}
      aria-label="Bold"
    />
    <Button
      variant="outline"
      shape="square"
      icon={<Icon icon={Italic} />}
      aria-label="Italic"
    />
    <Button
      variant="outline"
      shape="square"
      icon={<Icon icon={Underline} />}
      aria-label="Underline"
    />
  </ButtonGroup>
));

Use orientation="vertical" for stacked groups, ButtonGroup.Text for text segments, and ButtonGroup.Separator to separate controls.

Page 1
import ilha from "ilha";
import { Button, ButtonGroup } from "areia";

export default ilha.render(() => (
  <ButtonGroup>
    <Button variant="outline">Back</Button>
    <ButtonGroup.Separator />
    <ButtonGroup.Text>Page 1</ButtonGroup.Text>
    <ButtonGroup.Separator />
    <Button variant="outline">Next</Button>
  </ButtonGroup>
));

Use LinkButton when the interaction should navigate somewhere but still look like a button. Use Button for in-place actions like submitting, opening, or toggling UI.

import ilha from "ilha";
import { ExternalLink } from "lucide";
import { LinkButton, Icon } from "areia";

export default ilha.render(() => (
  <div class="flex flex-wrap items-center gap-3">
    <LinkButton href="/components/link" variant="secondary">
      Read Link docs
    </LinkButton>
    <LinkButton
      href="https://ilha.build/"
      variant="ghost"
      icon={<Icon icon={ExternalLink} />}
      external
    >
      Ilha Docs
    </LinkButton>
  </div>
));

API Reference

PropTypeDefaultDescription
shape"base" | "square" | "circle""base"Controls the button shape.
size"xs" | "sm" | "base" | "lg""base"Controls button height, padding, gap, and text size.
variant"primary" | "secondary" | "ghost" | "destructive" | "secondary-destructive" | "outline""secondary"Controls the visual style.
childrenunknown-Content rendered inside the button.
classstring-Additional CSS classes merged with the generated classes.
classNamestring-Alias for class.
iconunknown-Markup rendered before the label.
loadingboolean-Shows a loading spinner and disables interaction.
titlestring-Native tooltip text.
disabledboolean-Disables the button.
namestring-Native button name attribute.
type"submit" | "reset" | "button""button"Native button type attribute.
valuestring | string[] | number-Native button value attribute.

ButtonGroup

PropTypeDefaultDescription
orientation"horizontal" | "vertical""horizontal"Layout direction for grouped items.
childrenunknown-Grouped controls.
classstring-Additional CSS classes.
classNamestring-Alias for class.

ButtonGroup.Text

Text segment for use inside ButtonGroup. Accepts standard div attributes plus children, class, and className.

ButtonGroup.Separator

Separator segment for use inside ButtonGroup.

PropTypeDefaultDescription
orientation"horizontal" | "vertical""vertical"Separator orientation.
classstring-Additional CSS classes.
classNamestring-Alias for class.