Elemen Dasar
Spinner (Indikator Pemuatan)
Animasi visual berputar untuk menginformasikan proses sinkronisasi, validasi data NIK, atau pemuatan dokumen.
Spinner (.mjl-spinner) mengindikasikan bahwa sistem sedang melakukan pemrosesan di latar belakang — seperti query data kependudukan atau upload berkas berukuran besar.
1. Pratinjau Ukuran & Warna
Pratinjau Spinner
Kecil (14px)
Standar (20px)
Besar (32px)
2. Pemuatan di Dalam Tombol
Ketika warga menekan tombol "Kirim Berkas", gantilah ikon atau tambahkan spinner putih di samping teks:
Spinner di Dalam Tombol
Penggunaan di Berbagai Teknologi
Salin contoh sesuai teknologi proyek Anda. Semua versi memakai class dari @majalengka/css. Komponen siap pakai tersedia di @majalengka/vue; untuk React, Angular, Laravel, dan PHP, contoh di bawah sudah berupa pembungkus kecil yang bisa langsung disalin ke proyek.
<span class="mjl-spinner" role="status">
<span class="sr-only">Memuat data...</span>
</span>
<button type="button" class="mjl-btn mjl-btn--primary mjl-btn--md" aria-busy="true" disabled>
<span class="mjl-spinner mjl-spinner--sm mjl-spinner--white" aria-hidden="true"></span>
Menyimpan...
</button>
<script setup lang="ts">
import { MjlSpinner, MjlButton } from '@majalengka/vue';
</script>
<template>
<MjlSpinner label="Memuat data penduduk..." />
<MjlSpinner size="lg" />
<MjlButton loading>Menyimpan...</MjlButton>
</template>
export function MjlSpinner({ size = 'md', white = false, label = 'Memuat...' }: { size?: 'sm' | 'md' | 'lg'; white?: boolean; label?: string }) {
const cls = ['mjl-spinner', size !== 'md' && `mjl-spinner--${size}`, white && 'mjl-spinner--white'].filter(Boolean).join(' ');
return (
<span className={cls} role="status">
<span className="sr-only">{label}</span>
</span>
);
}
// Pemakaian: {loading && <MjlSpinner label="Memuat data penduduk..." />}
import { Component, input } from '@angular/core';
@Component({
selector: 'mjl-spinner',
standalone: true,
template: `
<span class="mjl-spinner" [class.mjl-spinner--sm]="size() === 'sm'" [class.mjl-spinner--lg]="size() === 'lg'" role="status">
<span class="sr-only">{{ label() }}</span>
</span>
`,
})
export class MjlSpinner {
size = input<'sm' | 'md' | 'lg'>('md');
label = input('Memuat...');
}
// Pemakaian: @if (loading) { <mjl-spinner label="Memuat data..." /> }
{{-- resources/views/components/mjl/spinner.blade.php --}}
@props(['size' => 'md', 'label' => 'Memuat...'])
<span {{ $attributes->class(['mjl-spinner', "mjl-spinner--{$size}" => $size !== 'md']) }} role="status">
<span class="sr-only">{{ $label }}</span>
</span>
{{-- Pemakaian --}}
<x-mjl.spinner size="lg" label="Memuat data penduduk..." />
<span class="mjl-spinner mjl-spinner--lg" role="status">
<span class="sr-only"><?= htmlspecialchars($pesanMemuat ?? 'Memuat...', ENT_QUOTES, 'UTF-8') ?></span>
</span>
3. Kaidah Aksesibilitas
- Atribut
aria-busy="true": Pasang pada kontainer atau tombol yang sedang memuat agar pembaca layar menginformasikan pengguna bahwa konten sedang diperbarui. - Teks Pendamping Tersembunyi: Selalu sertakan teks pembaca layar seperti
<span class="sr-only">Sedang memuat data...</span>jika spinner ditampilkan tanpa label teks visual.