Website profil resmi untuk Aterkia Maritime Robotics Team, Universitas Diponegoro (Undip). Dibangun dengan React 18 + Vite + Tailwind CSS + Supabase, dirancang modern, responsif, dan multi-page routing. Repo ini frontend-only: backend Express yang lama sudah dihapus — autentikasi, database, dan storage kini sepenuhnya ditangani Supabase.
| Layer | Teknologi |
|---|---|
| Frontend | React 18, Vite 5, React Router 7, Tailwind CSS 3, Lucide React |
| Maps | react-leaflet 4 + Leaflet (lazy-loaded, hanya dimuat saat detail Research HQ dibuka) |
| Auth & DB | Supabase Auth (Google OAuth), PostgreSQL, Storage |
| Contact | Formspree + Supabase Storage |
| Anti-bot | Cloudflare Turnstile + Supabase Edge Function verify-turnstile |
| 3D Robot | @google/model-viewer (GLB) |
| Halaman | Route | Kelas akses | Deskripsi |
|---|---|---|---|
| Home | / |
publik | Hero ASV & AUV, sponsor marquee, carousel robot & berita, roadmap |
| About | /about |
publik | Visi & Misi, pencapaian, divisi, kegiatan, roadmap, kenapa Aterkia |
| History | /history |
publik | Timeline perjalanan sejak 2023 (interaktif berbasis scroll) |
| Robot | /robots |
publik | Arsip robot (ASV & AUV), filter, spesifikasi, model 3D |
| Tim | /team |
publik | Struktur organisasi, jalur teknis/nonteknis, divisi, profil anggota |
| Contact | /contact |
publik | Form kontak, sekretariat (map), sponsor, lampiran |
| Login | /login |
publik | Login Google + Turnstile |
| Profile | /profile |
user/admin | Profil pengguna terautentikasi |
| Dashboard | /dashboard |
user/admin | Monitoring beranda (lazy-loaded) |
| 404 | * |
publik | NotFoundPage |
# 1. Clone repository
git clone https://github.com/USERNAME/aterkia-website.git
cd aterkia-website
# 2. Install dependensi
cd frontend
npm install
# 3. Siapkan environment
cp .env.example .env # lalu isi nilai sesuai kebutuhan
# 4. Jalankan dev server
npm run dev # → http://localhost:5173
# Build produksi
npm run build
npm run preview
.envtidak boleh di-commit (sudah di-abuse di.gitignore). Hanya.env.example(placeholder) yang di-track.
| Variabel | Deskripsi |
|---|---|
VITE_SUPABASE_URL |
URL project Supabase (mis. https://xxx.supabase.co) |
VITE_SUPABASE_ANON_KEY |
Anon (publik) key — jangan pernah pakai service_role di frontend |
VITE_SUPABASE_CONTACT_BUCKET |
Bucket Storage publik untuk lampiran (default: Aterkia) |
VITE_FORMSPREE_ID |
ID form Formspree atau URL lengkap |
VITE_TURNSTILE_SITE_KEY |
Site key Turnstile (bukan secret) |
- Buat project Supabase gratis.
- Di SQL Editor, jalankan
supabase/schema.sql(membuat tabelprofiles, RLS, trigger role protection). - Auth → Providers → aktifkan Google, tambahkan callback URL:
- Lokal:
http://localhost:5173/login - Produksi:
https://<domain>/login
- Lokal:
- Buat bucket publik
Aterkia, lalu jalankansupabase/storage-policies.sql(policy upload anonim kecontact/dengan batas tipe & ukuran). - Deploy Edge Function Turnstile (verifikasi server-side):
supabase login supabase functions deploy verify-turnstile supabase secrets set TURNSTILE_SECRET_KEY=<secret-key-turnstile>
- Fungsi:
supabase/functions/verify-turnstile/index.ts - Ukuran lampiran dibatasi 3 file, masing-masing maksimal 25 MB, tipe PDF/DOC/DOCX/PNG/JPG/ZIP.
- Fungsi:
Aterkia/
├── .gitignore ← hindari kebocoran .env / secret
├── README.MD
│
├── frontend/
│ ├── public/
│ │ ├── assets/ ← profile.png (logo), *.glb (model 3D robot)
│ │ ├── images/
│ │ │ ├── activities/ ← ⚠ foto kegiatan (siapkan di sini)
│ │ │ ├── team/ ← foto anggota tim
│ │ │ ├── robots/ ← foto robot
│ │ │ ├── news/ ← foto berita
│ │ │ └── sponsors/ ← logo sponsor
│ │ └── videos/ ← video (tidak di-commit, upload manual/CDN)
│ ├── src/
│ │ ├── components/ ← UI reusable
│ │ │ ├── auth/ ← ProtectedRoute, UserAvatar
│ │ │ ├── Navbar.jsx, Footer.jsx, Preloader.jsx, ScrollToTop.jsx
│ │ │ ├── ImageWithFallback.jsx
│ │ │ ├── motion.jsx ← TiltCard, Spotlight, CountUp, useReveal
│ │ │ ├── OrgChart.jsx ← bagan organisasi (Tim)
│ │ │ ├── ActivitiesSection.jsx, Divisions.jsx, RoadmapSection.jsx
│ │ │ ├── RobotModal.jsx, GLBViewer.jsx
│ │ │ └── SecretariatMap.jsx / SecretariatMapInner.jsx (leaflet)
│ │ ├── pages/ ← halaman (TeamPage.jsx + CSS lama SUDAH dihapus)
│ │ │ ├── auth/ ← DashboardPage, ProfilePage
│ │ ├── data/ ← semua konten di sini (lihat "Panduan Update")
│ │ ├── context/AuthContext.jsx ← autentikasi + role
│ │ ├── hooks/index.js
│ │ ├── services/supabase.js ← supabase client, upload, turnstile verify
│ │ ├── App.jsx ← React Router
│ │ ├── main.jsx
│ │ └── index.css ← Tailwind + custom utilities (reveal, photo fan)
│ ├── tailwind.config.js
│ ├── vite.config.js
│ └── package.json
│
└── supabase/
├── schema.sql ← tabel profiles + RLS
├── storage-policies.sql ← policy upload lampiran
└── functions/verify-turnstile/index.ts ← verifikasi Turnstile
Catatan:
TeamPage.css(10.788 baris, sumber lag) sudah dihapus dan seluruh halaman Tim di-rebuild murni Tailwind. Jangan menambah CSS besar per-halaman; gunakan utility Tailwind + keyframes global diindex.css.
Semua konten disimpan di frontend/src/data/*.js. Foto disimpan di frontend/public/images/<kategori>/.
- Simpan foto ke
frontend/public/images/team/<divisi>/(mis.auv/,president/). - Edit
frontend/src/data/teamData.js→ 4 blok divisi (ASV,AUV,SECRETARY_TREASURER,OFFICIAL).advisor/chair/viceChair: profil pemimpin & pembimbing.subdivisions:MECHANICAL,ELKAPRO.members:[id, fullName, role]+photootomatis.
- Wajib punya
photo,role,expertise,bio,instagram.
- Untuk tiap aktivitas, simpan 3 foto ke
frontend/public/images/activities/(contoh:design-hull.jpg,testing-pool.jpg, ...). - Edit
frontend/src/components/ActivitiesSection.jsx→ isi arrayphotospada tiap kartu. - Foto muncul sebagai stack polaroid yang melebar saat hover (
photo-stack/photo-layer, reuse dari HistoryPage). Kosongkanphotos: []jika belum ada foto — kartu tetap tampil dengan ikon.
- Foto:
frontend/public/images/robots/, data:frontend/src/data/robotsData.js(fieldimage,model3D→.glbdipublic/assets/).
- Berita:
frontend/public/images/news/+frontend/src/data/newsData.js. - Sponsor:
frontend/public/images/sponsors/+frontend/src/data/sponsorsData.js(disableurluntuk non-link).
- Edit
frontend/src/data/historyData.js. Format:year,title,description,photos[](maks 5 untuk efek fan),milestones[]. Urutan terbaru di atas.
- Edit
frontend/src/data/aboutData.js(visi, misi, achievements, whyAterkia, slogan, substitle, intro).
- Edit
frontend/src/data/siteConfig.js→coords: { lat, lng }. Tile OSM, zoom awal 15, bisa di-drag (menuaut kembali ke pin didragend).
- Warna marine: palet
olympic-*(500#005EB8, 900#0A1628, 950#060D1A) ditailwind.config.js. - Font:
font-display(Plus Jakarta Sans) untuk heading,font-sans(Inter) untuk body. - Utility global:
gradient-text,reveal/reveal-left/reveal-right/reveal-zoom,animate-*(fade-up, float, bubble-rise, ...).
- Semua halaman Tailwind: gunakan utility class, bukan CSS file custom per-halaman.
- Animasi scroll: pakai
reveal/reveal-zoom+useReveal()daricomponents/motion.jsx. - Gambar dengan fallback: selalu pakai
ImageWithFallback(fallback inisial/ikon bila file hilang). - Hero baru: tambahkan ke
Navbar.jsx+ route diApp.jsx. - Lazy-load dependency berat: contoh leaflet (Contact) & DashboardPage — jangan tarik ke bundle utama.
cd frontend
npx vite build # pastikan hijau sebelum commit- Jangan commit
.envatau secret apa pun (sudah di-ignore; hanya.env.exampleyang boleh masuk repo). - Video hero
frontend/public/videos/tidak di-commit (ukuran besar) — unggah manual atau hosting CDN. - Supabase menangani Auth, DB, dan Storage. Anon key saja cukup di frontend;
service_rolehanya untuk server/admin. RecruitmentPage.jsx&recruitmentData.jssudah dihapus (tidak punya route) — jika fitur rekrutmen dibutuhkan lagi, bangun ulang via route diApp.jsx.
Proyek internal Tim Aterkia — Universitas Diponegoro.