Skip to main content

Nexus Ops Design System

:::info Status Locked v1.0 — token, komponen, pola UI, dan registry testID terkunci. Selaras PRD §10 dan Screens. :::

FieldValue
ProductNexus Ops — Absensi Divisi Operation
Version1.0.0
SurfacesMobile (390×844) · Web dashboard (1280+)
Last updated2026-09-24

1. Prinsip desain​

  1. Kepercayaan operasional — Absensi menyangkut gaji & disiplin; UI harus terasa akurat, tenang, dan auditabel.
  2. Satu aksi utama — Clock-in/out selesai dalam ≤ 3 langkah setelah buka app (NFR usability PRD).
  3. Status selalu terlihat — Kehadiran hari ini, hasil face/GPS, dan approval harus terbaca tanpa menebak.
  4. Satu bahasa visual — Mobile & web memakai token yang sama; density berbeda, bukan brand berbeda.
  5. Aksesibilitas lapangan — Kontras tinggi, target tap ≥ 44px, label status tidak hanya warna.

Tagline visual: Hadir. Valid. Terkontrol.


2. Brand & warna​

2.0 Logo assets​

VarianPenggunaanFile
Logo webWordmark desktop (dark BG)static/img/brand/logo-web.png · Figma figma-plugin/assets/logo-web.png
Logo web transparentNavbar / overlaylogo-web-transparent.png
App icon lightMobile icon · lightlogo-mobile-light.png
App icon darkMobile icon · darklogo-mobile-dark.png
MarkAdaptive icon foreground / favicon marklogo-mark.png

Logo web

LightDark
lightdark

Di Figma: jalankan plugin Generate Everything — board tokens memuat logo dari URL mirror docs (lihat figma-plugin/src/brand/logos.js). Import manual dari figma-plugin/assets/ juga boleh.

2.1 Brand​

TokenHexPenggunaan
primary#0B3A5CCTA, nav aktif, brand mark
primaryDark#072A42Pressed / header gelap
primaryBright#1A6FA8Highlight, progress
primarySoft#E8F2F8Soft fill, chip netral-brand
primarySubtle#F3F8FBBackground strip metrik
onPrimary#FFFFFFTeks di atas primary
accent#0E7490GPS / “live” / lokasi
accentSoft#ECFEFFSoft GPS

2.2 Semantic​

TokenHexPenggunaan
success#15803DClock-in valid, approved
successSoft#F0FDF4Banner sukses
warning#B45309Terlambat, pending
warningSoft#FFFBEBBanner pending
error#B91C1CFace/GPS gagal, rejected
errorSoft#FEF2F2Banner gagal
info#1D4ED8Info tip, link
infoSoft#EFF6FFSoft info

2.3 Neutral​

TokenHexPenggunaan
ink950#0B1220Display teks
ink900#111827Judul
ink700#374151Body
ink500#6B7280Meta / caption
ink400#9CA3AFPlaceholder
ink300#D1D5DBDivider soft
ink200#E5E7EBBorder
ink100#F3F4F6Track / muted fill
surface#FFFFFFCard / sheet
background#F4F7FAApp canvas
overlay#0B1220Modal scrim (opacity)

2.4 Status absensi (domain)​

Status APIWarnaLabel UI
(belum baris)ink500 + ink100Belum absen
presentsuccessHadir
latewarningTerlambat
absenterrorAlpha
leaveinfoIzin
GPS ditolakerrorGPS ditolak
Face ditolakerrorFace ditolak
pending (request)warningMenunggu
approvedsuccessDisetujui

3. Tipografi​

Font UI: Inter (fallback Roboto). Hindari display serif untuk produk ops.

RoleSize / weightContoh
Display32 / BoldNexus Ops
Title24 / BoldSelamat pagi, Budi
Heading18 / SemiBoldAbsensi hari ini
Body15–16 / RegularKeterangan pengajuan
Label13 / SemiBoldField label
Caption12 / MediumTimestamp · GPS ±12m
Overline11 / SemiBold · uppercase trackingSHIFT PAGI

4. Spacing, radius, elevation​

TokenValue
Page padding20
Section gap20–24
Card padding16
Control gap8–12
R.sm8
R.md12
R.lg16
R.xl20
R.pill999

Shadow card: y:2 · blur:8 · ink950 @ 6%.
Header brand: soft navy shadow, bukan glow.


5. Komponen inti​

5.1 Tombol​

  • Primary — aksi utama (Clock-in, Ajukan, Setujui)
  • Secondary — aksi sekunder (Lihat riwayat)
  • Ghost — batal / nanti
  • Disabled: opacity 40%, tidak mengubah warna semantic

5.2 Input & form​

  • Label di atas field; helper di bawah
  • Error inline merah + reason code dari API (lihat PRD §10.6)
  • Tanggal/jam leave & OT memakai picker native platform

5.3 Status chip / pill​

Chip kecil untuk status absensi & approval. Selalu kombinasi warna + teks.

5.4 List row​

Judul + meta (waktu / lokasi) + trailing (status chip atau chevron). Digunakan di riwayat, approval inbox, daftar tim.

5.5 Metric tile​

Angka besar + label untuk dashboard (Hadir, Terlambat, Belum absen, On leave).

5.6 Face / GPS panels​

  • Face frame — area kamera persegi rounded; overlay guide oval; teks instruksi singkat
  • GPS strip — ikon lokasi + nama geofence + akurasi meter; hijau dalam area / merah luar area

5.7 Navigation​

Mobile tab bar (4): Beranda · Absensi · Pengajuan · Profil
Web sidebar: Ringkasan · Kehadiran · Persetujuan · Laporan · Karyawan · Lokasi · Pengaturan

5.8 Props minimum (komponen FE bersama)​

Agar web Vue dan mobile RN tidak divergen:

KomponenProps / slots minimum
DataTable (W-T01, W-R02)columns[], rows[], loading, emptyText, onRowClick?, filters?
DateRangePicker (W-R01, M-LV02)start, end, onChange, maxRangeDays?, disabled?
Toast / Bannervariant: success|warning|error|info, title, message?, actionLabel?, onAction?, durationMs?
Skeletonvariant: text|row|card|metric, count?
EmptyStatetitle, description?, ctaLabel?, onCta?

6. Pola layar​

6.1 Mobile shell​

  • Status bar sistem + app header (back opsional)
  • Body scroll, padding 20
  • Tab bar tetap (kecuali alur auth / camera fullscreen)

6.2 Clock-in / clock-out flow​

  1. Hub absensi (pilih Clock-in atau Clock-out) → 2. Capture wajah (on-device embedding) → 3. Validasi GPS → 4. Sukses / gagal dengan reason

Gagal: tampilkan alasan + CTA “Coba lagi” (maks 3); jangan silent fail; tanpa tombol override supervisor.

6.3 Approval reject​

Di web W-AP02 / W-AP03: field Alasan penolakan wajib sebelum Tolak aktif (disable tombol sampai terisi).

6.4 Web shell​

Sidebar 240px + top bar (periode, role, avatar) + main content max-width nyaman untuk tabel.

6.5 State tanpa frame ekstra (pragmatis)​

KebutuhanSolusi
Empty / loading / GPS-permission deniedKomponen shared (EmptyState, spinner); tidak digambar sebagai M-/W- terpisah
Clock-out suksesReuse M-ATT04 — ganti field Jenis + jam
Hub sebelum clock-inFE toggle dari state M-ATT01 (Figma menampilkan state pasca clock-in)
RBAC ditolakRoute guard → redirect + toast; bukan halaman penuh
Peta geofencePlaceholder di Figma; implementasi map SDK di mobile tanpa frame baru
Segment Izin | LemburKontrol di M-LV01 / tab Pengajuan (bukan dua tab bar)

7. Registry testID / data-testid​

Wajib untuk DoD UI dan card E2E. Web: data-testid; Mobile: testID.

Screen / areaID wajib
Web shell smokeweb-shell, web-brand
W-A01 loginlogin-identifier, login-password, login-submit, dashboard-shell
W-AP01 inboxapprovals-inbox
W-AP02/03 rejectreject-reason, reject-submit
W-R01 hubreports-hub
W-R03 exportexport-excel
Mobile shell smokemobile-shell, mobile-brand
M-A02 loginlogin-identifier, login-password, login-submit, home-shell
M-H01 / clockhome-shell, cta-clock-in
M-ATT* flowattendance-hub, start-clock-in, face-capture, attendance-success
M-LV*tab-pengajuan, leave-list, leave-create, leave-type-cuti, leave-submit, leave-sent

Unskip spek Playwright/Maestro setelah ID di atas terpasang di layar terkait.


8. Ikonografi & ilustrasi​

  • Ikon line sederhana (kehadiran, lokasi, wajah, dokumen, lonceng)
  • Hindari ilustrasi mascot; produk ops memakai ikon status + foto profil
  • Empty state: satu kalimat + satu CTA

9. Motion (ringkas)​

MomenMotion
Clock-in suksesCheckmark scale-in singkat + confetti tidak dipakai
GPS lockPulse soft pada pin lokasi
Pending → approvedChip warna crossfade
Push masukBanner slide-down

Durasi tipikal 150–250ms; easing standard, bukan bounce berlebihan.


10. Do / Don’t​

DoDon’t
Tampilkan hasil face dan GPSHanya warna hijau tanpa teks
Reason code yang bisa dipahamiError generik “Gagal”
Satu CTA primer per viewportDua tombol primary berdampingan
Filter laporan jelas (periode / orang / status)Export tanpa konfirmasi filter

11. Mapping ke kode & Figma​

ArtefakLokasi
Token JS (plugin)figma-plugin/src/tokens.js — sumber tunggal
Token JSON publikdocs/static/tokens.json (di-generate dari plugin tokens)
Vendor webweb/src/styles/tokens.ts (salin dari static; pola seperti OpenAPI)
Vendor mobilemobile/src/theme/tokens.ts
Screen IDsScreens · figma-plugin/src/catalog/ids.js
Generator FigmaPlugin Nexus Ops Design Generator di figma-plugin/

Generate: dari root docs, node figma-plugin/scripts/export-tokens.mjs (atau npm run tokens:export di plugin) → tulis static/tokens.json. FE menjalankan sync manual / script mirror saat mulai sprint UI.


12. Riwayat revisi​

VersiTanggalPerubahan
0.1.02026-09-22Draft awal dari proposal & PRD Kelompok B
0.1.12026-09-24Catatan permukaan: RN/Expo (mobile), Vue 3 (web)
0.1.22026-09-24Pola clock-out + reject reason wajib
0.1.32026-09-24State pragmatis tanpa frame ekstra
1.0.02026-09-24Locked: testID registry, props minimum, token vendoring, status API labels
1.0.12026-09-25Brand logo assets (web / mobile light / dark) + Links hub