Fondasi
Ruang dan tata letak
Skala jarak 4px, jarak semantik, grid, breakpoint, kepadatan nyaman dan ringkas, target sentuh, dan safe area.
Jarak mengikuti basis 4px dengan ritme 8px antarblok. Setiap nilai adalah token: pakai --ds-space-* dan jangan menulis angka piksel baru. Langkah kecil (2px, 4px) untuk penyelarasan optik di dalam komponen; jarak antarblok memakai kelipatan 8px.
Skala jarak
--ds-space-00--ds-space-0-50.125rem--ds-space-10.25rem--ds-space-1-50.375rem--ds-space-20.5rem--ds-space-2-50.625rem--ds-space-30.75rem--ds-space-3-50.875rem--ds-space-41rem--ds-space-4-51.125rem--ds-space-51.25rem--ds-space-61.5rem--ds-space-71.75rem--ds-space-82rem--ds-space-102.5rem--ds-space-123rem--ds-space-field-stack0.5remLabel → input → bantuan (8 px).--ds-space-field-group1.5remAntar kelompok field dan antar section form (24 px).--ds-space-section2remAntar blok besar dalam form/detail (32 px).--ds-space-card-x1.125remPadding horizontal kartu portal.--ds-space-card-y1rem--ds-space-panel2remPadding isi form/detail desktop; 1.25rem di ≤ 640 px.--ds-space-toolbar-gap1rem 1.5remCelah baris × kolom toolbar halaman.Langkah 2px dan 4px (--ds-space-0-5, --ds-space-1) menjaga ikon dan teks sebaris tetap sejajar. Langkah --ds-space-2 (8px), -4 (16px), -6 (24px), -8 (32px), dan -12 (48px) membentuk jarak antarbagian.
Jarak semantik
Token semantik menamai tujuan sebuah jarak. Pakai ini sebelum skala mentah.
| Token | Nilai | Dipakai untuk |
|---|---|---|
--ds-space-field-stack |
8px | Label, kontrol, dan teks bantuan dalam satu field |
--ds-space-field-group |
24px | Antarkelompok field di form |
--ds-space-section |
32px | Antarbagian besar dalam halaman |
--ds-space-card-y × --ds-space-card-x |
16 × 18px | Padding kartu |
--ds-space-panel |
32px | Padding panel dan dialog besar |
--ds-space-toolbar-gap |
16px baris × 24px kolom | Jarak di toolbar |
| Variabel | Nilai | Catatan |
|---|---|---|
--ds-space-0 | 0 | |
--ds-space-0-5 | 0.125rem | |
--ds-space-1 | 0.25rem | |
--ds-space-1-5 | 0.375rem | |
--ds-space-2 | 0.5rem | |
--ds-space-2-5 | 0.625rem | |
--ds-space-3 | 0.75rem | |
--ds-space-3-5 | 0.875rem | |
--ds-space-4 | 1rem | |
--ds-space-4-5 | 1.125rem | |
--ds-space-5 | 1.25rem | |
--ds-space-6 | 1.5rem | |
--ds-space-7 | 1.75rem | |
--ds-space-8 | 2rem | |
--ds-space-10 | 2.5rem | |
--ds-space-12 | 3rem | |
--ds-space-field-stack | 0.5rem | Label → input → bantuan (8 px). |
--ds-space-field-group | 1.5rem | Antar kelompok field dan antar section form (24 px). |
--ds-space-section | 2rem | Antar blok besar dalam form/detail (32 px). |
--ds-space-card-x | 1.125rem | Padding horizontal kartu portal. |
--ds-space-card-y | 1rem | |
--ds-space-panel | 2rem | Padding isi form/detail desktop; 1.25rem di ≤ 640 px. |
--ds-space-toolbar-gap | 1rem 1.5rem | Celah baris × kolom toolbar halaman. |
Ukuran
| Variabel | Nilai | Catatan |
|---|---|---|
--ds-size-target | 2.75rem | Target sentuh minimum semua kontrol (44 px). |
--ds-size-target-compact | 2.25rem | Ikon aksi di tabel padat desktop (36 px). Jangan untuk layar sentuh. |
--ds-size-control-lg | 3rem | Input form master (48 px). |
--ds-size-icon-sm | 1rem | |
--ds-size-icon-md | 1.125rem | Ikon navigasi (18 px). |
--ds-size-icon-lg | 1.25rem | |
--ds-size-icon-xl | 2rem | Ikon dropzone, avatar akun. |
--ds-size-avatar | 2.25rem | |
--ds-size-sidebar | 16rem | |
--ds-size-sidebar-rail | 4.75rem | |
--ds-size-topbar | 4.75rem | |
--ds-size-auth-panel | 24rem | |
--ds-size-dialog-sm | 34rem | |
--ds-size-dialog-lg | 54rem | |
--ds-size-panel | 24rem | Panel notifikasi. |
--ds-size-popover-calendar | 22rem | |
--ds-size-menu | 15rem | |
--ds-size-measure | 65ch | Lebar baca paragraf. |
--ds-size-table-max-height | min(68dvh, 44rem) |
- Sidebar 16rem, rail terlipat 4.75rem, top bar 4.75rem.
- Dialog 34rem (kecil) dan 54rem (besar). Di bawah 640px dialog memenuhi layar.
- Lebar baca
65ch(--ds-size-measure). - Tabel yang bisa digulir dibatasi
min(68dvh, 44rem)agar header sticky tetap terlihat.
Grid
Tata letak memakai CSS grid dengan minmax(min(100%, X), 1fr), sehingga kolom tidak pernah lebih lebar dari wadahnya, bahkan di 320px.
| Kelas | Perilaku |
|---|---|
.ds-kpis |
auto-fill, kolom minimal 13.5rem |
.ds-grid-2 |
auto-fit, kolom minimal 28rem; satu kolom bila sempit |
.ds-grid-3 |
auto-fit, kolom minimal 20rem |
.ds-field-grid |
Dua kolom, satu kolom di 640px ke bawah |
Lihat kode HTML
<div class="ds-kpis">
<div class="ds-kpi"><span class="ds-text-subtle">Faktur terbuka</span><span class="ds-num" style="font-size:var(--ds-type-metric-size);font-weight:var(--ds-type-metric-weight)">42</span></div>
<div class="ds-kpi"><span class="ds-text-subtle">Belum dibayar</span><span class="ds-num" style="font-size:var(--ds-type-metric-size);font-weight:var(--ds-type-metric-weight)">18.420,00</span></div>
<div class="ds-kpi"><span class="ds-text-subtle">Proyek aktif</span><span class="ds-num" style="font-size:var(--ds-type-metric-size);font-weight:var(--ds-type-metric-weight)">7</span></div>
</div>Pilih container query bila komponen harus menyesuaikan ruang yang diterimanya, bukan viewport.
Breakpoint
| Variabel | Nilai | Catatan |
|---|---|---|
--ds-breakpoint-xs | 360px | |
--ds-breakpoint-sm | 640px | Ponsel: tabel jadi baris berlabel, aksi turun ke baris sendiri. |
--ds-breakpoint-md | 768px | |
--ds-breakpoint-lg | 1024px | Sidebar menjadi kolom tetap (drawer terbuka). |
--ds-breakpoint-xl | 1280px |
| Lebar | Yang berubah |
|---|---|
| 640px | Tabel menjadi kartu berlabel, input tetap 16px, header halaman dan footer dialog menumpuk |
| 1024px | Sidebar tetap di kiri (di bawahnya menjadi drawer), tombol lipat muncul, padding .ds-main naik ke 32px |
| 1180px | Toolbar menumpuk: teks dahulu, aksi di bawah dan rata kanan |
Periksa 320px, 390px, 768px, dan 1280px di kedua bahasa. Jangan menambah breakpoint bila 640, 1024, atau 1180 cukup; catat breakpoint khusus komponen di halaman komponennya.
Kepadatan
- Nyaman adalah default: kontrol setinggi 44px di layar sentuh dan jarak mengikuti skala di atas.
- Ringkas untuk tabel dan toolbar desktop yang padat. Bungkus area dengan
.ds-dense: tombol dan chip kecil turun ke--ds-size-target-compact(36px) dan area tekan tetap minimal 24×24px. Jangan dipakai di perangkat sentuh atau untuk satu-satunya cara melakukan sesuatu.
Lihat kode HTML
<div style="display:flex;flex-wrap:wrap;align-items:center;gap:1.5rem">
<div style="display:flex;gap:.5rem"><button class="btn btn-sm">Nyaman</button><button class="btn btn-sm btn-primary">Simpan</button></div>
<div class="ds-dense" style="display:flex;gap:.5rem"><button class="btn btn-sm">Ringkas</button><button class="btn btn-sm btn-primary">Simpan</button></div>
</div>Target sentuh
- Minimal 24×24px di mana pun (WCAG 2.5.8) dan 44×44px (
--ds-size-target) pada(pointer: coarse). - Ukuran ringkas menjaga area tekan dengan padding atau pseudo-element, bukan dengan mengecilkan target.
- Beri jarak 8px antartarget agar jempol hanya mengenai satu.
Safe area
Pada perangkat dengan notch dan sudut membulat, tambahkan viewport-fit=cover pada meta viewport dan beri padding tepi tetap dengan inset lingkungan:
.bottom-bar {
padding-block-end: max(var(--ds-space-3), env(safe-area-inset-bottom));
padding-inline: max(var(--ds-space-4), env(safe-area-inset-left), env(safe-area-inset-right));
}Terapkan pada bar tetap, bottom navigation, dan sheet. Jangan menaruh aksi utama di dalam inset.
Panduan
- Pakai properti logis (
margin-inline-start,padding-block,inset-inline-end) agardir="rtl"bekerja tanpa perubahan. - Kelompokkan item yang berkaitan lebih rapat daripada yang tidak: 8px dalam field, 24px antarfield, 32px antarbagian.
- Jangan menumpuk kartu lebih dari satu level; pakai hairline, bukan kotak kedua.
- Pakai
gapantarsaudara, bukan margin di tiap anak.
Token
--ds-space-*, --ds-size-*, --ds-breakpoint-*, --ds-size-target, --ds-size-target-compact, --ds-size-measure.