You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Dokumen ini berfungsi sebagai standarisasi pengembangan Front-End menggunakan Vue 3 (Composition API), Inertia.js, dan Tailwind CSS. Setiap pengembang wajib mengikuti aturan ini demi konsistensi kode.
1. Basic Convention
camelCase untuk variabel, function, class, dan nama file .js / .ts.
PascalCase untuk semua nama file .vue (Komponen, Page, Layout).
kebab-case untuk penamaan CSS class kustom (jika tidak bisa menggunakan Tailwind).
Dilarang menggunakan Options API. Semua komponen wajib menggunakan <script setup>.
2. Struktur Folder & Arsitektur
Path
Fungsi
resources/css/app.css
Entrypoint utama CSS. Tempat registrasi Tailwind directives dan font global.
resources/css/*.css
Module CSS kustom (misal: typography.css, animations.css) untuk pemisahan fokus.
resources/js/app.js
Entrypoint utama JavaScript & Inisialisasi Inertia.js.
resources/js/bootstrap.js
Konfigurasi library pihak ketiga (Axios, Echo, dll).
resources/js/global.d.ts
Definisi Type/Interface TypeScript yang digunakan secara global di seluruh aplikasi.
resources/js/components/core
Komponen kustom yang bersifat reusable secara global (Button kustom, Input kustom).
resources/js/components/layout
Komponen pendukung layout besar (Navbar, Sidebar, Footer, UserMenu).
resources/js/components/module
Komponen spesifik yang hanya digunakan oleh satu fitur/modul tertentu.
resources/js/components/ui
Komponen dari Shadcn-Vue. Dilarang diubah secara langsung (Gunakan Wrapper di core jika butuh modifikasi).
Komponen halaman utama yang dirender oleh Inertia::render().
resources/js/utils
Tempat menyimpan helpers, composables, dan logika bisnis murni (pure functions).
resources/views/app.blade.php
Root template HTML. Tempat menyuntikkan @inertia dan @vite.
3. Cara Penamaan File
Jenis
Format
Contoh
Style Sheet
kebab-case
dark-theme.css
JS / TS File
camelCase
useCurrencyFormatter.ts
Vue Component
PascalCase
PrimaryButton.vue, UserDetailCard.vue
Folder Page
PascalCase
resources/js/pages/Event/Index.vue
4. Components
Seluruh komponen Vue disimpan di dalam resources/js/components dan dibagi menjadi empat kategori utama berdasarkan cakupan fungsinya (scope):
Folder
Deskripsi & Aturan
core/
Global Standalone: Komponen kustom dasar yang bersifat umum dan bisa digunakan di mana saja (misal: SubmitButton.vue, StatusBadge.vue).
layout/
Structural: Komponen pendukung yang hanya digunakan di dalam folder resources/js/layouts (misal: Navbar.vue, AuthSidebar.vue).
module/
Feature Specific: Komponen yang hanya digunakan oleh modul/fitur tertentu agar tidak mengotori namespace global (misal: EventCard.vue di modul Event).
ui/
Shadcn-Vue Base: Komponen asli dari library Shadcn. Dilarang keras mengubah file di sini. Jika butuh kustomisasi, buat wrapper di folder core.
Aturan Teknis Penulisan Komponen:
Reaktivitas: Wajib menggunakan Composition API (<script setup>). Gunakan ref() untuk data primitif (string, number, boolean) dan reactive() untuk objek/array yang kompleks.
Props: Definisikan props secara eksplisit menggunakan generic TypeScript defineProps<{ ... }>() untuk type-safety yang maksimal di IDE.
Emits: Dokumentasikan setiap event yang dikirimkan ke parent component menggunakan defineEmits(['change', 'submit']) agar alur data antar komponen jelas.
Styling: Prioritaskan Tailwind Utility Classes. Penggunaan <style scoped> hanya diperbolehkan jika harus menimpa (override) library pihak ketiga yang
Type safety: Selalu gunakan lang="ts" di <script setup lang="ts"> agar memudahkan type safety, dan terhindarkan dari tipe data error ketika berjalan (runtime)
5. Layouts & Pages
Persistent Layout: Gunakan pola layout: AppLayout di dalam Page agar state layout (seperti scroll sidebar) tidak ter-reset saat navigasi.
Data Fetching: Data harus mengalir dari Laravel Controller via Inertia Props. Hindari melakukan axios.get di dalam onMounted kecuali untuk data yang sangat dinamis (non-SEO).
SEO: Gunakan komponen <Head> dari @inertiajs/vue3 untuk setiap Page guna mengatur <title> dan <meta> tags.
6. Utils & Composables
Logic Separation: Pisahkan logika yang rumit ke dalam Composables (resources/js/utils/composables). Gunakan prefix use. Contoh: useEventValidation.ts.
Formatting: Gunakan helper untuk hal-hal repetitif seperti formatDate() atau formatCurrency().
7. TypeScript Standard
No Any: Penggunaan any sangat dilarang. Gunakan unknown atau buatkan interface khusus jika tipe data belum pasti.
Naming: Nama Interface/Type harus menggunakan PascalCase. Contoh: interface UserData { ... }.
Prop Safety: Manfaatkan PropType jika mendefinisikan props secara manual di luar TypeScript generic.