Skip to Content

Button

Use Button to trigger primary and secondary actions.

Quick Preview

Interactive Playground

Update props directly, then copy generated code for your project.

Color

Generated code

Code
import { Button } from "@altech-ui/react";

export function Example() {
  return (
    <Button variant="primary" style={{ height: "44px", borderRadius: "14px", backgroundColor: "#ea8435" }}>Button</Button>
  );
}

Import

Code
import { Button } from "@altech-ui/react"

Variants

Code
<Button variant="default">Default</Button>
<Button variant="primary">Primary</Button>
<Button variant="secondary">Secondary</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="danger">Danger</Button>

Sizes

Code
<Button size="sm" variant="primary">Small</Button>
<Button size="md" variant="primary">Medium</Button>
<Button size="lg" variant="primary">Large</Button>

States

Code
<Button variant="primary">Normal</Button>
<Button variant="primary" loading>Saving</Button>
<Button variant="primary" disabled>Disabled</Button>

Grouped Controls

Code
<div className="inline-flex overflow-hidden rounded-xl border border-black/10">
  <Button variant="ghost" className="rounded-none border-r border-black/10">Day</Button>
  <Button variant="primary" className="rounded-none border-r border-black/10">Week</Button>
  <Button variant="ghost" className="rounded-none">Month</Button>
</div>

Action Row Pattern

Code
<div className="flex gap-3">
  <Button variant="ghost">Cancel</Button>
  <Button variant="secondary">Save Draft</Button>
  <Button variant="primary">Publish</Button>
</div>

Icon Only Buttons

Code
<Button variant="outline" aria-label="Download" size="icon">
  <DownloadIcon />
</Button>
<Button variant="ghost" aria-label="Settings" size="icon">
  <SettingsIcon />
</Button>

Icon + Label

Code
<Button variant="primary">
  <PlusIcon />
  Add item
</Button>
 
<Button variant="secondary">
  Export
  <DownloadIcon />
</Button>

Full Width CTA

Code
<Button variant="primary" fullWidth>Continue checkout</Button>
<Button variant="outline" fullWidth>Continue with Google</Button>

Async List Actions

Generate invoice #INV-01

Generate invoice #INV-02

Generate invoice #INV-03

Code
{items.map((item) => (
  <Button
    key={item.id}
    size="sm"
    variant="primary"
    loading={loadingId === item.id}
    onClick={() => handleGenerate(item.id)}
  >
    Generate
  </Button>
))}

Split Action

Code
<div className="inline-flex overflow-hidden rounded-xl border border-black/10">
  <Button variant="primary" className="rounded-none border-r border-black/10">Save</Button>
  <Button variant="primary" className="rounded-none px-3" aria-label="More actions">
    <ChevronDownIcon />
  </Button>
</div>

Async Submit Pattern

Code
"use client"
 
import { useState } from "react"
import { Button } from "@altech-ui/react"
 
export function SaveButton() {
  const [saving, setSaving] = useState(false)
 
  const handleSave = async () => {
    setSaving(true)
    try {
      await fetch("/api/save", { method: "POST" })
    } finally {
      setSaving(false)
    }
  }
 
  return (
    <Button variant="primary" loading={saving} onClick={handleSave}>
      Save changes
    </Button>
  )
}

Props

  • variant: default | primary | secondary | outline | ghost | danger
  • size: sm | md | lg | icon
  • loading?: boolean
  • loadingText?: string
  • fullWidth?: boolean
  • startIcon?: ReactNode
  • endIcon?: ReactNode
  • disabled?: boolean
  • className?: string
  • Native button props
Last updated on