Dokumentasi
Card (Kartu)
1. CardProject
# Deskripsi
Kartu untuk menampilkan informasi proyek dengan thumbnail, judul, waktu, deskripsi, tech stack, dan link. Komponen ini menghasilkan URL otomatis berdasarkan judul proyek.
# Props
| Nama | Tipe | Wajib Ada | Penjelasan |
|---|---|---|---|
| src | string | any | ✅ | Sumber gambar thumbnail proyek |
| title | string | ✅ | Judul proyek |
| time | string | ✅ | Waktu/tanggal proyek dibuat |
| description | string | ✅ | Deskripsi singkat proyek |
| demo | string | ❌ | URL link demo proyek |
| source | string | ❌ | URL link source code (belum digunakan) |
| stack | string[] | ✅ | Array tech stack yang digunakan |
| category | string | ✅ | Kategori proyek (untuk filtering) |
# Contoh penggunaan
<CardProjectsrc="/images/projects/catatan-kas/thumbnail.png"title="Catatan Kas"time="2023"description="Dibuat untuk mencatat uang masuk dan keluar secara sederhana."demo="https://catatan-kas-web.vercel.app"stack={["React", "Vite", "TypeScript", "Tailwind CSS", "EmailJS"]}category="web app"/>
# Yang dihasilkan
2. CardBlog
# Deskripsi
Kartu untuk menampilkan artikel blog dengan thumbnail, judul, deskripsi ringkas, dan tanggal. Komponen ini mengekstrak src gambar dan konten dari HTML string.
# Props
| Nama | Tipe | Wajib Ada | Penjelasan |
|---|---|---|---|
| title | string | ✅ | Judul artikel blog |
| description | string | ✅ | Konten HTML artikel (untuk ekstraksi) |
| date | string | ✅ | Tanggal publikasi artikel |
| thumbnail | string | ✅ | HTML string yang mengandung tag img |
| link | string | ✅ | URL link artikel |
# Fitur
- Hover effect pada gambar (scale-up)
- Format tanggal otomatis (Jan 01, 2024)
- Ekstraksi deskripsi hingga 150 karakter dari HTML
# Contoh penggunaan
<CardBlogtitle="Article Title"description="<img src="/><p>Article content here...</p>" date="2024-06-02" thumbnail="<imgsrc="/image.jpg"/>" link="/blog/article-slug" />
# Yang dihasilkan
Badge
# Deskripsi
Komponen badge untuk menampilkan label atau tag. Umumnya digunakan untuk menampilkan tech stack atau kategori dalam ukuran kecil dengan styling yang konsisten.
# Props
| Nama | Tipe | Wajib Ada | Penjelasan |
|---|---|---|---|
| text | string | ✅ | Teks yang ditampilkan dalam badge |
# Contoh penggunaan
<Badgetext="React"/><Badgetext="Tailwind"/><Badgetext="TypeScript"/>
# Yang dihasilkan
LinkTo
# Deskripsi
Komponen link internal untuk navigasi dalam aplikasi. Menggunakan global state untuk memperbarui pathname saat link diklik. Ini memastikan state pathname terupdate dengan benar untuk keperluan navigasi aplikasi.
# Props
| Nama | Tipe | Wajib Ada | Penjelasan |
|---|---|---|---|
| href | string | ✅ | Path halaman yang dituju |
| children | React.ReactNode | ✅ | Konten yang ditampilkan sebagai link |
| className | string | ❌ | Kelas CSS tambahan |
# Contoh penggunaan
<LinkTohref="/projects">Lihat semua proyek</LinkTo><LinkTohref="/about"className="text-blue-600 font-semibold">Tentang saya</LinkTo>
# Yang dihasilkan
# Perbedaan dengan Next/Link
✅ LinkTo: Mengupdate global state pathname saat diklik
❌ Next/Link: Hanya navigasi ke halaman, tidak update pathname state
# Kapan menggunakan LinkTo
- Navigasi yang memerlukan update global state pathname
- Link internal di dalam aplikasi yang menggunakan useGlobalState
- Ketika Anda perlu melacak pathname untuk keperluan UI
# Implementation Detail
- Menggunakan hook useGlobalState
- Memicu setPathname saat link diklik
- Komponen adalah Client Component
ReadMd Component
1. Overview
# Deskripsi
Komponen ReadMd digunakan untuk membaca file markdown (.md) dari folder src/data/ dan menampilkannya sebagai HTML yang sudah di-render.
# Kegunaan
- Menampilkan konten dinamis dari file markdown
- Render markdown ke HTML dengan styling prose
- Membaca file markdown dari server-side
- Dukungan untuk gambar, formatting, dan styling markdown
2. Props
| Nama | Tipe | Wajib Ada | Penjelasan |
|---|---|---|---|
| post | string | ✅ | Nama folder di dalam src/data/ (contoh: "projects" atau "books") |
| fileName | string | ✅ | Nama file markdown dengan ekstensi .md (contoh: "catatan-kas.md") |
3. Contoh Penggunaan
# Struktur Folder
src/data/
├── projects/
│ ├── catatan-kas.md
│ ├── simado.md
│ └── ...
└── ...# Contoh: Membaca Project Detail
<ReadMdpost="projects"fileName="catatan-kas.md"/>
Menambahkan Project Baru
1. Struktur Folder
# Langkah 1: Buat Folder dan File Markdown
Setiap project membutuhkan folder di dalam src/data/projects/ dan file markdown untuk deskripsi detail project.
src/data/projects/
└── nama-project-baru.md ← Buat file ini# Format Nama
- Gunakan nama lowercase dengan pemisah dash (-)
- Contoh: my-awesome-project.md
2. Tambahkan Data di projectListData.ts
# Langkah 2: Tambah Objek Project
Buka file src/data/projectListData.ts dan tambahkan objek project baru dengan struktur berikut:
constprojectListData= [{title:'Project Title',category:'web',imageSrcFull:'/images/projects/project-folder/thumbnail.png',time:'Mei 2026',description:'Deskripsi singkat project',stack:['Technology1','Technology2','Technology3'],demo:'https://link-demo.vercel.app',source:'https://github.com/username/repo', // optional},// project lainnya...]
# Penjelasan Props
| Nama | Tipe | Wajib Ada | Penjelasan |
|---|---|---|---|
| title | string | ✅ | Judul project yang ditampilkan. Sebagai contoh jika title adalah "Catatan Kas" maka buatlah file pada direktori app/projects/(desc)/catatan-kas.tsx |
| category | string | ✅ | Kategori: "web", "web app", "game" |
| imageSrcFull | string | ✅ | Path ke gambar thumbnail di folder public/images/projects/ |
| time | string | ✅ | Waktu pembuatan (format: Bulan Tahun) |
| description | string | ✅ | Deskripsi singkat max 50 karakter |
| stack | string[] | ✅ | Array teknologi yang digunakan |
| demo | string | ✅ | URL link demo atau website |
| source | string | ❌ | URL GitHub repository (optional) |
3. Buat File Markdown untuk Detail
# Langkah 3: Buat File .md
Buat file markdown di src/data/projects/nama-project.md
4. Setup Folder Gambar
# Langkah 4: Buat Folder dan Upload Gambar
Buat folder untuk gambar project di public/images/projects/:
public/images/projects/
├── catatan-kas/
│ ├── thumbnail.png ← Gambar utama (untuk card)
│ ├── catatankas.webp ← Screenshot/preview
│ └── ...
├── nama-project-baru/ ← Buat folder baru
│ ├── thumbnail.png ← Gambar utama
│ ├── screenshot.webp ← Screenshot detail
│ └── ...
└── ...# Rekomendasi Gambar
- Thumbnail: Ukuran landscape (~640x400), format PNG/WebP
- Screenshot: Full screenshot project, format WebP untuk performa lebih baik

