Lewati ke konten utama

♿ Accessibility Audit Report

Target: WCAG 2.1 AA compliance untuk semua 42 screen Parent Portal Method: Contrast ratio calculation, tap target audit, text size audit Scope: Light mode + Dark mode


📏 WCAG 2.1 AA REQUIREMENTS (Quick Reference)

Contrast Ratios

Text TypeMinimum RatioNotes
Normal text (< 18pt / 14pt bold)4.5:1Body, captions, labels
Large text (≥ 18pt / 14pt bold)3:1Headings, display
UI components & graphics3:1Icons, borders, form inputs
Decorative / placeholderNo requirementBut recommend 3:1 anyway

Tap Targets

PlatformMinimum
Android (Material)48×48 dp
iOS (HIG)44×44 pt
Web (WCAG)44×44 px
Our standard48×48 px (safer cross-platform)

Font Sizes

PlatformMinimum for body text
Android (Material)12sp
iOS (HIG)11pt
Our standard11px minimum for any readable text

Other A11y Requirements

  • No text truncation in primary content
  • Touch targets jangan overlap
  • Focus indicators visible (for keyboard nav)
  • Don't rely on color alone (add icon / label)
  • Motion reducible (respect prefers-reduced-motion)
  • Screen reader labels semua interactive elements

🚨 VIOLATIONS FOUND

❌ VIOLATION 1: Hero Subtitle Contrast (Dashboard Polished 25:2)

Element: Label "ASSALAMU'ALAIKUM" Current:

  • Color: rgba(255, 255, 255, 0.6) (white with 60% opacity)
  • Background: #057E6B (emerald-800 dalam gradient)
  • Effective color: ~#80B7AC
  • Ratio: ~2.8:1
  • Font: 10px semibold

WCAG result:FAIL — Required 4.5:1 for small text, got 2.8:1

Fix:

/* Before */
color: rgba(255, 255, 255, 0.6);
font-size: 10px;

/* After */
color: rgba(255, 255, 255, 0.85);
font-size: 11px;
font-weight: 600;
letter-spacing: 1.2px;
text-transform: uppercase;

Ratio after fix: ~4.7:1 ✅


❌ VIOLATION 2: Hero Subtitle "Semoga hari Anda..." (Dashboard Polished 25:2)

Element: Subtitle body text Current:

  • Color: rgba(255, 255, 255, 0.75)
  • Background: #057E6B
  • Ratio: ~3.6:1
  • Font: 12px regular

WCAG result:FAIL — Required 4.5:1

Fix:

color: rgba(255, 255, 255, 0.9);
/* atau solid */
color: #DDF2EC;

Ratio after fix: ~5.2:1 ✅


❌ VIOLATION 3: Child Class Text (Dashboard Polished 25:2)

Element: "Kelas VII-A" Current:

  • Color: rgba(255, 255, 255, 0.75)
  • Background: #065F53 (darker part of gradient)
  • Ratio: ~3.2:1
  • Font: 12px regular

WCAG result:FAIL

Fix:

color: rgba(255, 255, 255, 0.9);

Ratio after fix: ~5.8:1 ✅


❌ VIOLATION 4: Bottom Nav Inactive Labels (All screens)

Element: Label "Tagihan", "Tabungan", "Nilai", "Absensi", "Profil" (non-active) Current:

  • Color: #9E9E9E
  • Background: white #FFFFFF
  • Ratio: ~2.8:1
  • Font: 9px regular

WCAG result:DOUBLE FAIL — Contrast 2.8:1 (req 4.5:1) + Font 9px (min 11px)

Fix:

/* Before */
color: #9E9E9E;
font-size: 9px;

/* After */
color: #52525B; /* zinc-600 */
font-size: 11px;
font-weight: 500;

Ratio after fix: ~7.5:1 ✅


⚠️ VIOLATION 5: Bottom Nav Active Indicator (Dashboard Polished)

Element: Active indicator pill Current:

  • Color: #4CAF50
  • Background: white
  • Ratio: ~2.8:1 (as UI component)

WCAG result: ⚠️ FAIL untuk UI contrast — Required 3:1 for UI components

Fix: Ganti ke brand/primary = #059669 (emerald-600)

Ratio after fix: ~4.3:1 ✅


❌ VIOLATION 6: AppBar "e-Santri" Text (Dashboard Polished 25:2)

Element: "e-Santri" tagline next to "Amal" Current:

  • Color: #71717A (zinc-500)
  • Background: #FAFAF9 (stone-50)
  • Ratio: ~4.7:1 ✅ (borderline pass)
  • Font: 12px medium

WCAG result:PASS (borderline) — but only 0.2 margin

Recommendation: Ubah ke #52525B (zinc-600) untuk aman di berbagai display brightness.

Ratio after fix: ~6.3:1 ✅


⚠️ VIOLATION 7: FAB Chat Badge (Dashboard Polished)

Element: Badge "2" di FAB chat Current:

  • Color: white
  • Background: #EF4444 (red-500)
  • Ratio: ~4.0:1
  • Font: 10px bold

WCAG result: ⚠️ BORDERLINE — 4.0 vs required 4.5 for 10px

Fix:

  • Naikkan font size 10px → 11px
  • Atau darken bg ke #DC2626 (red-600) — ratio jadi ~5.2:1

⚠️ VIOLATION 8: "Semua tagihan sudah lunas. Alhamdulillah!" (State 39:2)

Element: Empty state subtext Current:

  • Color: Grey #71717A (zinc-500)
  • Background: white
  • Ratio: ~5.7:1 ✅
  • Font: 13px regular

WCAG result:PASS — no fix needed, tapi pertimbangkan naikkan ke #52525B untuk redundansi


❌ VIOLATION 9: "Menampilkan data terakhir..." (State Offline 39:62)

Element: Footer text Current:

  • Color: #A1A1AA (zinc-400)
  • Background: #FAFAF9
  • Ratio: ~3.2:1
  • Font: 11px regular

WCAG result:FAIL — 3.2 vs required 4.5

Fix:

color: #52525B; /* zinc-600 */

Ratio after fix: ~8.1:1 ✅


⚠️ VIOLATION 10: Quick Action Card Labels (Dashboard Polished)

Element: Label "Tagihan", "Tabungan", etc pada default variant Current:

  • Color: #3F3F46 (zinc-700)
  • Background: #FFFFFF
  • Ratio: ~11.5:1 ✅
  • Font: 11px medium

WCAG result:PASS — no fix needed


❌ VIOLATION 11: "SEDANG BERLANGSUNG" badge (Dashboard Polished Live Widget)

Element: Badge text Current:

  • Color: #065F46 (emerald-800)
  • Background: #ECFDF5 (emerald-50)
  • Ratio: ~10.1:1 ✅
  • Font: 8px bold

WCAG result: ✅ PASS for contrast, ❌ FAIL for font size (8px < 11px min)

Fix:

font-size: 10px; /* minimum */
letter-spacing: 0.5px;

⚠️ VIOLATION 12: Tap Target — Bell Icon (AppBar)

Element: Bell notification icon button Current: 40×40px

WCAG result: ⚠️ BORDERLINE — below 44×44 iOS HIG

Fix: Resize ke 48×48 (icon tetap 20-24px, padding increase)


⚠️ VIOLATION 13: Tap Target — Avatar Button (AppBar)

Element: User avatar di top-right Current: 40×40px

WCAG result: ⚠️ BORDERLINE

Fix: Resize ke 48×48 (avatar tetap 32×32, tap area extend)


🌑 DARK MODE SPECIFIC AUDIT

Dark mode belum fully implemented, tapi saat nanti dibuat, watch out untuk:

Common Dark Mode Pitfalls:

  1. Pure black #000 causes eye strain — always use zinc-950 (#09090B) or stone-950 (#0A0905) instead
  2. Over-saturated colors burn — mute brand slightly di dark (e.g. emerald-600 → emerald-500 for better DM readability)
  3. Shadows tidak visible — gunakan border accent instead of shadows di dark mode
  4. White text 100% opacity too harsh — use zinc-50 (#FAFAFA) atau lower opacity rgba(255,255,255,0.95)
  5. Colored backgrounds at full saturation — reduce to ~15-20% opacity (e.g. rgba(16,185,129,0.15) for success BG)

Contrast pairs that work well in Dark:

ContextBGText
Surface primaryzinc-900 #18181Bzinc-50 #FAFAFA
Surface cardzinc-800 #27272Azinc-50
Secondary textzinc-900zinc-400 #A1A1AA
Disabledzinc-900zinc-600 #52525B
Brand primaryemerald-500 #10B981white
Brand primary correctedemerald-600 #059669white
Status hadir darkrgba(16,185,129,0.15)emerald-400

🎨 COLOR-ONLY COMMUNICATION ISSUES

Problem: Attendance chips rely solely on color

Current: Green chip = hadir, amber = izin, red = alpha.

Issue for colorblind users: Green/red confusion (deuteranopia, most common colorblind type ~8% of men)

Fix: Add ICON ke semua status chip:

StatusColorIcon (add)
Hadiremeraldcheck-circle
Izinamberfile-document-edit
Sakitbluethermometer atau bandage
Alpharedclose-circle
Terlambatorangeclock-alert

Sama untuk bill status:

StatusColorIcon
Lunasemeraldcheck-circle
Belum bayaramberclock
Overdueredalert-circle

🔊 SCREEN READER AUDIT

Elements yang butuh accessibility label explicit:

ElementCurrent✅ Recommended a11y label
Avatar di AppBar (no text)"Profil pengguna, Fatimah"
Bell icon (badge 3)"Notifikasi, 3 baru"
FAB Chat (badge 2)"Chat wali kelas, 2 pesan baru"
Quick action card "Tagihan" dengan notif dot"Tagihan""Tagihan, ada notifikasi baru"
Metric value "95%""95%""Kehadiran 95 persen"
Hero glass child-card (interactive)"Ganti santri, saat ini Ahmad Fauzan kelas VII-A"
Hijri date pill"Tanggal Hijriah, 8 Syawal 1447"
Active class widget"Kelas sedang berlangsung, IPA Terpadu oleh Ustadz Ahmad Fauzi di ruang 201, berakhir pukul 11:00"
Bottom nav tab"Beranda""Beranda, tab aktif, 1 dari 6"

Announce patterns untuk state changes:

  • Saat pembayaran sukses: "Alhamdulillah, pembayaran berhasil, {amount} diterima"
  • Saat pull-to-refresh selesai: "Data terbaru dimuat"
  • Saat error: "Terjadi kesalahan, {errorMessage}, tombol coba lagi tersedia"
  • Saat empty state: "Tidak ada data"

Content order (reading order) checks:

Pastikan layer order di Figma match reading order. Designer sering pakai z-index / layer creative untuk visual, tapi screen reader baca sequential. Fix dengan "Accessible reading order" plugin atau manual sort.


📝 REMEDIATION CHECKLIST

Designer menjalankan fix sambil tick box ini:

Light Mode

  • VIOLATION 1: Hero label "ASSALAMU'ALAIKUM" opacity → 0.85, size → 11px
  • VIOLATION 2: Hero subtitle opacity → 0.9
  • VIOLATION 3: Child class text opacity → 0.9
  • VIOLATION 4: Bottom nav inactive color → #52525B, size → 11px
  • VIOLATION 5: Bottom nav indicator color → #059669
  • VIOLATION 6: AppBar "e-Santri" color → #52525B
  • VIOLATION 7: FAB badge size → 11px
  • VIOLATION 9: State Offline footer color → #52525B
  • VIOLATION 11: Badge "SEDANG BERLANGSUNG" size → 10px minimum
  • VIOLATION 12: Bell icon tap area → 48×48
  • VIOLATION 13: Avatar tap area → 48×48

Dark Mode

  • Background pakai zinc-950 bukan #000
  • Brand color emerald-500 untuk interactive (tidak 600)
  • Text primary zinc-50 bukan pure white
  • Semua colored BG pakai alpha 15-20% bukan solid
  • Border accent visible di setiap card

Color-independent communication

  • Semua status chip punya icon (attendance + bill)
  • Grade chip punya numeric/letter label (tidak cuma color)
  • Progress bars punya percentage text (tidak cuma bar)

Screen reader

  • Avatar dengan a11y label
  • Icon button dengan a11y label
  • Metric value dengan descriptive label
  • State change announcements defined

Motion

  • Transisi respect prefers-reduced-motion (disable atau durasi 0)
  • Tidak ada auto-scroll tanpa user action
  • Tidak ada flashing element >3Hz (trigger epilepsy)

Forms

  • Field labels explicit (bukan placeholder-only)
  • Error messages associated dengan field (aria-describedby)
  • Required fields marked dengan asterisk + icon
  • Password show/hide toggle accessible

Tap targets

  • Semua interactive element ≥48×48
  • Spacing antar tap target ≥8px
  • Tidak ada overlap tap area

🔧 VERIFICATION TOOLS

Figma plugins untuk audit otomatis:

PluginUse caseFree/Paid
StarkContrast checker + colorblind simulatorFreemium
AbleContrast checker lightweightFree
A11y - Color Contrast CheckerBasic contrastFree
Focus OrderSet reading order for screen readersFree
ContrastRealtime contrast overlayFree

Workflow:

  1. Install Stark (or alternative)
  2. Run Stark → "Check entire page" pada tiap screen
  3. Fix semua violation sampai 0 remaining
  4. Enable "Colorblind simulator" → review apakah info tetap readable
  5. Test dengan "Zoom to 200%" — text tetap readable + tidak overflow?

Manual check per screen (quick):

  1. Screen capture → grayscale convert → masih readable?
  2. Close eyes → partially open → text masih clear?
  3. Test di sunlight brightness → kontras masih oke?
  4. Test di display brightness 30% → masih readable?

📊 SUMMARY STATISTICS

Dari 6 screen yang di-audit:

SeverityCountFix effort
❌ Fail (must fix)9 violations~4 jam designer
⚠️ Borderline (should fix)4 violations~1 jam designer
✅ PassMajority

Estimated remaining violations di 36 screen belum di-audit: ~15-25 additional violations berdasarkan pattern yang sama (contrast rendah di hero, inactive states, micro labels).

Total estimasi fix time: 8-10 jam untuk designer (Week 4 Day 4 timeline).


✅ ACCEPTANCE CRITERIA

Screen dianggap accessibility-ready jika:

  • Stark plugin shows 0 contrast violations
  • Semua text ≥11px
  • Semua tap target ≥48×48
  • Colorblind simulator: critical info tetap jelas
  • Screen reader dry-run: label semua interactive element
  • Motion respects prefers-reduced-motion
  • No color-only communication (paired dengan icon/text)

Status: Audit complete, ready untuk designer remediate Last updated: 2026-04-16 Version: 1.0