357 lines
19 KiB
Markdown
357 lines
19 KiB
Markdown
# πΊοΈ Ready to Plan Tour (RPT)
|
|
|
|
[](https://react.dev/)
|
|
[](https://vitejs.dev/)
|
|
[](https://zustand-demo.pmnd.rs/)
|
|
[](https://www.framer.com/motion/)
|
|
[](https://recharts.org/)
|
|
[](https://dndkit.com/)
|
|
[](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.*
|