Button Component
Aksi utama user. Selalu gunakan button untuk tindakan yang mengubah state atau navigasi. Maksimum 1 Primary button per layar.
✓ Do
- Maks 1 Primary button per screen
- Label selalu Verb + Object: "Bayar Iuran Rp 25.000"
- Primary selalu paling bawah di form
- Gunakan Full Width untuk form/payment screen
- Loading state saat proses — jangan disable saja
✕ Don't
- 2 Primary dalam satu screen
- Label vague: "OK", "Submit", "Klik"
- Disabled tanpa penjelasan kenapa
- Warna custom di luar 8 variant yang didefinisikan
- Primary button di tengah konten (hanya di bottom)
FAB & Icon Button
FAB Sedekah amber selalu hadir di semua halaman utama. Icon button 36px untuk aksi sekunder di AppBar. Tidak boleh diganti fungsinya.
✓ Do
- FAB selalu amber — tidak pernah diganti warna
- FAB selalu untuk aksi Sedekah — tidak boleh ganti fungsi
- Extended FAB untuk konteks onboarding awal
- Touch area icon button minimal 44×44px
✕ Don't
- Mengubah warna FAB
- Menggunakan FAB untuk aksi selain Sedekah
- Icon button tanpa 44px touch target (GestureDetector)
- Lebih dari satu FAB di satu halaman
Slide to Confirm
Konfirmasi aksi financial atau penting yang tidak bisa di-undo. Mencegah accidental tap. Dipakai di: Sedekah Subuh, Kurban pembayaran, Iuran.
✓ Do
- Gunakan untuk aksi financial yang tidak bisa di-undo
- Haptic feedback saat confirmed
- Kembali ke idle jika user lepas sebelum 80% slider
✕ Don't
- Gunakan untuk aksi non-finansial biasa
- Tanpa haptic feedback
- Konfirm di bawah 50% drag
Top App Bar
Header setiap layar. 3 varian: Standard (navigasi), Search (dengan input), Large (homepage). Selalu ada Back button kecuali root screen.
✓ Do
- Title selalu center
- Back button di kiri SEMUA layar non-root
- Max 2 icon action di kanan
- surfaceTintColor: transparent di Flutter
✕ Don't
- Title terlalu panjang (max 20 char)
- Lebih dari 2 action di kanan
- Hilangkan back button kecuali root screen
- Warna AppBar berbeda dari --paper-0
Chip · Tab & Filter
Text Field
Semua input form. 6 state wajib. Error message harus human-readable, bukan kode error.
✓ Do
- Label selalu terlihat (tidak menghilang saat ada value)
- Error state: teks + border merah (tidak hanya warna)
- Helper text menjelaskan format yang benar
- Min height 44px untuk touch target
✕ Don't
- Placeholder menggantikan label
- Error hanya border merah tanpa pesan
- "Input tidak valid" tanpa konteks
- Label menghilang saat diisi
Toggle · Checkbox & Radio
Toast & Snackbar
Feedback singkat 3 detik. Floating style. Maks 1 sekaligus. Selalu ada pesan + next step.
✓ Do
- Title: apa yang berhasil/gagal (konkret)
- Desc: langkah selanjutnya atau konteks tambahan
- Success: faktual — "Iuran Mei selesai. KTAM aktif s/d Juni."
- Error: apa + solusi — "VA gagal. Coba QRIS."
✕ Don't
- "Berhasil!" tanpa konteks
- "Error 500" atau kode teknis
- "Terjadi kesalahan" tanpa solusi
- Emoji berlebihan 🎉🎉
Empty State
Selalu tampilkan ketika list/data kosong. Bukan blank. Selalu ada icon + title + desc + CTA.
Skeleton Loader
Tampilkan saat data loading. Bentuknya harus mirip layout akhir. Animasi shimmer 1.5 detik.
Card Variants
6 variant card untuk konteks berbeda. Standard untuk konten biasa, Accent untuk highlighted info, Elevated untuk konten yang perlu menonjol.
| Variant | Gunakan untuk | Contoh screen |
|---|---|---|
| Standard | Konten biasa, list item, setting row | List berita, setting Notif |
| Elevated | Featured card, hero card | Homepage hero, donation featured |
| Blue Accent | Info aktif, NOW zone, current state | Waktu salat berikutnya |
| Amber Accent | Habit/Sedekah, warm CTA, alert ringan | Bridge B, Sedekah reminder |
| Gold Accent | Authority, trust badge, kuitansi | LazisMu badge, Pesan Hari Ini |
Avatar & Badge
Progress & Timeline
Verification Badge
Trust component paling penting. WAJIB tampil di semua donation campaign, event, dan organization card.
e-KTAM Card
Kartu kader digital 3 state. State ditentukan oleh status iuran dan verifikasi NBM. Aktif hanya jika iuran bulan berjalan lunas.
Donation Card
Card campaign donasi. Selalu tampilkan: foto nyata, nama organisasi + verification badge, progress bar, jumlah donatur.
Pesan Hari Ini
Card khusus homepage. Selalu di zone paling atas. Konten dari API /home/daily-message. Font Newsreader Italic untuk kutipan.
Impact Card
Ditampilkan post-donation. Menunjukkan dampak nyata. Foto + angka + lokasi. Anti "lubang hitam donasi".
Audit Timeline
Jejak digital setiap aktivitas penting. Wajib di: Kurban tracking, Donasi status, Iuran riwayat.
Search Field
Input pencarian dengan icon kiri. Bisa standalone atau dengan filter button. Border invisible saat idle — muncul saat focus.
| Ukuran | Nilai | Token |
|---|---|---|
| Height | 44px | touch target |
| Padding | 8px 16px | --sp-2 --sp-4 |
| Icon size | 15px | fixed |
| Border radius | 9999px | --r-full |
Dropdown & Select
Single select, multi select (chips), dan segmented control. Pilih tipe sesuai jumlah opsi: ≤4 = chips, >4 = dropdown.
| Type | Gunakan | Contoh MASA |
|---|---|---|
| Dropdown | Banyak opsi (>5), string panjang | Pilih ranting, Pilih program |
| Chips | 2–5 opsi singkat, bisa multi-select | Kategori donasi, Minat |
| Segmented | 2–4 opsi eksklusif, labels pendek | Bayar penuh/Cicil, Surah/Juz |
| Currency input | Input angka finansial dengan prefix | Nominal sedekah, Zakat |
OTP & Amount Picker
OTP 6-digit untuk verifikasi auth. Amount picker preset untuk nominal cepat tanpa mengetik.
Dialog Component
Modal confirmation. Dipakai untuk aksi yang perlu konfirmasi eksplisit. Backdrop blur, max-width 320px, radius --r-l.
✓ Do
- Backdrop: 40% opacity --ink-0 overlay
- Max 2 action buttons (secondary + primary/danger)
- Dismiss on backdrop tap (kecuali aksi destruktif)
- Focus di primary action saat muncul
✕ Don't
- Lebih dari 2 action
- Dialog untuk info yang tidak butuh konfirmasi → gunakan Toast
- Body text >3 baris → gunakan Bottom Sheet
- Scrollable content di dialog
Bottom Sheet
Panel yang muncul dari bawah. Dipakai untuk: action list, detail panjang, form sekunder. Ada handle drag di atas.
Alert & Banner
Inline feedback — bukan floating. Tampil di dalam konten halaman untuk info, warning, error, atau success yang perlu terlihat persisten.
| Situasi | Gunakan | Alasan |
|---|---|---|
| Aksi selesai (bayar, simpan) | Toast | Ephemeral, tidak perlu persisten |
| Status yang perlu perhatian terus | Alert Banner | Iuran nunggak, koneksi offline |
| Konfirmasi butuh keputusan | Dialog | Hapus, batalkan, izin |
| Aksi banyak pilihan | Bottom Sheet | Share, metode bayar, filter |
List Item
Row dalam list. 4 tipe: Simple, Avatar, Settings, Danger. Touch target minimal 44px.
Quick Action Grid
8-puck grid 4×2 di homepage. Akses cepat ke semua layanan utama. Urutan berbeda per segmen user.
Event Card
Card event dengan date pill di kiri. Selalu tampilkan: tanggal, penyelenggara dengan verification badge, lokasi.
Organization Card
Card organisasi Muhammadiyah (PCM, LazisMu, AUM). Selalu ada verification badge dan jumlah anggota/kontribusi.
Transparency Card
Menampilkan breakdown alokasi dana donasi. Wajib di halaman detail campaign. Menjawab "dana saya dipakai untuk apa?"
✓ Do
- Tampil di setiap halaman detail campaign donasi
- Data dari API — bukan static
- Update realtime atau max 24 jam sekali
- Selalu tampilkan tanggal update terakhir
✕ Don't
- Sembunyikan transparency card
- Tampilkan angka yang tidak akurat
- Lebih dari 3 stat dalam satu card
- Static/hardcoded angka
Hero Banner
Banner campaign di homepage. Gradient background, copy singkat, satu CTA. Dirotasi saat ada campaign aktif (Qurban, Ramadan, dll).
Form Pattern
Pola standar untuk semua form di MASA: Auth, Iuran, Donasi, Profile. Field order, validation timing, CTA placement — semua konsisten.
✓ Do
- 1 Primary CTA per form, selalu di bawah
- Label selalu terlihat (tidak floating)
- Error inline di bawah field yang salah
- Readonly field tidak bisa di-edit (bukan disabled)
- Tampilkan summary/trust info sebelum CTA
✕ Don't
- Lebih dari 2 scroll screens untuk 1 form
- Validation hanya saat submit
- Placeholder text sebagai pengganti label
- 2 CTA yang sama kekuatannya
- Form tanpa cancel/skip option
Sizing Reference
Tabel ukuran lengkap semua komponen MASA. Designer gunakan ini sebagai referensi saat membuat desain baru di Figma. Semua ukuran sudah terstandarisasi — tidak ada nilai arbitrary.
| Component | Width | Height | Padding | Radius | Font |
|---|---|---|---|---|---|
| Button SM | auto | 32px | 6px 16px | --r-full | 12px W600 |
| Button MD | auto | 44px ★ | 10px 24px | --r-full | 14px W600 |
| Button LG | auto | 52px | 14px 32px | --r-full | 15px W600 |
| Icon Button | 44px ★ | 44px ★ | 10px | 50% | icon 18–20px |
| FAB (visual) | 56px | 56px | 16px | 50% | icon 22px |
| FAB (touch) | 64px ★ | 64px ★ | GestureDetector | 50% | — |
| Component | Height | Padding | Icon | Label | Notes |
|---|---|---|---|---|---|
| Top App Bar | 56px ★ | 0 16px | 36×36px | 15px W700 center | surfaceTint: transparent |
| Bottom Nav | 64px + safe | 8px 8px 20px | 22×22px | 9.5px W500 | 4 tabs + FAB center |
| Tab Bar item | 44px | 10px 16px | — | 13px W600 | indicator: 2px --blue-700 |
| Filter Chip | 32px | 5px 14px | — | 12px W500 | --r-full |
| Puck Grid item | aspect-ratio 1:1 | 8px | 18–22px | 8.5–9.5px W500 | min 64px · --r-s |
| Component | Height | Padding | Radius | Font | Border |
|---|---|---|---|---|---|
| Text Field | 44px min ★ | 10px 14px | --r-s (8px) | 13px W400 | 1.5px --n-300 |
| Search Field | 44px ★ | 8px 16px | --r-full | 13px W400 | none idle |
| OTP Cell | 52px | — | --r-s (8px) | Mono 22px W700 | 1.5–2px |
| OTP Cell width | — | — | — | — | 44px per cell · 8px gap |
| Toggle | 24px | — | 99px | — | 44px wide · thumb 20px |
| Checkbox | 18px | — | 4px | — | touch: 44×44px wrapper |
| Radio | 18px | — | 50% | — | touch: 44×44px wrapper |
| Component | Width | Padding | Radius | Notes |
|---|---|---|---|---|
| Toast | max 360px | 12px 16px | --r-m (12px) | 3s duration · floating |
| Dialog | max 320px | 24px | --r-l (16px) | EL-4 shadow · backdrop 40% |
| Bottom Sheet | 100% | 20px | --r-xl top (24px) | max-h 90vh · handle 36×4px |
| Alert Banner | 100% | 12px 16px | --r-s (8px) | left-border 3px · inline |
| Empty State | 100% | 32px 24px | — | icon 48px 50% opacity |
| Component | Key Sizes | Padding | Radius | Notes |
|---|---|---|---|---|
| Card Standard | full-width | 16px (--sp-4) | --r-m (12px) | border 1px --line · --n-0 bg |
| Avatar XS | 24×24px | — | 50% | font 9px |
| Avatar S | 32×32px | — | 50% | font 11px |
| Avatar M | 40×40px | — | 50% | font 14px |
| Avatar L | 52×52px | — | 50% | font 18px |
| List Item | full-width | 12px 16px | --r-s | min-height 48px |
| Progress Bar | full-width | — | 99px | height: 4–6px |
| Donation Card image | full-width | — | — | height: 100px |
| Component | Key Sizes | Notes |
|---|---|---|
| Verification Badge | h: auto · padding 3px 10px | font: Inter 11px W600 · --r-full |
| e-KTAM Card | max-w 320px · aspect ~1.6:1 | padding 20px · --r-l · gradient bg |
| Organization logo | 44×44px | --r-s · --blue-50 bg |
| Event date pill | 52px wide × full height | --blue-700 bg · day 20px W800 |
| Impact Card header | full-width · padding 16px | gradient green · number 36px W800 |
| Hero Banner | full-width · h 100–120px | padding 16px 20px · --r-m · gradient |