Skip to main content

Overview

Komponen Button adalah elemen interaktif utama dalam A-raf Design System. Dapat merender sebagai <button> maupun <a> tag secara otomatis tergantung apakah prop href diberikan.

Installation

npm install @araf-ds/core

Usage

import { Button } from "@araf-ds/core"

export default function Example() {
  return <Button>Click me</Button>
}

Variants

Button memiliki 7 hierarki visual yang mencerminkan tingkat penekanan aksi.

Primary

Digunakan untuk aksi utama dan paling penting dalam sebuah halaman. Gunakan secara sparingly — maksimal satu per view.
<Button color="primary">Save changes</Button>
<Button color="primary" isDisabled>Disabled</Button>

Kapan dipakai

  • Konfirmasi form utama
  • CTA halaman
  • Aksi tidak dapat dibatalkan

Kapan tidak dipakai

  • Lebih dari satu aksi penting dalam satu area
  • Aksi sekunder atau tersier

Secondary

Dua varian: secondary dengan background biru muda dan secondary-gray dengan border abu-abu. Digunakan berdampingan dengan Primary untuk aksi alternatif.
<Button color="secondary">Secondary</Button>
<Button color="secondary-gray">Secondary Gray</Button>

Tertiary

Tombol tanpa border, terlihat seperti teks biasa namun tetap memiliki area interaktif. Cocok untuk aksi tersier yang tidak perlu menonjol.
<Button color="tertiary">Tertiary</Button>
<Button color="tertiary-gray">Tertiary Gray</Button>
Tampil sepenuhnya seperti hyperlink. Tersedia dalam dua warna: link-color dan link-gray.
<Button color="link-color">View profile</Button>
<Button color="link-gray">Terms of service</Button>
Gunakan prop href agar button ini sekaligus berfungsi sebagai anchor tag untuk navigasi.

Destructive

Varian merah untuk aksi berbahaya atau permanen. Tersedia untuk semua hierarki.
<Button color="primary-destructive">Delete account</Button>
<Button color="secondary-destructive">Remove</Button>
<Button color="tertiary-destructive">Discard changes</Button>
Selalu tambahkan dialog konfirmasi sebelum menjalankan aksi destructive.

Sizes

Tersedia 5 ukuran untuk menyesuaikan konteks tampilan.
SizePropHeightUse case
Smallsm36pxTabel, toolbar padat
Mediummd40pxDefault — form, card, dialog
Largelg44pxHero section, landing page
Extra Largexl48pxMarketing page
2X Large2xl56pxFull-width CTA, splash screen
<Button size="sm">Small</Button>
<Button size="md">Medium</Button>
<Button size="lg">Large</Button>
<Button size="xl">Extra Large</Button>
<Button size="2xl">2X Large</Button>
Gunakan ukuran yang konsisten dalam satu konteks UI. Jangan campurkan sm dan xl dalam satu toolbar.

States

StatePropKeterangan
DefaultTampilan normal
HoverBg menjadi #045CA0, dikelola otomatis
FocusedRing 4px #CDE4F5 untuk keyboard navigation
DisabledisDisabledOpacity 0.4, cursor not-allowed
LoadingisLoadingSpinner menyesuaikan ukuran dan warna
<Button>Default</Button>
<Button isDisabled>Disabled</Button>
<Button isLoading>Loading</Button>
<Button isLoading showTextWhileLoading>Saving changes</Button>
Hindari menyembunyikan tombol saat tidak tersedia. Gunakan isDisabled agar pengguna tetap tahu aksi tersebut ada.

Icons

Button mendukung icon di posisi kiri, kanan, maupun mode icon-only.
import { Button } from "@araf-ds/core"
import { PlusIcon, ArrowRightIcon } from "@araf-ds/core/icons"

// Icon kiri
<Button iconLeading={PlusIcon}>New item</Button>

// Icon kanan
<Button iconTrailing={ArrowRightIcon}>Continue</Button>

// Icon only — wajib aria-label
<Button iconLeading={PlusIcon} aria-label="Add new item" />
Untuk mode icon-only, selalu tambahkan prop aria-label agar screen reader dapat mengidentifikasi aksi tombol.

Button merender sebagai <a> tag cukup dengan menambahkan prop href.
// Internal navigation
<Button href="/dashboard">Go to dashboard</Button>

// External link
<Button href="https://example.com" target="_blank" rel="noopener noreferrer">
  Open docs
</Button>

API Reference

color
string
default:"primary"
Hierarki visual button. Nilai yang tersedia: primary · secondary · secondary-gray · tertiary · tertiary-gray · link-color · link-gray · primary-destructive · secondary-destructive · tertiary-destructive · link-destructive
size
string
default:"md"
Ukuran button. Nilai yang tersedia: sm · md · lg · xl · 2xl
isDisabled
boolean
default:"false"
Menonaktifkan interaksi dan mengubah tampilan menjadi state disabled.
isLoading
boolean
default:"false"
Menampilkan spinner loading dan mencegah interaksi.
showTextWhileLoading
boolean
default:"false"
Jika true, teks children tetap ditampilkan saat isLoading aktif.
iconLeading
ComponentType
Komponen icon di sebelah kiri teks. Tanpa children, button menjadi mode icon-only.
iconTrailing
ComponentType
Komponen icon di sebelah kanan teks.
href
string
Jika diberikan, button merender sebagai elemen <a> (anchor tag).
className
string
Class Tailwind tambahan untuk kustomisasi.

Accessibility

  • Menggunakan elemen semantik <button> secara default
  • State disabled ditangani dengan atribut disabled native
  • Fokus keyboard ditampilkan dengan ring outline 4px #CDE4F5
  • Mode icon-only wajib menggunakan aria-label
  • Saat dirender sebagai link (href), anchor semantics berlaku penuh

Do’s & Don’ts

Do

  • Gunakan Primary untuk satu aksi utama per halaman
  • Pasangkan Primary + Secondary untuk aksi confirm/cancel
  • Selalu tambahkan aria-label pada icon-only button
  • Gunakan variant Destructive untuk aksi yang tidak dapat dibatalkan

Don't

  • Jangan gunakan lebih dari satu Primary button dalam satu section
  • Jangan gunakan warna custom di luar sistem untuk button
  • Jangan sembunyikan button yang disabled — gunakan prop isDisabled
  • Jangan gunakan Link variant untuk aksi yang mengubah data