Files
2026-08-27 19:45:15 +07:00

357 lines
19 KiB
Markdown

# πŸ—ΊοΈ Ready to Plan Tour (RPT)
[![React](https://img.shields.io/badge/React-18.x-61DAFB?style=flat&logo=react&logoColor=black)](https://react.dev/)
[![Vite](https://img.shields.io/badge/Vite-5.x-646CFF?style=flat&logo=vite&logoColor=white)](https://vitejs.dev/)
[![Zustand](https://img.shields.io/badge/State-Zustand%20%2B%20Persist-443e38?style=flat)](https://zustand-demo.pmnd.rs/)
[![Framer Motion](https://img.shields.io/badge/Animations-Framer%20Motion-0055FF?style=flat&logo=framer&logoColor=white)](https://www.framer.com/motion/)
[![Recharts](https://img.shields.io/badge/Charts-Recharts-22b5bf?style=flat)](https://recharts.org/)
[![Dnd Kit](https://img.shields.io/badge/Drag%20%26%20Drop-@dnd--kit-FC4A60?style=flat)](https://dndkit.com/)
[![License](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
**Ready to Plan Tour (RPT)** adalah aplikasi *static web* perencanaan perjalanan wisata yang modern, kreatif, dan interaktif. Aplikasi ini dirancang untuk mempermudah pengguna menyusun seluruh aspek liburanβ€”mulai dari memilih destinasi, menyusun jadwal harian per jam, mengelola daftar barang bawaan (*packing list*), hingga menghitung estimasi anggaran budget secara *real-time*.
Aplikasi ini berjalan **100% di sisi klien (static web app tanpa backend, tanpa login/logout)** dengan sistem penyimpanan data otomatis ke `localStorage` browser.
---
## πŸ“Œ Daftar Isi
1. [Fitur Utama](#-fitur-utama)
2. [Detail Teknologi yang Digunakan](#-detail-teknologi-yang-digunakan)
3. [Arsitektur & Struktur Folder](#-arsitektur--struktur-folder)
4. [Persyaratan Sistem (Prerequisites)](#-persyaratan-sistem-prerequisites)
5. [Cara Instalasi & Menjalankan Aplikasi](#-cara-instalasi--menjalankan-aplikasi)
6. [Alur State Management & Penyimpanan Data](#-alur-state-management--penyimpanan-data)
7. [Panduan Penggunaan Fitur](#-panduan-penggunaan-fitur)
---
## ✨ Fitur Utama
### 1. 🧭 Trip Selection & Exploration (Home Page)
- **Hero Section Visual:** Tipografi artistik Google Font *Playfair Display*, background *radial glow gradients*, dan lencana sorotan fitur.
- **Koleksi 10+ Destinasi Populer:** Menampilkan destinasi eksotis Indonesia (Bali, Labuan Bajo, Jogja, Bromo, Raja Ampat, Bandung, Lombok) dan internasional (Tokyo, Seoul, Swiss Alps).
- **Pencarian & Filter Cepat:** Filter instan berdasarkan kategori (*Pantai & Laut*, *Gunung & Alam*, *Budaya & Heritage*, *Kota Metropolitan*) serta sorting (*Paling Populer*, *Rating Tertinggi*, *Budget Terendah*, *Durasi Singkat*).
- **Konfigurasi Trip Dinamis:** Form pengaturan nama trip, pemilihan rentang tanggal (auto-kalkulasi durasi hari), dan estimasi alokasi target budget.
- **Trip Kustom Bebas:** Opsi merancang rencana perjalanan ke destinasi mana pun dengan cover foto dan preferensi kustom.
### 2. πŸ“… Daily Schedule Builder (`/schedule`)
- **Navigasi Tab Per Hari:** Tab interaktif (*Hari 1, Hari 2, ... Hari N*) dengan badge tanggal terformat dalam bahasa Indonesia dan counter aktivitas.
- **Drag & Drop Interaktif (`@dnd-kit`):** Mengurutkan dan memindahkan jadwal aktivitas dengan sentuhan atau klik mouse (terproteksi sensor threshold 5px).
- **Detail Aktivitas Kaya:** Jam mulai, durasi menit, garis warna & badge kategori (*Wisata, Kuliner, Transportasi, Hotel, Belanja, Santai, Lainnya*), lokasi kunjungan, dan catatan khusus.
- **Template Aktivitas Cepat:** Menambahkan agenda umum hanya dalam 1 klik (*Sarapan Pagi, Check-in Hotel, Kunjungan Wisata, Makan Siang, Sunset Golden Hour, Makan Malam, Belanja Oleh-oleh*).
- **Perpanjangan Hari Dinamis:** Tombol *"+ Tambah Hari"* untuk menambah durasi hari liburan kapan saja.
### 3. πŸŽ’ Packing List Manager (`/packing`)
- **Visual Progress Bar Dinamis:** Menghitung persentase kesiapan barang secara *real-time* lengkap dengan status dinamis dan pesan selebrasi otomatis saat mencapai 100%.
- **4 Template Bawaan Sesuai Tipe Trip:** Memuat template packing bawaan khusus *Trip Pantai*, *Trip Gunung*, *Trip Kota*, atau *Trip Budaya*.
- **6 Kategori Perlengkapan:** *Pakaian, Dokumen, Elektronik, Obat-obatan, Toiletries, Lainnya*.
- **Kontrol Interaktif:** Checkbox animasi spring Framer Motion, efek strikethrough, quantity counter (`- / +`), tombol *Centang Semua / Batalkan Semua*, dan form inline tambah item baru.
- **Live Search Filter:** Pencarian nama barang secara instan.
### 4. πŸ’° Budget Calculator (`/budget`)
- **3 Kartu Ringkasan Anggaran:** *Target Total Budget* (dapat diedit langsung), *Total Pengeluaran Terpakai*, dan *Sisa Budget* dengan indikator warna cerdas:
- 🟒 **Hijau (*Aman & Terkendali*)** saat dana masih mencukupi.
- 🟑 **Kuning (*Mendekati Batas*)** saat pengeluaran mencapai $\ge 80\%$.
- πŸ”΄ **Merah (*Over Budget!*)** saat pengeluaran melampaui batas anggaran.
- **Banner Peringatan Defisit:** Muncul otomatis dengan nominal defisit saat over-budget.
- **Visualisasi Grafik Recharts:**
- πŸ₯§ **Donut / Pie Chart:** Proporsi pengeluaran berdasarkan pos kategori dengan legend persentase & custom glassmorphism tooltip.
- πŸ“Š **Bar Chart:** Distribusi pengeluaran per hari perjalanan (*Hari ke-1, Hari ke-2*, dst.).
- **Multi-Currency Toggle:** Kemudahan beralih antara mata uang **IDR** (Rupiah), **USD** (\$), dan **EUR** (€).
- **Riwayat Pengeluaran:** Filter kategori pengeluaran, pengelompokan hari ke-N, modal edit, dan hapus transaksi.
### 5. πŸ”” Toast Notification & Utility System
- **Global Toast Notification:** Notifikasi mengambang (*Floating Toast*) dengan animasi geser untuk feedback aksi sukses, info, peringatan, atau penghapusan data.
- **Modal Konfirmasi Reset Trip:** Fitur reset data yang aman dengan dialog konfirmasi sebelum menghapus memori `localStorage`.
- **Navigasi Sticky Glassmorphism:** Header navigasi transparan dengan drawer menu responsif di smartphone/tablet.
---
## πŸ› οΈ Detail Teknologi yang Digunakan
Aplikasi ini dibangun menggunakan arsitektur modern web berbasis komponen tanpa ketergantungan pada backend server:
| Teknologi / Library | Versi | Peran & Alasan Penggunaan |
|---|---|---|
| **React.js** | `^18.x` | Library inti antarmuka berbasis komponen modular (*functional components* dan *React Hooks*). |
| **Vite** | `^5.x` | Build tool dan bundler super cepat dengan fitur *Hot Module Replacement (HMR)* instan untuk pengembangan frontend modern. |
| **React Router DOM** | `^6.x` | Pengatur navigasi dan routing multi-halaman sisi klien (*Client-Side Routing*) tanpa *page reload*. |
| **Zustand** | `^4.x` | Library manajemen state global yang ringan, fleksibel, dan memiliki performa tinggi tanpa boilerplate seperti Redux. |
| **Zustand Persist Middleware** | Bawaan Zustand | Menyimpan dan menyinkronkan seluruh state aplikasi ke `localStorage` secara otomatis agar data tidak hilang saat browser di-refresh. |
| **Framer Motion** | `^11.x` | Mesin animasi deklaratif untuk transisi halaman, efek hover (*micro-interactions*), modal pop-up spring, dan animasi checkbox. |
| **@dnd-kit/core & @dnd-kit/sortable** | `^6.x / ^7.x` | Library drag and drop modern, teroptimasi performa, dan mendukung aksesibilitas keyboard serta touch screen di mobile. |
| **Recharts** | `^2.x` | Library visualisasi data berbasis SVG deklaratif untuk menggambar Donut/Pie Chart kategori dan Bar Chart anggaran per hari. |
| **Lucide React** | Latest | Kumpulan ikon SVG modern, konsisten, tajam, dan ringan. |
| **date-fns** | `^3.x` | Library utilitas manipulasi tanggal untuk format tanggal bahasa Indonesia (`date-fns/locale/id`) dan perhitungan selisih hari. |
| **CSS Variables & Glassmorphism** | Vanilla CSS | Desain token HSL murni, efek *backdrop-filter blur*, bayangan glow, dan tata letak CSS Grid/Flexbox yang responsif tanpa dependensi CSS framework berat. |
---
## πŸ“ Arsitektur & Struktur Folder
```
tour-destination/
β”œβ”€β”€ index.html # File HTML utama, memuat Google Fonts (Inter, Outfit, Playfair Display)
β”œβ”€β”€ package.json # Konfigurasi dependensi project dan script npm
β”œβ”€β”€ vite.config.js # Konfigurasi Vite & React plugin
β”œβ”€β”€ README.md # Dokumentasi lengkap proyek
β”œβ”€β”€ AGENTS.md # Pedoman dan konteks pengerjaan AI Agent
β”œβ”€β”€ task.md # Tracking status fase pengerjaan (Phase 0 - 6)
β”‚
β”œβ”€β”€ .agents/ # Direktori aturan dan skill AI
β”‚ β”œβ”€β”€ rules/
β”‚ β”‚ β”œβ”€β”€ coding-standards.md # Aturan baku penulisan kode
β”‚ β”‚ └── phase-workflow.md # Alur pengerjaan berfase
β”‚ └── skills/ # Skill cheatsheets (react-component, state-management, ui-design, feature-guide)
β”‚
β”œβ”€β”€ public/ # File aset statis publik (favicon, svg icons)
β”‚
└── src/
β”œβ”€β”€ main.jsx # Entry point aplikasi React
β”œβ”€β”€ App.jsx # Root component, konfigurasi React Router & Global Toast
β”œβ”€β”€ index.css # Design System utama (CSS Variables, Typography, Glassmorphism, Utilities)
β”‚
β”œβ”€β”€ components/ # Komponen antarmuka modular
β”‚ β”œβ”€β”€ layout/
β”‚ β”‚ β”œβ”€β”€ Navbar.jsx # Header sticky glassmorphism + mobile drawer + Reset Modal
β”‚ β”‚ β”œβ”€β”€ Footer.jsx # Footer branding, link navigasi, dan info trip aktif
β”‚ β”‚ └── PageWrapper.jsx # Wrapper transisi halaman Framer Motion
β”‚ β”‚
β”‚ β”œβ”€β”€ ui/ # Komponen UI atomik
β”‚ β”‚ β”œβ”€β”€ Button.jsx # Tombol multi-variant, loading spinner, whileHover & whileTap
β”‚ β”‚ β”œβ”€β”€ Card.jsx # Kartu glassmorphism dengan efek hover lift
β”‚ β”‚ β”œβ”€β”€ Modal.jsx # Modal dialog interaktif dengan focus trap & escape key
β”‚ β”‚ β”œβ”€β”€ Badge.jsx # Badge status dan kategori
β”‚ β”‚ β”œβ”€β”€ ProgressBar.jsx # Progress bar animasi dengan gradient dinamis
β”‚ β”‚ β”œβ”€β”€ EmptyState.jsx # Tampilan placeholder saat data kosong
β”‚ β”‚ └── ToastContainer.jsx # Wadah notifikasi mengambang (Floating Toasts)
β”‚ β”‚
β”‚ β”œβ”€β”€ trip/ # Komponen fitur Trip Selection
β”‚ β”‚ β”œβ”€β”€ HeroSection.jsx # Banner hero dengan tipografi Playfair Display & CTA
β”‚ β”‚ β”œβ”€β”€ FilterBar.jsx # Search bar, filter pills kategori, dan dropdown sorting
β”‚ β”‚ β”œβ”€β”€ TripCard.jsx # Kartu destinasi 16:10 dengan overlay & hover effects
β”‚ β”‚ β”œβ”€β”€ TripModal.jsx # Modal konfigurasi destinasi preset
β”‚ β”‚ └── CustomTripModal.jsx# Modal pembuatan rencana trip kustom
β”‚ β”‚
β”‚ β”œβ”€β”€ schedule/ # Komponen fitur Daily Schedule
β”‚ β”‚ β”œβ”€β”€ DayTabs.jsx # Tab navigasi hari + tombol tambah hari
β”‚ β”‚ β”œβ”€β”€ ScheduleTimeline.jsx # Timeline vertikal terintegrasi DnD Kit
β”‚ β”‚ β”œβ”€β”€ ActivityItem.jsx # Item aktivitas draggable dengan kategori stripe & actions
β”‚ β”‚ └── AddActivityModal.jsx# Modal form tambah & edit aktivitas + template cepat
β”‚ β”‚
β”‚ β”œβ”€β”€ packing/ # Komponen fitur Packing List
β”‚ β”‚ β”œβ”€β”€ PackingOverview.jsx# Widget ringkasan progress % & status selebrasi
β”‚ β”‚ β”œβ”€β”€ PackingCategory.jsx# Accordion kategori collapsible dengan form inline
β”‚ β”‚ β”œβ”€β”€ PackingItem.jsx # Item checklist dengan animasi checkbox & counter kuantitas
β”‚ β”‚ └── TemplateModal.jsx # Modal pemilihan template bawaan (Pantai, Gunung, Kota, Budaya)
β”‚ β”‚
β”‚ └── budget/ # Komponen fitur Budget Calculator
β”‚ β”œβ”€β”€ BudgetOverview.jsx # 3 Kartu statistik alokasi & status over-budget
β”‚ β”œβ”€β”€ BudgetChart.jsx # Donut Pie Chart & Bar Chart Recharts
β”‚ β”œβ”€β”€ AddExpenseModal.jsx# Form modal catat & edit pengeluaran
β”‚ └── ExpenseList.jsx # Daftar rincian pengeluaran dengan filter kategori
β”‚
β”œβ”€β”€ pages/ # Halaman rute utama
β”‚ β”œβ”€β”€ Home.jsx # Halaman pilih destinasi & eksplorasi trip
β”‚ β”œβ”€β”€ Schedule.jsx # Halaman susun jadwal harian (Drag & Drop)
β”‚ β”œβ”€β”€ PackingList.jsx # Halaman checklist barang bawaan
β”‚ └── Budget.jsx # Halaman kalkulator & grafik pengeluaran
β”‚
β”œβ”€β”€ store/ # Global State Management (Zustand)
β”‚ β”œβ”€β”€ tourStore.js # Store utama (trip, schedule, packingList, budget) + localStorage persist
β”‚ └── toastStore.js # Store notifikasi toast
β”‚
β”œβ”€β”€ hooks/ # Custom React Hooks
β”‚ β”œβ”€β”€ useTripStore.js # Hook pengelolaan data trip
β”‚ β”œβ”€β”€ useSchedule.js # Hook manipulasi jadwal & aktivitas
β”‚ β”œβ”€β”€ usePackingList.js # Hook pengelolaan packing list & kalkulasi persentase
β”‚ └── useBudget.js # Hook kalkulasi budget, pengeluaran, dan breakdown
β”‚
β”œβ”€β”€ data/ # Dataset dummy & template bawaan
β”‚ β”œβ”€β”€ destinations.js # 10 data destinasi unggulan beserta foto & info
β”‚ β”œβ”€β”€ activities.js # Kategori aktivitas, warna, dan template cepat
β”‚ └── packingTemplates.js # Template packing (pantai, gunung, kota, budaya)
β”‚
└── utils/ # Fungsi utilitas pembantu
β”œβ”€β”€ formatCurrency.js # Formatter IDR, USD, EUR
β”œβ”€β”€ dateHelpers.js # Format tanggal Indonesia & kalkulasi durasi hari
└── helpers.js # Generator ID unik, clamp, dan truncate text
```
---
## πŸ’» Persyaratan Sistem (Prerequisites)
Sebelum menjalankan aplikasi, pastikan komputer Anda telah terinstal:
- **Node.js**: Versi `18.x` atau lebih baru (Disarankan versi LTS).
- **npm** (Node Package Manager) versi `9.x` atau yang lebih baru (otomatis terpasang bersama Node.js) atau **yarn** / **pnpm**.
- **Browser Modern**: Google Chrome, Microsoft Edge, Mozilla Firefox, Brave, atau Safari versi terbaru.
Untuk mengecek instalasi Node.js dan npm di terminal:
```bash
node -v
npm -v
```
---
## πŸš€ Cara Instalasi & Menjalankan Aplikasi
Ikuti langkah-langkah mudah berikut untuk menjalankan aplikasi di komputer lokal:
### 1. Masuk ke Direktori Project
Buka Terminal / Command Prompt / PowerShell, lalu arahkan ke folder proyek:
```bash
cd "lokasi proyek"
```
### 2. Install Dependensi Proyek
Jalankan perintah berikut untuk mengunduh seluruh package yang dibutuhkan:
```bash
npm install
```
### 3. Jalankan Development Server
Mulai server pengembangan lokal dengan perintah:
```bash
npm run dev
```
Output di terminal akan menampilkan URL lokal seperti berikut:
```text
VITE v5.x.x ready in 250 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
```
### 4. Buka Aplikasi di Browser
Buka peramban web Anda dan akses alamat:
πŸ‘‰ **[http://localhost:5173/](http://localhost:5173/)**
---
## πŸ“¦ Build untuk Produksi (Production Build)
Jika Anda ingin membuat bundle produksi yang telah dioptimasi (*minified & compressed*):
```bash
# Membuat bundle produksi di folder /dist
npm run build
# Menjalankan preview lokal dari hasil build produksi
npm run preview
```
Hasil build di folder `dist/` berupa file HTML, JS, dan CSS statis murni yang siap di-*deploy* ke hosting statis seperti **Vercel**, **Netlify**, **GitHub Pages**, atau **Cloudflare Pages**.
---
## πŸ”„ Alur State Management & Penyimpanan Data
Aplikasi menggunakan **Zustand** yang dikombinasikan dengan middleware `persist`. Seluruh perubahan data langsung disinkronkan ke `localStorage` browser pengguna dengan kunci:
`tour-planner-storage`
```mermaid
graph TD
A[Pengguna Berinteraksi di UI] --> B[Memanggil Action di Zustand Store]
B --> C[State Terupdate Secara Reaktif di Komponen]
B --> D[Middleware Persist Menyimpan State ke localStorage]
D --> E[(Browser localStorage)]
E -.->|Saat Halaman Direfresh / Dibuka Kembali| B
```
### Struktur Skema Data:
```javascript
{
trip: {
id: 'dest-bali-01',
name: 'Liburan Impian ke Bali',
destination: 'Bali (Island of Gods)',
location: 'Bali, Indonesia',
startDate: '2026-08-27',
endDate: '2026-08-30',
totalDays: 4,
coverImage: 'https://images.unsplash.com/...',
type: 'preset', // 'preset' | 'custom'
category: 'pantai'
},
schedule: [
{
dayNumber: 1,
date: '2026-08-27',
activities: [
{
id: 'act-uuid',
time: '08:00',
name: 'Sarapan Pagi di Kafe Pantai',
location: 'Sanur Beach',
duration: 60,
category: 'makan',
notes: 'Mencoba menu lokal'
}
]
}
],
packingList: {
Pakaian: [{ id: 'item-1', name: 'Baju renang', qty: 2, checked: true }],
Dokumen: [{ id: 'item-2', name: 'KTP / Paspor', qty: 1, checked: false }],
Elektronik: [],
'Obat-obatan': [],
Toiletries: [],
Lainnya: []
},
budget: {
total: 5000000,
currency: 'IDR',
expenses: [
{
id: 'exp-1',
name: 'Tiket Pesawat PP',
amount: 1800000,
category: 'transportasi',
day: 1,
notes: 'Penerbangan pagi'
}
]
}
}
```
---
## πŸ“– Panduan Penggunaan Fitur
1. **Memulai Perjalanan Baru:**
- Masuk ke halaman utama (*Home*).
- Pilih salah satu destinasi kartu wisata atau klik tombol **"Buat Trip Kustom"**.
- Tentukan nama rencana trip, tanggal mulai & selesai (durasi hari otomatis dihitung), dan target budget.
- Klik **"Mulai Buat Jadwal"**.
2. **Menyusun Jadwal Harian:**
- Pilih tab **Hari 1, Hari 2, dst.**
- Klik tombol **"Tambah Aktivitas"** atau klik **Template Cepat** (*Sarapan, Check-in, Wisata, dll.*).
- Ubah urutan aktivitas dengan cara men-drag icon titik di sebelah kiri kartu aktivitas.
3. **Mengelola Checklist Barang Bawaan:**
- Buka menu **Packing List**.
- Template barang akan otomatis terisi sesuai kategori trip (dapat diganti melalui tombol *Template Bawaan*).
- Klik pada item untuk menandai barang yang sudah masuk ke koper.
- Gunakan tombol `+` / `-` untuk menyesuaikan jumlah barang.
4. **Memantau Pengeluaran & Anggaran:**
- Buka menu **Budget**.
- Klik tombol **"Ubah"** pada Target Total Budget untuk menyesuaikan batas anggaran.
- Klik **"Tambah Biaya"** untuk mencatat tiket, hotel, makanan, atau belanja oleh-oleh.
- Pantau grafik lingkaran (*Pie Chart*) untuk melihat kategori yang paling banyak menyerap anggaran.
---
## πŸ“„ Lisensi
Proyek ini dilisensikan di bawah **MIT License**. Bebas dikembangkan dan dimodifikasi untuk keperluan edukasi, portofolio, maupun produksi.
---
*Ready to Plan Tour (RPT) β€” Rencanakan Liburan Impianmu dengan Mudah, Cerdas, dan Terstruktur.*