Komponen / Grafik & jadwal
ProportionBar
Batang proporsi bagian dari satu keseluruhan: stacked tipis + legenda nominal & persen (beban per komponen), atau split tebal berlabel di dalam (gender).
Stacked: beban per komponen
Total besar (Display/Page title) + keterangan, satu batang 14 px dengan celah 2 antarsegmen, lalu legenda kisi "Rp 14.124.000 · 52%". Uang: formatValue={v => formatMoney(v)}.
Beban per komponen · 5 slip draf
1 orang belum punya slip (Raka, tanpa SSA), jadi belum masuk beban.
Rp 27.136.338total beban perusahaan periode ini
| Komponen | Nominal | Persen |
|---|---|---|
| Gaji pokok | Rp 14.124.000 | 52% |
| Tunjangan tetap (UT/UK) | Rp 3.800.000 | 14% |
| Variabel (Additional Salary) | Rp 3.401.000 | 13% |
| Lembur | Rp 4.200.000 | 15% |
| Tunjangan PPh 21 | Rp 730.000 | 3% |
| Iuran BPJS perusahaan | Rp 881.338 | 3% |
import { Card, ProportionBar, formatMoney } from '@divistant/circca-react';
// Monitoring payroll › Beban per komponen: total besar + satu batang bertumpuk + legenda nominal & persen.
// Warna mengikuti urutan Figma (cat-1, cat-5, cat-3, cat-2, cat-7, neutral).
const data = [
{ label: 'Gaji pokok', value: 14_124_000, tone: 'cat-1' },
{ label: 'Tunjangan tetap (UT/UK)', value: 3_800_000, tone: 'cat-5' },
{ label: 'Variabel (Additional Salary)', value: 3_401_000, tone: 'cat-3' },
{ label: 'Lembur', value: 4_200_000, tone: 'cat-2' },
{ label: 'Tunjangan PPh 21', value: 730_000, tone: 'cat-7' },
{ label: 'Iuran BPJS perusahaan', value: 881_338, tone: 'neutral' },
] as const;
export default function Example() {
const total = data.reduce((s, d) => s + d.value, 0);
return (
<Card
className="w-full"
title="Beban per komponen · 5 slip draf"
subtitle="1 orang belum punya slip (Raka, tanpa SSA), jadi belum masuk beban."
action={
<a href="#salary-slip" className="type-footnote-default text-accent-fg hover:underline">
Salary Slip ›
</a>
}
>
<ProportionBar
label="Beban per komponen"
total={formatMoney(total)}
totalCaption="total beban perusahaan periode ini"
formatValue={v => formatMoney(v)}
tableColumns={['Komponen', 'Nominal', 'Persen']}
data={[...data]}
/>
</Card>
);
}Split: dua kelompok
Segmen tebal 40 px berlabel "jumlah · kelompok" di dalam; persen di bawah ujung masing-masing. Cocok untuk 2–3 kelompok.
Gender
Orang aktif.
| Gender | Orang | Persen |
|---|---|---|
| Laki-laki | 2 | 40% |
| Perempuan | 3 | 60% |
import { Card, ProportionBar } from '@divistant/circca-react';
// Monitoring payroll › Gender: split bar dua segmen tebal, label "jumlah · kelompok" di dalam,
// persen di bawah ujung masing-masing.
export default function Example() {
return (
<Card
className="w-full max-w-[548px]"
title="Gender"
subtitle="Orang aktif."
action={
<a href="#karyawan" className="type-footnote-default text-accent-fg hover:underline">
Daftar Karyawan ›
</a>
}
>
<ProportionBar
variant="split"
label="Gender orang aktif"
tableColumns={['Gender', 'Orang', 'Persen']}
data={[
{ label: 'Laki-laki', value: 2, tone: 'cat-1' },
{ label: 'Perempuan', value: 3, tone: 'cat-7' },
]}
/>
</Card>
);
}Kosong & segmen kecil
Semua nilai nol = empty state (batang abu + pesan, tanpa legenda 0%). Segmen sekecil apa pun tetap selebar minimal 4 px.
Beban per komponen
Belum ada slip draf.
Rp 0total beban perusahaan periode ini
Beban muncul setelah slip draf dibuat.
| Bagian | Nilai | Persen |
|---|---|---|
| Gaji pokok | 0 | 0% |
| Lembur | 0 | 0% |
Segmen kecil
Satu komponen jauh lebih kecil.
| Bagian | Nilai | Persen |
|---|---|---|
| Gaji pokok | Rp 64 jt | 99% |
| Tunjangan PPh 21 | Rp 730 rb | 1% |
import { Card, ProportionBar, formatMoney } from '@divistant/circca-react';
// Data semua nol = empty state: batang abu + pesan, tanpa legenda 0%.
// Segmen kecil (Tunjangan PPh 21 ±1%) tetap terlihat berkat lebar minimum 4 px.
export default function Example() {
return (
<div className="grid w-full gap-4 md:grid-cols-2">
<Card title="Beban per komponen" subtitle="Belum ada slip draf.">
<ProportionBar
label="Beban per komponen"
total={formatMoney(0)}
totalCaption="total beban perusahaan periode ini"
emptyMessage="Beban muncul setelah slip draf dibuat."
data={[
{ label: 'Gaji pokok', value: 0 },
{ label: 'Lembur', value: 0 },
]}
/>
</Card>
<Card title="Segmen kecil" subtitle="Satu komponen jauh lebih kecil.">
<ProportionBar
label="Beban per komponen"
formatValue={v => formatMoney(v, { compact: true })}
legendLayout="list"
data={[
{ label: 'Gaji pokok', value: 64_000_000 },
{ label: 'Tunjangan PPh 21', value: 730_000, tone: 'cat-7' },
]}
/>
</Card>
</div>
);
}