Kolom samping pada cangkang Bagian 1 masih berupa ruang kosong bertema latar abu-abu. Bagian ini mengisinya dengan sidebar gelap khas aplikasi keuangan: brand DompetKu di atas, dua kelompok menu di tengah, dan catatan versi yang menempel di dasar. Bersamaan, untuk pertama kalinya berkas HTML proyek muncul sebagai snapshot beranda.html — isinya sudah lengkap sampai akhir proyek, karena tiga bagian berikutnya hanya menumbuhkan CSS, bukan menambah elemen. Saat dipraktikkan, simpan snapshot itu sebagai index.html.
Sidebar Gelap dan Struktur Menu #
Sidebar bekerja sebagai kolom flex vertikal dengan jarak antarbagian dari token:
.sidebar {
display: flex; flex-direction: column; gap: var(--jarak-5); overflow-y: auto;
padding: var(--jarak-5) var(--jarak-4);
background-color: var(--warna-samping); color: var(--warna-samping-teks);
}Warna dasar #0f172a yang pekat membuat menu teal menonjol tanpa perlu dekorasi tambahan. Tautan menu ditata sebagai flexbaris — siap menampung ikon nanti — dengan padding lega supaya sasaran sentuhnya nyaman di ponsel:
.menu-tautan {
display: flex; align-items: center; gap: var(--jarak-3); padding: 10px var(--jarak-3);
border-radius: var(--radius-kecil); text-decoration: none;
color: var(--warna-samping-teks); font-size: 14.5px; font-weight: 600;
}
.menu-tautan:hover { background-color: var(--warna-samping-hover); color: #ffffff; }Arahkan kursor ke tautan pada demo untuk sorot temaramnya, lalu bandingkan dengan tautan berlatar teal yang membawa is-aktif. Elemen .sidebar-kaki membawa margin-top: auto, trik yang menyerap seluruh ruang kosong di atasnya sehingga catatan versi selalu menempel di dasar kolom seberapa pun pendek daftar menunya.
Status Aktif dan Aksesibilitas Menu #
Menu dasbor butuh satu tanda jelas: halaman mana yang sedang dibuka. Kita memakai class is-aktif untuk tampilan dan atribut aria-current="page" untuk pembaca layar — keduanya hidup berdampingan pada tautan yang sama:
.menu-tautan.is-aktif { background-color: var(--warna-utama); color: #ffffff; }<li><a href="#ringkasan" class="menu-tautan is-aktif" aria-current="page">Ringkasan</a></li>Begitu JavaScript dari Bagian 5 aktif, klik tautan lain akan memindahkan is-aktif sekaligus memperbarui aria-current, sehingga tampilan dan makna selalu sinkron. Dua detail pendukung ikut ditata: :focus-visible pada tautan menu diberi warna mint #5eead4 agar cincin fokus terlihat di atas latar gelap, dan grup menu memakai aria-labelledby yang menunjuk judul grupnya sehingga pembaca layar mendengar konteks “Menu” sebelum daftar tautan.
Persiapan Tombol Sakelar #
HTML sudah menyertakan dua elemen yang perannya baru terasa di Bagian 5: button.tombol-samping di bilah kepala dan button.tirai-samping sebagai pembungkus tirai gelap. CSS bagian ini hanya menyiapkan panggungnya:
.tombol-samping { display: none; }Pada desktop tombol itu disembunyikan karena sidebar selalu terlihat. Tombolnya sendiri membawa aria-expanded="false" dan aria-controls="sidebar-nav" sejak awal — atribut yang nantinya diperbarui JavaScript setiap kali panel dibuka atau ditutup. Menyiapkan atribut sejak sekarang berarti Bagian 5 cukup menata gaya dan menggerakkan logika, tanpa menyentuh struktur HTML lagi. Susunan ini juga progresif: bila skrip gagal dimuat, desktop tetap menyajikan menu lengkap karena sidebar tampil statis, dan tombol yang tidak berfungsi tidak pernah muncul di layar karena disembunyikan CSS.
/* ============================================================
Dashboard Keuangan — stylesheet utama
Urutan: token → base → cangkang aplikasi → sidebar →
kepala aplikasi → kartu ringkasan → tabel transaksi →
lencana status → responsif → fokus dan gerak
============================================================ */
/* ---------- 1. Design token ---------- */
:root {
/* Warna semantik dasbor */
--warna-latar: #f1f5f9; --warna-permukaan: #ffffff;
--warna-teks: #0f172a; --warna-teks-lembut: #64748b;
--warna-garis: #e2e8f0; --warna-utama: #0f766e;
--warna-utama-pekat: #115e59; --warna-utama-lembut: #ccfbf1;
--warna-utama-tinta: #134e4a; --warna-fokus: #0d9488;
--warna-samping: #0f172a; --warna-samping-teks: #cbd5e1;
--warna-samping-hover: rgba(255, 255, 255, 0.08);
--warna-masuk: #15803d; --warna-masuk-latar: #dcfce7;
--warna-keluar: #b91c1c; --warna-keluar-latar: #fee2e2;
/* Skala spasi, basis empat dan delapan piksel */
--jarak-1: 4px; --jarak-2: 8px;
--jarak-3: 12px; --jarak-4: 16px;
--jarak-5: 24px; --jarak-6: 32px;
/* Radius sudut dan bayangan */
--radius-kecil: 8px; --radius: 12px; --radius-penuh: 999px;
--bayangan-1: 0 1px 2px rgba(15, 23, 42, 0.06);
--bayangan-2: 0 12px 28px rgba(15, 23, 42, 0.22);
/* Tipografi, gerak, dan kerangka */
--font-dasar: system-ui, "Segoe UI", sans-serif;
--durasi: 180ms; --pelunakan: ease-out;
--lebar-samping: 248px;
}
/* ---------- 2. Base ---------- */
*, *::before, *::after { box-sizing: border-box; }
body { margin: 0; font-family: var(--font-dasar); line-height: 1.6; background-color: var(--warna-latar); color: var(--warna-teks); }
h1, h2, p, ul { margin: 0; }
ul { padding: 0; list-style: none; }
button { font: inherit; }
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
/* ---------- 3. Cangkang aplikasi ---------- */
.cangkang-app {
display: grid;
grid-template-areas: "samping kepala" "samping utama";
grid-template-columns: var(--lebar-samping) 1fr;
grid-template-rows: auto 1fr;
height: 100dvh;
}
.sidebar { grid-area: samping; }
.kepala-app { grid-area: kepala; }
.isi-utama { grid-area: utama; overflow-y: auto; display: grid; gap: var(--jarak-5); align-content: start; padding: var(--jarak-5); }
.isi-kaki { font-size: 12.5px; color: var(--warna-teks-lembut); text-align: center; }
/* ---------- 4. Sidebar dan navigasi ---------- */
.sidebar {
display: flex; flex-direction: column; gap: var(--jarak-5); overflow-y: auto;
padding: var(--jarak-5) var(--jarak-4);
background-color: var(--warna-samping); color: var(--warna-samping-teks);
}
.brand { display: flex; align-items: center; gap: var(--jarak-3); }
.brand-tanda { flex: none; width: 38px; height: 38px; border-radius: 10px; background-image: linear-gradient(135deg, #2dd4bf, #0f766e); }
.brand-nama { color: #ffffff; font-size: 17px; font-weight: 800; line-height: 1.3; }
.brand-sub { display: block; font-size: 11.5px; font-weight: 500; color: var(--warna-samping-teks); }
.menu-judul { padding-inline: var(--jarak-3); font-size: 11.5px; font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: #64748b; }
.menu-app { display: grid; gap: 4px; margin-top: var(--jarak-2); }
.menu-tautan {
display: flex; align-items: center; gap: var(--jarak-3); padding: 10px var(--jarak-3);
border-radius: var(--radius-kecil); text-decoration: none;
color: var(--warna-samping-teks); font-size: 14.5px; font-weight: 600;
transition: background-color var(--durasi) var(--pelunakan), color var(--durasi) var(--pelunakan);
}
.menu-tautan:hover { background-color: var(--warna-samping-hover); color: #ffffff; }
.menu-tautan.is-aktif { background-color: var(--warna-utama); color: #ffffff; }
.sidebar-kaki { margin-top: auto; padding: var(--jarak-3); border-top: 1px solid rgba(255, 255, 255, 0.12); font-size: 12.5px; }
/* ---------- 5. Kepala aplikasi ---------- */
.kepala-app {
display: flex; align-items: center; gap: var(--jarak-4); padding: var(--jarak-4) var(--jarak-5);
background-color: var(--warna-permukaan); border-bottom: 1px solid var(--warna-garis);
}
.kepala-sapaan { font-size: 12.5px; color: var(--warna-teks-lembut); }
.kepala-judul { font-size: 20px; font-weight: 800; letter-spacing: -0.01em; line-height: 1.3; }
.kepala-periode { margin-left: auto; padding: 6px 14px; border-radius: var(--radius-penuh); background-color: var(--warna-utama-lembut); color: var(--warna-utama-tinta); font-size: 13px; font-weight: 700; }
.tombol-samping { display: none; }<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dashboard Keuangan — DompetKu</title>
<link rel="stylesheet" href="css/styles.css">
<script src="js/main.js" defer></script>
</head>
<body>
<div class="cangkang-app">
<aside class="sidebar" id="sidebar-nav" aria-label="Panel navigasi dasbor">
<div class="brand">
<span class="brand-tanda" aria-hidden="true"></span>
<span class="brand-nama">DompetKu<span class="brand-sub">Catatan keuangan pribadi</span></span>
</div>
<nav aria-label="Menu utama">
<p class="menu-judul" id="judul-menu">Menu</p>
<ul class="menu-app" aria-labelledby="judul-menu">
<li><a href="#ringkasan" class="menu-tautan is-aktif" aria-current="page">Ringkasan</a></li>
<li><a href="#transaksi" class="menu-tautan">Transaksi</a></li>
<li><a href="#" class="menu-tautan">Anggaran</a></li>
<li><a href="#" class="menu-tautan">Tabungan</a></li>
<li><a href="#" class="menu-tautan">Laporan</a></li>
</ul>
<p class="menu-judul" id="judul-menu-lain">Lainnya</p>
<ul class="menu-app" aria-labelledby="judul-menu-lain">
<li><a href="#" class="menu-tautan">Pengaturan</a></li>
<li><a href="#" class="menu-tautan">Bantuan</a></li>
</ul>
</nav>
<p class="sidebar-kaki">Versi latihan 1.0</p>
</aside>
<button type="button" class="tirai-samping" id="tirai-samping" aria-label="Tutup panel navigasi"></button>
<header class="kepala-app">
<button type="button" class="tombol-samping" id="tombol-samping" aria-expanded="false" aria-controls="sidebar-nav">☰ Menu</button>
<div class="kepala-teks">
<p class="kepala-sapaan">Selamat datang kembali, Rani</p>
<h1 class="kepala-judul">Ringkasan Keuangan</h1>
</div>
<p class="kepala-periode">November 2026</p>
</header>
<main class="isi-utama" id="ringkasan">
<section class="dasbor-ringkasan" aria-label="Kartu ringkasan keuangan">
<article class="kartu-ringkasan">
<p class="kartu-label">Saldo saat ini</p>
<p class="kartu-angka">Rp9.485.000</p>
<p class="kartu-tren tren tren--turun tren--negatif">0,8% dari bulan lalu</p>
</article>
<article class="kartu-ringkasan kartu-ringkasan--masuk">
<p class="kartu-label">Pemasukan bulan ini</p>
<p class="kartu-angka">Rp11.670.000</p>
<p class="kartu-tren tren tren--naik tren--positif">12,4% dari bulan lalu</p>
</article>
<article class="kartu-ringkasan kartu-ringkasan--keluar">
<p class="kartu-label">Pengeluaran bulan ini</p>
<p class="kartu-angka">Rp2.185.000</p>
<p class="kartu-tren tren tren--naik tren--negatif">5,2% dari bulan lalu</p>
</article>
</section>
<section class="seksi-transaksi" id="transaksi" aria-labelledby="judul-transaksi">
<div class="seksi-kepala">
<h2 class="seksi-judul" id="judul-transaksi">Transaksi Terakhir</h2>
<a class="tautan-lain" href="#">Lihat semua transaksi</a>
</div>
<div class="tabel-gulir">
<table class="tabel-transaksi">
<caption class="sr-only">Delapan transaksi terakhir pada November 2026</caption>
<thead>
<tr>
<th scope="col">Tanggal</th>
<th scope="col">Keterangan</th>
<th scope="col" class="kolom-kategori">Kategori</th>
<th scope="col" class="kolom-jumlah">Jumlah</th>
<th scope="col">Status</th>
</tr>
</thead>
<tbody>
<tr><td class="kolom-tanggal">18 Nov</td><td>Penjualan barang bekas</td><td class="kolom-kategori">Lainnya</td><td class="kolom-jumlah sel-masuk">+Rp420.000</td><td><span class="lencana-status lencana-status--masuk">Masuk</span></td></tr>
<tr><td class="kolom-tanggal">15 Nov</td><td>Ongkir belanja online</td><td class="kolom-kategori">Kebutuhan</td><td class="kolom-jumlah sel-keluar">−Rp35.000</td><td><span class="lencana-status lencana-status--keluar">Keluar</span></td></tr>
<tr><td class="kolom-tanggal">14 Nov</td><td>Makan siang kantor</td><td class="kolom-kategori">Makanan</td><td class="kolom-jumlah sel-keluar">−Rp275.000</td><td><span class="lencana-status lencana-status--keluar">Keluar</span></td></tr>
<tr><td class="kolom-tanggal">11 Nov</td><td>Tagihan listrik dan air</td><td class="kolom-kategori">Tagihan</td><td class="kolom-jumlah sel-keluar">−Rp486.000</td><td><span class="lencana-status lencana-status--keluar">Keluar</span></td></tr>
<tr><td class="kolom-tanggal">08 Nov</td><td>Proyek desain lepas</td><td class="kolom-kategori">Penghasilan</td><td class="kolom-jumlah sel-masuk">+Rp2.750.000</td><td><span class="lencana-status lencana-status--masuk">Masuk</span></td></tr>
<tr><td class="kolom-tanggal">05 Nov</td><td>Langganan streaming</td><td class="kolom-kategori">Hiburan</td><td class="kolom-jumlah sel-keluar">−Rp149.000</td><td><span class="lencana-status lencana-status--keluar">Keluar</span></td></tr>
<tr><td class="kolom-tanggal">03 Nov</td><td>Belanja bulanan supermarket</td><td class="kolom-kategori">Kebutuhan</td><td class="kolom-jumlah sel-keluar">−Rp1.240.000</td><td><span class="lencana-status lencana-status--keluar">Keluar</span></td></tr>
<tr><td class="kolom-tanggal">02 Nov</td><td>Gaji bulanan</td><td class="kolom-kategori">Penghasilan</td><td class="kolom-jumlah sel-masuk">+Rp8.500.000</td><td><span class="lencana-status lencana-status--masuk">Masuk</span></td></tr>
</tbody>
</table>
</div>
</section>
<p class="isi-kaki">Angka pada dasbor ini adalah contoh latihan; total pemasukan dikurangi pengeluaran cocok dengan saldo yang ditampilkan.</p>
</main>
</div>
</body>
</html>Ringkasan #
Sidebar kini berisi brand, dua kelompok menu bertanda aktif, dan catatan versi yang menempel di dasar kolom; status aktif ditandai ganda lewat is-aktif dan aria-current. Tombol sakelar dan tirai sudah menunggu di HTML dengan atribut ARIA lengkap. Bagian 3 melompat ke area utama: tiga kartu ringkasan yang menonjolkan angka Rupiah dengan tipografi tabular dan panah tren hasil gambaran ::before.