Fondasi
Tipografi
Satu huruf, 17 peran tipografi, angka tabular untuk data, lebar baca 50–75 karakter, dan aturan teks yang memanjang dalam bahasa Indonesia atau terbungkus di layar kecil.
Citia DS memakai satu keluarga huruf, Manrope, dan membangun hierarki dari ukuran, bobot, tracking, dan leading sebagai satu set. Setiap peran adalah empat token (--ds-type-<peran>-size, -leading, -weight, -tracking), sehingga judul tidak pernah mendapat ukuran tanpa jarak yang cocok. Pakai peran, bukan ukuran font mentah.
Font
- Manrope variable font, sumbu bobot 200–800. DS memakai 400–800.
- Di-host sendiri di
/_content/Citia.DesignSystem/fonts/manrope/dalam dua subset,latindanlatin-ext. Lisensi SIL OFL 1.1 (OFL.txtada di folder yang sama). - Tanpa permintaan ke CDN. Aplikasi tetap jalan di jaringan terbatas dan pihak ketiga tidak bisa memblokir font.
font-display: swap. Subsetlatindi-preload oleh_DsHead, jadi teks tampil dengan fallback selama font dimuat.font-optical-sizing: autoaktif, sehingga bentuk huruf menyesuaikan ukuran tampil.
Fallback: "Manrope", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif. Token monospace --ds-font-mono hanya untuk kode, markup literal, dan kunci rahasia.
| Variabel | Nilai | Catatan |
|---|---|---|
--ds-font-sans | "Manrope", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif | Manrope variable 200–800 (dipakai 400–800), self-hosted, OFL 1.1. |
--ds-font-mono | ui-monospace, "Cascadia Mono", "Segoe UI Mono", Consolas, "SF Mono", Menlo, monospace | Hanya XML, kode literal, kunci rahasia. |
--ds-weight-regular | 400 | |
--ds-weight-medium | 500 | |
--ds-weight-semibold | 600 | |
--ds-weight-strong | 650 | |
--ds-weight-bold | 700 | |
--ds-weight-heavy | 750 | |
--ds-weight-extrabold | 800 |
Peran tipografi
Tujuh belas peran, dari display sampai micro. Contoh di bawah dirender dengan variabel aslinya.
Data akurat, integrasi cepat
Judul hero halaman login/landing (.auth-hero-title).
Data akurat, integrasi cepat
Judul halaman (h1) daftar/form/detail (.master-heading h1).
Data akurat, integrasi cepat
Judul layar portal/dashboard (.pt-header h1).
Data akurat, integrasi cepat
Judul di top bar (.topbar-title).
Data akurat, integrasi cepat
Judul panel login (.auth-title).
Data akurat, integrasi cepat
Judul dialog, empty state (.qa-title, .master-empty h2).
Data akurat, integrasi cepat
Legend fieldset, judul bagian form (.master-fieldset legend).
Data akurat, integrasi cepat
Judul kartu (.pt-card-head h2).
Data akurat, integrasi cepat
Teks isi dan semua input (16 px mencegah zoom di iOS).
Data akurat, integrasi cepat
Label field (.master-field > label).
Data akurat, integrasi cepat
Isi tabel, item navigasi, tombol.
Data akurat, integrasi cepat
Bantuan field, header tabel data, catatan (.master-help).
Data akurat, integrasi cepat
Keterangan KPI, waktu, meta (.pt-kpi-sub).
Data master
Kepala grup sidebar, eyebrow portal, label badge (.sb-group-toggle, .pt-eyebrow).
Data master
Header tabel modern (.pt-table th).
12
Angka badge notifikasi (.notif-badge).
1574782
Angka KPI (.pt-kpi-value).
| Peran | Ukuran / leading / bobot / tracking | Dipakai untuk |
|---|---|---|
display |
clamp(2rem, 3vw, 3rem) / 1.1 / 750 / -0.04em | Hero landing dan halaman masuk |
title-1 |
clamp(1.75rem, 2.5vw, 2.25rem) / 1.15 / 650 / -0.035em | Judul halaman |
title-2 |
clamp(1.375rem, 2vw, 1.75rem) / 1.2 / 750 / -0.03em | Judul bagian halaman, header padat |
title-3 |
clamp(1.25rem, 1.6vw, 1.625rem) / 1.25 / 750 / -0.03em | Judul top bar |
title-auth |
1.75rem / 1.2 / 650 / -0.02em | Form masuk dan akun |
headline |
1.25rem / 1.3 / 650 / -0.01em | Judul dialog dan empty state |
section |
1.0625rem / 1.4 / 650 / 0 | Legend fieldset, judul bagian |
card-title |
0.9375rem / 1.4 / 700 / 0 | Header kartu |
body |
1rem / 1.5 / 400 / 0 | Teks isi dan semua input |
label |
0.9375rem / 1.5 / 600 / 0 | Label field |
callout |
0.875rem / 1.5 / 400 / 0 | Sel tabel, item navigasi, tombol |
footnote |
0.8125rem / 1.5 / 400 / 0 | Teks bantuan |
caption |
0.75rem / 1.4 / 400 / 0 | Metadata, baris sekunder |
eyebrow |
0.6875rem / 1rem / 700 / 0.08em, kapital | Label grup di atas judul |
table-head |
0.6875rem / 1rem / 700 / 0.06em, kapital | Header kolom tabel |
micro |
0.625rem / 1 / 800 / 0 | Hanya lencana hitungan |
metric |
1.75rem / 1.1 / 750 / -0.03em, tabular | Angka besar di kartu statistik |
Di CSS, pasang peran lewat empat variabelnya:
.page-title {
font-size: var(--ds-type-title-1-size);
line-height: var(--ds-type-title-1-leading);
font-weight: var(--ds-type-title-1-weight);
letter-spacing: var(--ds-type-title-1-tracking);
text-wrap: balance;
}Dengan tema Tailwind, kelas text-title-1 memasang keempatnya sekaligus.
Bobot, tracking, dan leading
Bobot berjalan dari --ds-weight-regular (400) sampai --ds-weight-extrabold (800). Teks isi 400, label 600, judul 650–750. Bangun hierarki dari bobot, ukuran, dan leading bersama; menebalkan teks tanpa mengubah yang lain membuat halaman datar.
- Tracking. Negatif hanya untuk teks besar:
display-0.04em, turun keheadline-0.01em. Darisectionke bawah 0. Teks isi selalu 0. Peran kapital (eyebrow,table-head) memakai tracking positif (0.06–0.08em), karena huruf kapital tanpa tracking terbaca rapat. - Leading. Judul besar rapat (1.1 untuk
display, 1.15 untuktitle-1, 1.2 untuktitle-2). Teks isi 1.5, caption 1.4. Peran satu baris (eyebrow,micro) memakai leading tetap agar tinggi baris sama. - Input. Semua input 16px. Di bawah 16px, Safari iOS memperbesar halaman saat field difokuskan.
Angka
font-variant-numeric: tabular-nums aktif pada <table>, .ds-num, dan .tabular. Pakai angka tabular di mana digit harus sejajar atau berubah seiring waktu: tabel, statistik, hitungan, paging, timer, dan identifier. Pakai angka proporsional di teks mengalir.
| Faktur | Klien | Jumlah |
|---|---|---|
| INV-2026-0418 | Ayu Lestari | 1.248,50 |
| INV-2026-0419 | Daniel Okafor | 98,00 |
| INV-2026-0420 | Mei Tanaka | 15.011,75 |
Lihat kode HTML
<table class="table">
<thead><tr><th>Faktur</th><th>Klien</th><th style="text-align:end">Jumlah</th></tr></thead>
<tbody>
<tr><td><span class="ds-id">INV-2026-0418</span></td><td>Ayu Lestari</td><td style="text-align:end">1.248,50</td></tr>
<tr><td><span class="ds-id">INV-2026-0419</span></td><td>Daniel Okafor</td><td style="text-align:end">98,00</td></tr>
<tr><td><span class="ds-id">INV-2026-0420</span></td><td>Mei Tanaka</td><td style="text-align:end">15.011,75</td></tr>
</tbody>
</table>Identitas bisnis (PRJ-1024, INV-2026-0418) memakai Manrope dengan angka tabular lewat .ds-id, yang juga mereset letter-spacing ke 0. Monospace hanya untuk kode literal (pre.code). Ratakan kolom angka ke kanan dan taruh satuan di sel terpisah atau di header.
Lebar baca
Jaga teks mengalir antara 50 dan 75 karakter per baris. --ds-size-measure bernilai 65ch, dipasang oleh .ds-measure. Jangan biarkan paragraf melebar sepanjang layar.
Faktur direkonsiliasi setiap malam pukul 02.00
Proses malam membandingkan setiap faktur dengan catatan pembayarannya dan menandai selisih di atas 0,5%. Item yang ditandai muncul di antrean tinjauan keesokan paginya, dikelompokkan per proyek, sehingga tim keuangan bisa menyelesaikannya sekaligus.
Lihat kode HTML
<div class="ds-measure">
<h3 style="font-size:var(--ds-type-title-2-size);line-height:var(--ds-type-title-2-leading);font-weight:var(--ds-type-title-2-weight);letter-spacing:var(--ds-type-title-2-tracking);text-wrap:balance;margin:0 0 .5rem">Faktur direkonsiliasi setiap malam pukul 02.00</h3>
<p style="text-wrap:pretty;margin:0">Proses malam membandingkan setiap faktur dengan catatan pembayarannya dan menandai selisih di atas 0,5%. Item yang ditandai muncul di antrean tinjauan keesokan paginya, dikelompokkan per proyek, sehingga tim keuangan bisa menyelesaikannya sekaligus.</p>
</div>Tambahkan text-wrap: balance pada judul (maksimal dua sampai tiga baris) agar baris terakhir tidak berisi satu kata, dan text-wrap: pretty pada paragraf panjang.
Inggris dan Indonesia
String bahasa Indonesia biasanya 20–40% lebih panjang daripada bahasa Inggris ("Save changes" menjadi "Simpan perubahan", "Rows per page" menjadi "Baris per halaman"). Rancang untuk pertumbuhan 40%:
- Tanpa lebar tetap pada wadah teks; pakai
min-width,max-width,flex, dangriddenganminmax(). - Tombol melebar dan tetap satu baris bila muat. Label lebih dari sekitar 28 karakter sebaiknya pindah ke tooltip atau baris bantuan.
- Uji setiap layar dalam kedua bahasa sebelum rilis. Jangan menilai tata letak dari bahasa Inggris saja.
- Jangan menyingkat agar muat. Persingkat kalimatnya.
Pemotongan dan pembungkusan
- Bungkus secara default. Judul, deskripsi, label, dan sel tabel berisi kalimat dibungkus ke sebanyak baris yang dibutuhkan.
- Potong hanya teks identitas (nama file, email, item breadcrumb, tag), dan hanya bila lebar terbatas. Pakai
text-overflow: ellipsispada satu baris dan taruh teks penuh dititleatau nama aksesibel. - Batasi deskripsi dengan
.ds-clamp-2(dua baris) di kartu dan daftar. Jangan membatasi satu-satunya salinan teks yang harus dibaca pengguna, seperti galat. - String panjang tanpa spasi (URL, ID) memakai
overflow-wrap: anywhereagar tidak melebarkan tata letak melebihi 320px. - Tanpa
text-align: justify. Ratakan teks ke awal di kedua bahasa.
Panduan
- Pilih peran sesuai maknanya, bukan ukuran yang diinginkan. Bila tidak ada peran yang cocok, minta token baru, bukan ukuran sekali pakai.
- Satu
title-1per halaman. Jangan melompati level judul:h1,h2,h3berurutan, apa pun tampilannya. - Pakai
--ds-subtleuntuk teks sekunder dan--ds-muteduntuk teks tersier. Jangan menurunkan opasitas untuk meredupkan teks; kontras harus tetap terukur (4.5:1). - Teks isi minimal 16px, dengan 12px (
caption) sebagai batas bawah.
Token
--ds-font-sans, --ds-font-mono, --ds-weight-*, --ds-type-<peran>-size, -leading, -weight, -tracking, --ds-size-measure.