Documentation
Actions Button

Button

Versatile action triggers with multiple variants, sizes, and navigation support.

Interactive Demo

Playground

Variant
Size

All Variants

Sizes

With Icons

Disabled

The Button component provides a flexible, accessible button element with multiple visual variants and sizes. It supports navigation via Phoenix's navigate, patch, and href attributes.

Import

use PUI
# or
import PUI.Button

Basic Usage

<.button>Click me</.button>

Variants

Buttons come in several visual styles to communicate different levels of emphasis and intent.

Variant Usage
default Primary actions, main call-to-action
secondary Less prominent actions
destructive Dangerous or irreversible actions
outline Bordered buttons for subtle emphasis
ghost Minimal buttons for toolbars and inline actions
link Styled as links for inline navigation
<.button variant="default">Default</.button>
<.button variant="secondary">Secondary</.button>
<.button variant="destructive">Destructive</.button>
<.button variant="outline">Outline</.button>
<.button variant="ghost">Ghost</.button>
<.button variant="link">Link</.button>

Sizes

Control the button size using the size attribute.

<.button size="sm">Small</.button>
<.button size="default">Default</.button>
<.button size="lg">Large</.button>
<.button size="icon">🔔</.button>

Navigation

Buttons can act as navigation links using Phoenix's built-in attributes:

<!-- Client-side navigation (LiveView) -->
<.button navigate={~p"/dashboard"}>Go to Dashboard</.button>
<!-- Patch current LiveView -->
<.button patch={~p"/settings"}>Settings</.button>
<!-- Traditional link -->
<.button href="https://example.com">External Link</.button>

Disabled State

<.button disabled>Disabled</.button>
<.button variant="destructive" disabled>Can't Delete</.button>

With Icons

Combine buttons with icon components for rich visual cues:

<.button>
<.icon name="hero-plus" class="size-4 mr-2" /> Add Item
</.button>
<.button variant="destructive">
<.icon name="hero-trash" class="size-4 mr-2" /> Delete
</.button>
<.button size="icon" variant="ghost">
<.icon name="hero-cog-6-tooth" class="size-5" />
</.button>

Unstyled / Headless

Use variant="unstyled" to get a button with no default styles — perfect for building custom designs:

<.button variant="unstyled" class="my-custom-btn">
Fully Custom
</.button>

API Reference

Attributes

Name Type Default Description
variant string "default" Visual style: "default", "secondary", "destructive", "outline", "ghost", "link", "unstyled"
size string "default" Button size: "default", "sm", "lg", "icon"
class string "" Additional CSS classes
disabled boolean false Disables the button
navigate string LiveView client-side navigation path
patch string LiveView patch navigation path
href string Standard link href

Slots

Name Required Description
inner_block Button content (text, icons, etc.)