emrsyah/ARMETA-FE

โ˜… 0Forks 1TypeScriptGitHub โ†—Compare

Project website โ†—

README

ARMETA - Panduan Onboarding untuk Programmer Pemula

Selamat datang di proyek ARMETA! Dokumen ini akan membantu programmer pemula memahami struktur proyek, sistem yang digunakan, dan cara berkontribusi dalam pengembangan aplikasi ini.

๐Ÿ“‹ Daftar Isi

๐Ÿš€ Memulai

Persyaratan Sistem

  • Node.js 18+
  • pnpm sebagai package manager
  • Git untuk version control

Setup Proyek

# Clone repository
git clone <repository-url>
cd armeta

# Install dependencies
pnpm install

# Jalankan development server
pnpm dev

# Aplikasi akan berjalan di http://localhost:3000

Build untuk Production

# Build aplikasi
pnpm build

# Preview production build
pnpm serve

๐ŸŽจ Sistem Desain (Shadcn & Tailwind)

Proyek ini menggunakan kombinasi Shadcn/ui dan Tailwind CSS v4 untuk sistem desain yang konsisten dan modern.

Konfigurasi Shadcn

  • Style: New York (dari shadcn/ui)
  • CSS Variables: Ya, dengan dukungan dark mode
  • Icon Library: Lucide React
  • Base Color: Slate

Konfigurasi terdapat di components.json:

{
  "style": "new-york",
  "rsc": false,
  "tsx": true,
  "tailwind": {
    "config": "",
    "css": "src/styles.css",
    "baseColor": "slate",
    "cssVariables": true,
    "prefix": ""
  },
  "iconLibrary": "lucide",
  "aliases": {
    "components": "@/components",
    "utils": "@/lib/utils",
    "ui": "@/components/ui"
  }
}

Menggunakan Shadcn Components

import { Button } from "@/components/ui/button"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"

// Menggunakan component dengan variants
<Button variant="default" size="sm">Klik Saya</Button>

// Menggunakan dengan custom className
<Card className="w-full max-w-md">
  <CardHeader>
    <CardTitle>Judul Card</CardTitle>
  </CardHeader>
  <CardContent>
    <p>Konten card di sini</p>
  </CardContent>
</Card>

Tailwind CSS v4 Features

  • CSS Variables: Semua warna menggunakan CSS custom properties
  • OKLCH Color Space: Untuk warna yang lebih akurat
  • Dark Mode: Didukung dengan class .dark
  • Custom Variants: @custom-variant dark (&:is(.dark *))

Tema Warna

Tema menggunakan OKLCH color space dengan dukungan light/dark mode. Variabel CSS didefinisikan di src/styles.css.

๐Ÿ›ฃ๏ธ Sistem Routing

Proyek menggunakan TanStack Router dengan file-based routing system.

Struktur Route

Routes dikelola di folder src/routes/ dengan pola file-based routing:

src/routes/
โ”œโ”€โ”€ __root.tsx          # Root layout
โ”œโ”€โ”€ index.tsx           # Route utama (/)
โ””โ”€โ”€ (app)/              # Route group untuk app
    โ”œโ”€โ”€ a.tsx           # Layout untuk /a/*
    โ”œโ”€โ”€ a.home.tsx      # Route /a/home
    โ”œโ”€โ”€ a.courses.tsx   # Route /a/courses
    โ”œโ”€โ”€ a.forum.tsx     # Route /a/forum
    โ””โ”€โ”€ a.arme.tsx      # Route /a/arme

Membuat Route Baru

  1. Buat file route di src/routes/ dengan pola:

    • nama-route.tsx untuk route sederhana
    • (group)/nama-route.tsx untuk grouped routes
    • __layout.tsx untuk layout routes
  2. Contoh route file:

// src/routes/(app)/a.new-feature.tsx
import { createFileRoute } from '@tanstack/react-router'

export const Route = createFileRoute('/(app)/a/new-feature')({
  component: NewFeaturePage,
})

function NewFeaturePage() {
  return (
    <div>
      <h1>Fitur Baru</h1>
      <p>Konten fitur baru di sini</p>
    </div>
  )
}

Navigasi

import { useNavigate, Link } from '@tanstack/react-router'

function MyComponent() {
  const navigate = useNavigate()

  // Programmatic navigation
  const handleClick = () => {
    navigate({ to: '/a/home' })
  }

  return (
    <div>
      {/* Declarative navigation */}
      <Link to="/a/home">Ke Beranda</Link>

      {/* Button navigation */}
      <button onClick={handleClick}>
        Navigasi ke Home
      </button>
    </div>
  )
}

Layout Routes

Route dengan <Outlet /> akan me-render child routes:

// src/routes/(app)/a.tsx
import { createFileRoute, Outlet } from '@tanstack/react-router'
import { SidebarProvider, SidebarInset } from '@/components/ui/sidebar'

export const Route = createFileRoute('/(app)/a')({
  component: AppLayout,
})

function AppLayout() {
  return (
    <SidebarProvider>
      <AppSidebar />
      <SidebarInset>
        <TopNavigation />
        <div className="flex flex-1 flex-col gap-4 p-4">
          <Outlet /> {/* Child routes akan di-render di sini */}
        </div>
      </SidebarInset>
    </SidebarProvider>
  )
}

๐Ÿ“ Konvensi Penamaan File

Route Files

  • Pola: prefix.nama-route.tsx
  • Contoh: a.home.tsx, a.courses.tsx, (auth).login.tsx
  • Keterangan: Menggunakan titik sebagai separator, kebab-case

Component Files

  • UI Components: kebab-case (contoh: app-sidebar.tsx, top-navigation.tsx)
  • Hook Files: camelCase dengan prefix use (contoh: use-mobile.ts)

Folder Structure

  • Components: src/components/
  • UI Components: src/components/ui/ (shadcn components)
  • Routes: src/routes/
  • Hooks: src/hooks/
  • Utilities: src/lib/

๐Ÿ“ Struktur Folder

src/
โ”œโ”€โ”€ components/          # Komponen aplikasi
โ”‚   โ”œโ”€โ”€ ui/             # Shadcn UI components
โ”‚   โ”‚   โ”œโ”€โ”€ button.tsx
โ”‚   โ”‚   โ”œโ”€โ”€ sidebar.tsx
โ”‚   โ”‚   โ””โ”€โ”€ ...
โ”‚   โ”œโ”€โ”€ app-sidebar.tsx
โ”‚   โ”œโ”€โ”€ navigation.tsx
โ”‚   โ””โ”€โ”€ top-navigation.tsx
โ”œโ”€โ”€ hooks/              # Custom hooks
โ”‚   โ””โ”€โ”€ use-mobile.ts
โ”œโ”€โ”€ lib/                # Utilities & helpers
โ”‚   โ””โ”€โ”€ utils.ts
โ”œโ”€โ”€ routes/             # File-based routes
โ”‚   โ”œโ”€โ”€ __root.tsx      # Root route
โ”‚   โ”œโ”€โ”€ index.tsx       # Home route
โ”‚   โ””โ”€โ”€ (app)/          # App route group
โ”‚       โ”œโ”€โ”€ a.tsx       # App layout
โ”‚       โ”œโ”€โ”€ a.home.tsx
โ”‚       โ”œโ”€โ”€ a.courses.tsx
โ”‚       โ”œโ”€โ”€ a.forum.tsx
โ”‚       โ””โ”€โ”€ a.arme.tsx
โ”œโ”€โ”€ router.tsx          # Router configuration
โ”œโ”€โ”€ routeTree.gen.ts    # Generated route tree
โ””โ”€โ”€ styles.css          # Global styles & Tailwind config

Path Aliases

Konfigurasi alias di tsconfig.json:

{
  "baseUrl": ".",
  "paths": {
    "@/*": ["./src/*"],
    "~/*": ["./public/*"]
  }
}

Penggunaan:

import { Button } from "@/components/ui/button"    // src/components/ui/button
import logo from "~/logo.svg"                      // public/logo.svg

๐Ÿ”’ Commitlint

Status: Tidak dikonfigurasi dalam proyek ini

Commitlint biasanya digunakan untuk memastikan pesan commit mengikuti konvensi tertentu. Untuk menambahkan commitlint di masa depan:

# Install dependencies
pnpm add -D @commitlint/cli @commitlint/config-conventional husky

# Setup husky
pnpm exec husky init

# Create commitlint config
echo "module.exports = { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js

# Add commit-msg hook
echo "pnpm exec commitlint --edit \$1" > .husky/commit-msg

Conventional Commits

Jika commitlint dikonfigurasi, ikuti pola:

type(scope): description

# Contoh:
feat(auth): add login functionality
fix(ui): resolve button hover state
docs(readme): update installation guide

๐Ÿ› ๏ธ Teknologi Utama

Frontend Framework

  • React 19: Latest React with concurrent features
  • TypeScript: Type-safe development
  • Vite: Fast build tool dan dev server

UI & Styling

  • Tailwind CSS v4: Utility-first CSS framework
  • Shadcn/ui: High-quality React components
  • Lucide React: Beautiful icon library
  • Radix UI: Accessible UI primitives

Routing & State

  • TanStack Router: File-based routing untuk React
  • TanStack Devtools: Development debugging tools

Build & Development

  • Vite: Fast development dan build tool
  • Vitest: Unit testing framework
  • ESLint + TypeScript: Code quality tools

Package Management

  • pnpm: Efficient package manager
  • TypeScript Paths: Path aliases untuk clean imports

๐Ÿ“œ Scripts yang Tersedia

{
  "scripts": {
    "dev": "vite dev --port 3000",    // Development server
    "build": "vite build",            // Production build
    "serve": "vite preview",          // Preview production build
    "test": "vitest run"              // Run tests
  }
}

๐ŸŽฏ Best Practices

1. Component Structure

  • Gunakan functional components dengan hooks
  • Pisahkan logic ke custom hooks jika kompleks
  • Export named exports, bukan default

2. Styling

  • Prioritas Tailwind classes untuk styling
  • Gunakan CSS variables untuk tema
  • Ikuti design system dari shadcn/ui

3. File Organization

  • Satu component per file
  • Group related components dalam folder
  • Export dari index.ts untuk clean imports

4. TypeScript

  • Selalu gunakan type annotations
  • Manfaatkan utility types dari React/TypeScript
  • Import types dengan prefix type

5. Git Workflow

  • Branch dari main untuk fitur baru
  • Pull request untuk code review
  • Squash commits sebelum merge

๐Ÿ“š Resources Tambahan

โ“ Troubleshooting

Common Issues

  1. Import errors: Pastikan path aliases dikonfigurasi dengan benar
  2. Component not found: Periksa file naming conventions
  3. Styling issues: Pastikan Tailwind classes ditulis dengan benar
  4. Route not working: Periksa file path dan route configuration

Development Tips

  • Gunakan React DevTools untuk debugging components
  • TanStack Router Devtools untuk debugging routing
  • Browser developer tools untuk styling inspection
  • VS Code extensions: TypeScript, Tailwind CSS IntelliSense

Selamat berkoding! ๐Ÿš€ Jika ada pertanyaan, jangan ragu untuk bertanya kepada tim atau melihat dokumentasi resmi dari teknologi yang digunakan.

Contributors

emrsyahBiZa7shadrairfn

Issues