Cover PolaroWeb | Platform Digital Photobooth
Kembali ke Beranda

PolaroWeb | Platform Digital Photobooth

Aplikasi photobooth digital berbasis PWA. Sesuaikan layout polaroid Anda dan akses kamera langsung secara offline.

Kategori

web

Dipublikasikan

11 Juli 2026

Teknologi

ReactThree.jsFirebase

šŸ“ø PolaroWeb

šŸ“ Deskripsi

PolaroWeb adalah aplikasi photobooth berbasis web yang memungkinkan pengguna membuat foto polaroid digital dengan berbagai layout kreatif. Dibangun dengan teknologi modern seperti React 19, Vite, TypeScript, dan Tailwind CSS v4.

šŸŽÆ Tujuan Aplikasi

  • Memberikan pengalaman photobooth digital yang mudah dan menarik
  • Menyediakan berbagai pilihan layout polaroid (Classic, Strip, Photo Prints, Creative)
  • Mendukung fitur PWA (Progressive Web App) agar dapat diakses offline dan diinstall di perangkat

✨ Fitur

šŸ“· Mode Photobooth

ModeDeskripsiLayout Tersedia
Classic PolaroidFoto instan dengan nuansa vintage yang ikonikSquare, Wide, Mini
Strip LayoutCetakan foto dalam bentuk strip3 Strips, 4 Strips
Photo PrintsCetakan foto standar berkualitas tinggi2R, 3R, 4R
Creative LayoutsFormat inovatif untuk kreativitasSnapshoot6, Snapshoot8

šŸŽØ Fitur Lainnya

  • šŸŽ­ Background Picker - Pilih background dari preset, warna solid, atau upload gambar sendiri
  • šŸ“± PWA Support - Install sebagai aplikasi dan gunakan secara offline
  • šŸ–„ļø Responsive Design - Tampilan optimal di desktop dan mobile
  • ⚔ Animasi Interaktif - UI yang dinamis dengan GSAP dan Motion

šŸ› ļø Teknologi yang Digunakan

TeknologiVersiFungsi
React19.1.1Library UI utama
Vite7.1.2Build tool & dev server
TypeScript5.8.3Type safety
Tailwind CSS4.1.12Styling utility-first
React Router7.9.1Client-side routing
GSAP3.13.0Animasi kompleks
Motion12.23.16Animasi deklaratif
Lucide React0.544.0Icon library
Three.js0.180.03D graphics

šŸš€ Cara Menjalankan

Prasyarat

Pastikan sudah terinstall:

  • Node.js (versi 18 atau lebih tinggi)
  • pnpm (disarankan) atau npm

Langkah-langkah

1. Clone Repository

git clone https://github.com/username/polaroweb.git
cd polaroweb

2. Install Dependencies

# Menggunakan pnpm (disarankan)
pnpm install

# Atau menggunakan npm
npm install

3. Jalankan Development Server

# Menggunakan pnpm
pnpm dev

# Atau menggunakan npm
npm run dev

Aplikasi akan berjalan di http://localhost:5173

4. Build untuk Production

# Menggunakan pnpm
pnpm build

# Atau menggunakan npm
npm run build

5. Preview Production Build

# Menggunakan pnpm
pnpm preview

# Atau menggunakan npm
npm run preview

Catatan: Preview menggunakan HTTPS dengan sertifikat lokal dari folder cert/


šŸ“ Struktur Folder

polaroweb/
ā”œā”€ā”€ šŸ“„ index.html              # Entry point HTML dengan SEO & PWA config
ā”œā”€ā”€ šŸ“„ package.json            # Konfigurasi project & dependencies
ā”œā”€ā”€ šŸ“„ vite.config.ts          # Konfigurasi Vite dengan alias & HTTPS
ā”œā”€ā”€ šŸ“„ tsconfig.json           # Konfigurasi TypeScript
ā”œā”€ā”€ šŸ“„ eslint.config.js        # Konfigurasi ESLint
ā”œā”€ā”€ šŸ“„ components.json         # Konfigurasi shadcn/ui
ā”œā”€ā”€ šŸ“„ firebase.json           # Konfigurasi Firebase hosting
ā”œā”€ā”€ šŸ“„ .firebaserc             # Firebase project config
│
ā”œā”€ā”€ šŸ“ src/                    # Source code utama
│   ā”œā”€ā”€ šŸ“„ main.tsx           # Entry point React dengan Router
│   ā”œā”€ā”€ šŸ“„ App.tsx            # Root component dengan routes
│   ā”œā”€ā”€ šŸ“„ App.css            # Styling untuk App
│   ā”œā”€ā”€ šŸ“„ index.css          # Global CSS dengan Tailwind
│   ā”œā”€ā”€ šŸ“„ vite-env.d.ts      # TypeScript declarations untuk Vite
│   │
│   ā”œā”€ā”€ šŸ“ components/        # Komponen React
│   │   ā”œā”€ā”€ šŸ“ layouts/       # Layout components
│   │   │   ā”œā”€ā”€ šŸ“„ Header.tsx          # Header dengan efek scroll
│   │   │   ā”œā”€ā”€ šŸ“„ Nav.tsx             # Navigasi utama
│   │   │   ā”œā”€ā”€ šŸ“„ ListNav.tsx         # Item navigasi
│   │   │   ā”œā”€ā”€ šŸ“„ Footer.tsx          # Footer component
│   │   │   ā”œā”€ā”€ šŸ“„ HeroSection.tsx     # Hero section halaman utama
│   │   │   ā”œā”€ā”€ šŸ“„ Designed.tsx        # Section pilihan layout
│   │   │   └── šŸ“„ CardCustom.tsx      # Card custom component
│   │   │
│   │   ā”œā”€ā”€ šŸ“ pages/         # Halaman aplikasi
│   │   │   ā”œā”€ā”€ šŸ“„ Beranda.tsx              # Halaman beranda
│   │   │   ā”œā”€ā”€ šŸ“„ CustomPage.tsx           # Halaman kategori
│   │   │   ā”œā”€ā”€ šŸ“„ ClassicPolaroidPage.tsx  # Mode Classic Polaroid
│   │   │   ā”œā”€ā”€ šŸ“„ StripLayoutPage.tsx      # Mode Strip Layout
│   │   │   ā”œā”€ā”€ šŸ“„ PhotoPrintsPage.tsx      # Mode Photo Prints
│   │   │   └── šŸ“„ CreativeLayoutsPage.tsx  # Mode Creative Layouts
│   │   │
│   │   ā”œā”€ā”€ šŸ“ ui/            # UI primitives (shadcn/ui)
│   │   │   └── šŸ“„ button.tsx # Button component
│   │   │
│   │   ā”œā”€ā”€ šŸ“„ AnimatedContent.tsx  # Komponen animasi GSAP
│   │   ā”œā”€ā”€ šŸ“„ BackgroundPicker.tsx # Picker untuk background
│   │   ā”œā”€ā”€ šŸ“„ DotGrid.tsx          # Background interaktif dots
│   │   ā”œā”€ā”€ šŸ“„ FadeContent.tsx      # Animasi fade in
│   │   ā”œā”€ā”€ šŸ“„ PwaInstallButton.tsx # Tombol install PWA
│   │   ā”œā”€ā”€ šŸ“„ RotatingText.tsx     # Teks berputar animasi
│   │   ā”œā”€ā”€ šŸ“„ SEO.tsx              # Komponen SEO dengan Helmet
│   │   ā”œā”€ā”€ šŸ“„ Stack.tsx            # Stack cards animasi
│   │   ā”œā”€ā”€ šŸ“„ TargetCursor.tsx     # Custom cursor effect
│   │   ā”œā”€ā”€ šŸ“„ TextType.tsx         # Efek typing text
│   │   └── šŸ“„ TItleForPage.tsx     # Title reusable component
│   │
│   ā”œā”€ā”€ šŸ“ context/           # React Context
│   │   └── šŸ“„ BackgroundContext.tsx # State global untuk background
│   │
│   ā”œā”€ā”€ šŸ“ hooks/             # Custom React Hooks
│   │   ā”œā”€ā”€ šŸ“„ useCamera.ts        # Hook untuk akses kamera
│   │   └── šŸ“„ usePwaPrompt.ts     # Hook untuk PWA install prompt
│   │
│   ā”œā”€ā”€ šŸ“ lib/               # Library & data
│   │   ā”œā”€ā”€ šŸ“„ utils.ts            # Utility functions (cn, getLayoutFromType)
│   │   ā”œā”€ā”€ šŸ“„ data.d.tsx          # Data kategori polaroid
│   │   ā”œā”€ā”€ šŸ“„ data-background.tsx # Data preset background
│   │   └── šŸ“„ seo.data.ts         # Data SEO untuk setiap halaman
│   │
│   ā”œā”€ā”€ šŸ“ utils/             # Utility functions untuk photobooth
│   │   ā”œā”€ā”€ šŸ“„ ambil-foto.tsx      # Fungsi capture foto
│   │   ā”œā”€ā”€ šŸ“„ atur-layout.tsx     # Fungsi mengatur layout
│   │   ā”œā”€ā”€ šŸ“„ download-photo.tsx  # Fungsi download hasil
│   │   ā”œā”€ā”€ šŸ“„ mulai-kamera.tsx    # Fungsi memulai kamera
│   │   ā”œā”€ā”€ šŸ“„ photo-utils.tsx     # Utility foto lainnya
│   │   └── šŸ“„ types-props.tsx     # TypeScript types
│   │
│   └── šŸ“ assets/            # Static assets (images, fonts)
│
ā”œā”€ā”€ šŸ“ public/                # Static public files
│   ā”œā”€ā”€ šŸ“„ manifest.webmanifest    # PWA manifest
│   ā”œā”€ā”€ šŸ“„ sw.js                   # Service Worker
│   ā”œā”€ā”€ šŸ“„ pwa-192x192.png         # PWA icon 192x192
│   ā”œā”€ā”€ šŸ“„ pwa-512x512.png         # PWA icon 512x512
│   ā”œā”€ā”€ šŸ“„ icon.jpeg               # Favicon
│   ā”œā”€ā”€ šŸ“ image/                  # Gambar untuk hero section
│   └── šŸ“ background/             # Preset background images
│
ā”œā”€ā”€ šŸ“ cert/                  # SSL certificates untuk HTTPS lokal
│   ā”œā”€ā”€ šŸ“„ key.pem
│   └── šŸ“„ cert.pem
│
ā”œā”€ā”€ šŸ“ dist/                  # Production build output
ā”œā”€ā”€ šŸ“ node_modules/          # Dependencies (auto-generated)
ā”œā”€ā”€ šŸ“ .firebase/             # Firebase cache
└── šŸ“ .github/               # GitHub workflows & configs

šŸ”§ Konfigurasi

Alias Path

Project ini menggunakan alias @ untuk merujuk ke folder src/:

// Contoh penggunaan
import { cn } from '@/lib/utils';
import { useCamera } from '@/hooks/useCamera';

Environment HTTPS

Untuk fitur kamera berfungsi dengan baik, diperlukan HTTPS. Folder cert/ berisi sertifikat SSL lokal:

cert/
ā”œā”€ā”€ key.pem     # Private key
└── cert.pem    # Certificate

šŸ“– Penjelasan Fitur Utama

1. Custom Hook: useCamera

Hook untuk mengakses dan mengontrol kamera perangkat:

const { stream, startCamera } = useCamera();

// Memulai kamera dengan device tertentu
await startCamera(deviceId, videoElement);

2. Context: BackgroundContext

State global untuk menyimpan background yang dipilih:

const { backgroundImage, backgroundColor, setBackgroundImage, setBackgroundColor } = useBackground();

3. Layout Configuration

Fungsi getLayoutFromType() mengembalikan konfigurasi layout berdasarkan tipe:

const config = getLayoutFromType('3strips');
// Returns: { layout: '3 Strips', maxPhotos: 3, cols: 1, width: 500, height: 1200 }

4. SEO & Meta Tags

Setiap halaman memiliki meta tags yang dikonfigurasi melalui komponen <SEO /> dan data dari seo.data.ts.


šŸŽØ Routing

PathHalamanDeskripsi
/BerandaLanding page dengan hero section
/:categoryCustomPageHalaman kategori (classic-polaroid, strip-layout, dll)
/creative-layouts/:typeCreativeLayoutsPagePhotobooth creative layouts
/classic-polaroid/:typeClassicPolaroidPagePhotobooth classic polaroid
/photo-prints/:typePhotoPrintsPagePhotobooth photo prints
/strip-layout/:typeStripLayoutPagePhotobooth strip layout

🚫 File yang Tidak Digunakan

Berikut adalah file-file yang mungkin tidak aktif digunakan dalam production:

File/FolderAlasan
public/index.htmlDuplikat dari root index.html
public/google459064beba0f0550.htmlFile verifikasi Google (hanya untuk setup)
pwa-192x192.png (di root)Duplikat dari public/pwa-192x192.png
Kode komentar di vite.config.ts (baris 1-53)Konfigurasi VitePWA yang tidak aktif

šŸ“¦ Deployment

Firebase Hosting

Project ini dikonfigurasi untuk Firebase Hosting:

# Install Firebase CLI
npm install -g firebase-tools

# Login ke Firebase
firebase login

# Deploy
firebase deploy

šŸ¤ Kontribusi

  1. Fork repository ini
  2. Buat branch fitur baru (git checkout -b feature/AmazingFeature)
  3. Commit perubahan (git commit -m 'Add some AmazingFeature')
  4. Push ke branch (git push origin feature/AmazingFeature)
  5. Buat Pull Request

šŸ“„ Lisensi

Project ini bersifat private dan hak cipta dilindungi oleh PolaroWeb.


šŸ“ž Kontak

PolaroWeb - https://polaroweb.app


<div align="center"> Made with ā¤ļø <b>mkeyzxi</b> using React, Vite, and Tailwind CSS </div>
Muhammad Makbul NFull Stack Developer
Ā© 2026 Dibangun dengan hati