436 lines
15 KiB
PHP
436 lines
15 KiB
PHP
<?php
|
|
// ================================================================
|
|
// Landing Page — Pemilih Mode Aplikasi WebGIS
|
|
// ================================================================
|
|
require_once __DIR__ . '/config/config.php';
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html lang="id">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>WebGIS Kalimantan Barat — Pilih Mode</title>
|
|
<meta name="description" content="Pilih mode aplikasi WebGIS: Peta Kemiskinan & Rumah Ibadah atau Input Manual SPBU.">
|
|
|
|
<!-- Fonts -->
|
|
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet">
|
|
<!-- Bootstrap Icons -->
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.min.css" rel="stylesheet">
|
|
|
|
<style>
|
|
/* ── RESET & BASE ───────────────────────────────────────── */
|
|
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
|
|
:root {
|
|
--bg: #0a0e1a;
|
|
--bg2: #0f1526;
|
|
--card: rgba(255,255,255,0.04);
|
|
--card-hov: rgba(255,255,255,0.07);
|
|
--border: rgba(255,255,255,0.08);
|
|
--text1: #e8ecf4;
|
|
--text2: #8890b0;
|
|
--text3: #4a5070;
|
|
|
|
/* Mode 1 — Poverty Map */
|
|
--c1-from: #5b7fff;
|
|
--c1-to: #a855f7;
|
|
--c1-glow: rgba(91,127,255,0.35);
|
|
--c1-glow2: rgba(168,85,247,0.25);
|
|
|
|
/* Mode 2 — SPBU */
|
|
--c2-from: #f59e0b;
|
|
--c2-to: #ef4444;
|
|
--c2-glow: rgba(245,158,11,0.35);
|
|
--c2-glow2: rgba(239,68,68,0.25);
|
|
}
|
|
|
|
html, body {
|
|
min-height: 100vh;
|
|
background: var(--bg);
|
|
font-family: 'Plus Jakarta Sans', sans-serif;
|
|
color: var(--text1);
|
|
overflow-x: hidden;
|
|
}
|
|
|
|
/* ── ANIMATED BG ──────────────────────────────────────────── */
|
|
.bg-orbs {
|
|
position: fixed; inset: 0; z-index: 0; pointer-events: none; overflow: hidden;
|
|
}
|
|
.orb {
|
|
position: absolute; border-radius: 50%;
|
|
filter: blur(80px); opacity: 0.12;
|
|
animation: floatOrb 12s ease-in-out infinite;
|
|
}
|
|
.orb-1 {
|
|
width: 500px; height: 500px;
|
|
background: radial-gradient(circle, #5b7fff, transparent);
|
|
top: -150px; left: -150px;
|
|
animation-delay: 0s; animation-duration: 14s;
|
|
}
|
|
.orb-2 {
|
|
width: 400px; height: 400px;
|
|
background: radial-gradient(circle, #a855f7, transparent);
|
|
top: 30%; right: -100px;
|
|
animation-delay: -4s; animation-duration: 11s;
|
|
}
|
|
.orb-3 {
|
|
width: 350px; height: 350px;
|
|
background: radial-gradient(circle, #f59e0b, transparent);
|
|
bottom: -100px; left: 30%;
|
|
animation-delay: -8s; animation-duration: 16s;
|
|
}
|
|
.orb-4 {
|
|
width: 300px; height: 300px;
|
|
background: radial-gradient(circle, #ef4444, transparent);
|
|
bottom: 10%; right: 20%;
|
|
animation-delay: -3s; animation-duration: 13s;
|
|
}
|
|
|
|
@keyframes floatOrb {
|
|
0%, 100% { transform: translate(0, 0) scale(1); }
|
|
33% { transform: translate(30px, -40px) scale(1.05); }
|
|
66% { transform: translate(-20px, 20px) scale(0.95); }
|
|
}
|
|
|
|
/* Grid overlay */
|
|
.bg-grid {
|
|
position: fixed; inset: 0; z-index: 0; pointer-events: none;
|
|
background-image:
|
|
linear-gradient(rgba(91,127,255,0.03) 1px, transparent 1px),
|
|
linear-gradient(90deg, rgba(91,127,255,0.03) 1px, transparent 1px);
|
|
background-size: 48px 48px;
|
|
}
|
|
|
|
/* ── LAYOUT ──────────────────────────────────────────────── */
|
|
.page-wrap {
|
|
position: relative; z-index: 1;
|
|
min-height: 100vh;
|
|
display: flex; flex-direction: column;
|
|
align-items: center; justify-content: center;
|
|
padding: 40px 20px;
|
|
gap: 48px;
|
|
}
|
|
|
|
/* ── HEADER ──────────────────────────────────────────────── */
|
|
.hero {
|
|
text-align: center;
|
|
animation: fadeInDown 0.7s ease both;
|
|
}
|
|
.hero-badge {
|
|
display: inline-flex; align-items: center; gap: 7px;
|
|
background: rgba(91,127,255,0.12);
|
|
border: 1px solid rgba(91,127,255,0.3);
|
|
color: #7c9fff;
|
|
font-size: 11px; font-weight: 700; letter-spacing: 1.2px; text-transform: uppercase;
|
|
padding: 5px 14px; border-radius: 100px;
|
|
margin-bottom: 20px;
|
|
}
|
|
.hero-title {
|
|
font-size: clamp(2rem, 5vw, 3.2rem);
|
|
font-weight: 900;
|
|
line-height: 1.15;
|
|
background: linear-gradient(135deg, #e8ecf4 30%, #8890b0 100%);
|
|
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
|
|
background-clip: text;
|
|
margin-bottom: 12px;
|
|
}
|
|
.hero-sub {
|
|
font-size: clamp(0.9rem, 2vw, 1.05rem);
|
|
color: var(--text2);
|
|
max-width: 480px; line-height: 1.6;
|
|
}
|
|
|
|
/* ── MODE CARDS ──────────────────────────────────────────── */
|
|
.cards-row {
|
|
display: flex; gap: 24px; flex-wrap: wrap;
|
|
justify-content: center;
|
|
animation: fadeInUp 0.7s ease 0.15s both;
|
|
}
|
|
|
|
.mode-card {
|
|
position: relative;
|
|
width: 320px;
|
|
background: var(--card);
|
|
border: 1px solid var(--border);
|
|
border-radius: 24px;
|
|
padding: 36px 32px 32px;
|
|
cursor: pointer;
|
|
text-decoration: none; color: inherit;
|
|
overflow: hidden;
|
|
transition: transform 0.3s ease, box-shadow 0.3s ease, border-color 0.3s ease, background 0.3s ease;
|
|
display: flex; flex-direction: column; gap: 18px;
|
|
}
|
|
.mode-card:hover {
|
|
transform: translateY(-6px);
|
|
background: var(--card-hov);
|
|
}
|
|
|
|
/* Animated top glow bar */
|
|
.mode-card::before {
|
|
content: '';
|
|
position: absolute; top: 0; left: 0; right: 0;
|
|
height: 3px;
|
|
border-radius: 24px 24px 0 0;
|
|
transition: opacity 0.3s ease;
|
|
opacity: 0.6;
|
|
}
|
|
.mode-card:hover::before { opacity: 1; }
|
|
|
|
/* Shimmer on hover */
|
|
.mode-card::after {
|
|
content: '';
|
|
position: absolute; inset: 0;
|
|
background: radial-gradient(circle at 50% 0%, rgba(255,255,255,0.05), transparent 70%);
|
|
opacity: 0; transition: opacity 0.4s ease;
|
|
border-radius: 24px;
|
|
pointer-events: none;
|
|
}
|
|
.mode-card:hover::after { opacity: 1; }
|
|
|
|
/* Mode 1 */
|
|
.card-mode1::before { background: linear-gradient(90deg, var(--c1-from), var(--c1-to)); }
|
|
.card-mode1:hover {
|
|
border-color: rgba(91,127,255,0.4);
|
|
box-shadow:
|
|
0 20px 60px rgba(0,0,0,0.5),
|
|
0 0 0 1px rgba(91,127,255,0.2),
|
|
inset 0 0 80px var(--c1-glow2);
|
|
}
|
|
|
|
/* Mode 2 */
|
|
.card-mode2::before { background: linear-gradient(90deg, var(--c2-from), var(--c2-to)); }
|
|
.card-mode2:hover {
|
|
border-color: rgba(245,158,11,0.4);
|
|
box-shadow:
|
|
0 20px 60px rgba(0,0,0,0.5),
|
|
0 0 0 1px rgba(245,158,11,0.2),
|
|
inset 0 0 80px var(--c2-glow2);
|
|
}
|
|
|
|
/* Icon */
|
|
.card-icon-wrap {
|
|
width: 64px; height: 64px;
|
|
border-radius: 18px;
|
|
display: flex; align-items: center; justify-content: center;
|
|
font-size: 28px;
|
|
position: relative;
|
|
transition: transform 0.3s ease;
|
|
}
|
|
.mode-card:hover .card-icon-wrap { transform: scale(1.08) rotate(-3deg); }
|
|
|
|
.card-mode1 .card-icon-wrap {
|
|
background: linear-gradient(135deg, rgba(91,127,255,0.2), rgba(168,85,247,0.15));
|
|
border: 1px solid rgba(91,127,255,0.3);
|
|
box-shadow: 0 4px 20px var(--c1-glow);
|
|
}
|
|
.card-mode2 .card-icon-wrap {
|
|
background: linear-gradient(135deg, rgba(245,158,11,0.2), rgba(239,68,68,0.15));
|
|
border: 1px solid rgba(245,158,11,0.3);
|
|
box-shadow: 0 4px 20px var(--c2-glow);
|
|
}
|
|
|
|
.card-num {
|
|
position: absolute; top: -8px; right: -8px;
|
|
width: 22px; height: 22px; border-radius: 50%;
|
|
font-size: 10px; font-weight: 800; color: #fff;
|
|
display: flex; align-items: center; justify-content: center;
|
|
}
|
|
.card-mode1 .card-num { background: linear-gradient(135deg, var(--c1-from), var(--c1-to)); }
|
|
.card-mode2 .card-num { background: linear-gradient(135deg, var(--c2-from), var(--c2-to)); }
|
|
|
|
/* Text */
|
|
.card-label {
|
|
font-size: 11px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase;
|
|
margin-bottom: 4px;
|
|
}
|
|
.card-mode1 .card-label { color: #7c9fff; }
|
|
.card-mode2 .card-label { color: #fbbf24; }
|
|
|
|
.card-title {
|
|
font-size: 1.35rem; font-weight: 800; color: var(--text1);
|
|
line-height: 1.25; margin-bottom: 8px;
|
|
}
|
|
.card-desc {
|
|
font-size: 0.875rem; color: var(--text2); line-height: 1.6;
|
|
}
|
|
|
|
/* Features list */
|
|
.card-features {
|
|
list-style: none; display: flex; flex-direction: column; gap: 7px;
|
|
}
|
|
.card-features li {
|
|
font-size: 12px; color: var(--text2);
|
|
display: flex; align-items: center; gap: 8px;
|
|
}
|
|
.card-features li .feat-dot {
|
|
width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0;
|
|
}
|
|
.card-mode1 .feat-dot { background: #5b7fff; }
|
|
.card-mode2 .feat-dot { background: #f59e0b; }
|
|
|
|
/* CTA Button */
|
|
.card-cta {
|
|
margin-top: 4px;
|
|
padding: 12px 20px;
|
|
border-radius: 12px;
|
|
font-size: 14px; font-weight: 700;
|
|
border: none; cursor: pointer;
|
|
display: flex; align-items: center; justify-content: center; gap: 8px;
|
|
transition: transform 0.2s ease, box-shadow 0.2s ease, opacity 0.2s ease;
|
|
text-decoration: none;
|
|
position: relative; overflow: hidden;
|
|
}
|
|
.card-cta::after {
|
|
content: '';
|
|
position: absolute; inset: 0;
|
|
background: rgba(255,255,255,0.1);
|
|
opacity: 0; transition: opacity 0.2s ease;
|
|
}
|
|
.card-cta:hover::after { opacity: 1; }
|
|
.card-cta:active { transform: scale(0.97); }
|
|
|
|
.card-mode1 .card-cta {
|
|
background: linear-gradient(135deg, var(--c1-from), var(--c1-to));
|
|
color: #fff;
|
|
box-shadow: 0 4px 20px var(--c1-glow);
|
|
}
|
|
.card-mode1 .card-cta:hover { box-shadow: 0 6px 30px var(--c1-glow); transform: translateY(-1px); }
|
|
|
|
.card-mode2 .card-cta {
|
|
background: linear-gradient(135deg, var(--c2-from), var(--c2-to));
|
|
color: #fff;
|
|
box-shadow: 0 4px 20px var(--c2-glow);
|
|
}
|
|
.card-mode2 .card-cta:hover { box-shadow: 0 6px 30px var(--c2-glow); transform: translateY(-1px); }
|
|
|
|
/* Arrow icon animate */
|
|
.arrow-icon {
|
|
transition: transform 0.25s ease;
|
|
display: inline-block;
|
|
}
|
|
.card-cta:hover .arrow-icon { transform: translateX(4px); }
|
|
|
|
/* ── FOOTER ──────────────────────────────────────────────── */
|
|
.landing-footer {
|
|
animation: fadeInUp 0.7s ease 0.3s both;
|
|
text-align: center;
|
|
font-size: 12px; color: var(--text3);
|
|
display: flex; align-items: center; gap: 16px; flex-wrap: wrap; justify-content: center;
|
|
}
|
|
.landing-footer a {
|
|
color: var(--text2); text-decoration: none;
|
|
transition: color 0.2s;
|
|
}
|
|
.landing-footer a:hover { color: var(--text1); }
|
|
.landing-footer .sep { opacity: 0.4; }
|
|
|
|
/* ── ANIMATIONS ──────────────────────────────────────────── */
|
|
@keyframes fadeInDown {
|
|
from { opacity: 0; transform: translateY(-20px); }
|
|
to { opacity: 1; transform: translateY(0); }
|
|
}
|
|
@keyframes fadeInUp {
|
|
from { opacity: 0; transform: translateY(20px); }
|
|
to { opacity: 1; transform: translateY(0); }
|
|
}
|
|
|
|
/* ── RESPONSIVE ──────────────────────────────────────────── */
|
|
@media (max-width: 700px) {
|
|
.cards-row { flex-direction: column; align-items: center; }
|
|
.mode-card { width: 100%; max-width: 360px; }
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<!-- Background -->
|
|
<div class="bg-orbs">
|
|
<div class="orb orb-1"></div>
|
|
<div class="orb orb-2"></div>
|
|
<div class="orb orb-3"></div>
|
|
<div class="orb orb-4"></div>
|
|
</div>
|
|
<div class="bg-grid"></div>
|
|
|
|
<!-- Page -->
|
|
<div class="page-wrap">
|
|
|
|
<!-- Hero -->
|
|
<div class="hero">
|
|
<div class="hero-badge">
|
|
<i class="bi bi-globe-asia-australia"></i>
|
|
WebGIS Kalimantan Barat
|
|
</div>
|
|
<h1 class="hero-title">Pilih Mode Aplikasi</h1>
|
|
<p class="hero-sub">Pilih salah satu modul pemetaan yang ingin Anda gunakan. Kedua mode menggunakan OpenStreetMap interaktif.</p>
|
|
</div>
|
|
|
|
<!-- Mode Cards -->
|
|
<div class="cards-row">
|
|
|
|
<!-- ── MODE 1: POVERTY MAP ─────────────────────────────── -->
|
|
<a href="<?= BASE_URL ?>/index.php" class="mode-card card-mode1" id="card-poverty">
|
|
<div class="card-icon-wrap">
|
|
🗺️
|
|
<div class="card-num">1</div>
|
|
</div>
|
|
<div>
|
|
<div class="card-label">Mode 1</div>
|
|
<div class="card-title">Peta Kemiskinan<br>& Rumah Ibadah</div>
|
|
<div class="card-desc">Pemetaan sebaran penduduk miskin berbasis database dengan analisis radius layanan rumah ibadah secara real-time.</div>
|
|
</div>
|
|
<ul class="card-features">
|
|
<li><span class="feat-dot"></span> Database penduduk miskin & KK</li>
|
|
<li><span class="feat-dot"></span> Radius layanan rumah ibadah</li>
|
|
<li><span class="feat-dot"></span> Heatmap sebaran & statistik</li>
|
|
<li><span class="feat-dot"></span> Import/Export Excel & filter wilayah</li>
|
|
</ul>
|
|
<div class="card-cta">
|
|
<i class="bi bi-map-fill"></i>
|
|
Buka Poverty Map
|
|
<i class="bi bi-arrow-right arrow-icon"></i>
|
|
</div>
|
|
</a>
|
|
|
|
<!-- ── MODE 2: INPUT SPBU ──────────────────────────────── -->
|
|
<a href="<?= BASE_URL ?>/index.html" class="mode-card card-mode2" id="card-spbu">
|
|
<div class="card-icon-wrap">
|
|
⛽
|
|
<div class="card-num">2</div>
|
|
</div>
|
|
<div>
|
|
<div class="card-label">Mode 2</div>
|
|
<div class="card-title">Input Manual<br>SPBU & Ibadah</div>
|
|
<div class="card-desc">Input cepat lokasi SPBU dan rumah ibadah langsung di peta tanpa akun. Data tersimpan di sesi browser secara lokal.</div>
|
|
</div>
|
|
<ul class="card-features">
|
|
<li><span class="feat-dot"></span> Klik peta untuk tambah titik</li>
|
|
<li><span class="feat-dot"></span> Deteksi lokasi otomatis (GPS)</li>
|
|
<li><span class="feat-dot"></span> Reverse geocoding alamat</li>
|
|
<li><span class="feat-dot"></span> Tanpa login, langsung pakai</li>
|
|
</ul>
|
|
<div class="card-cta">
|
|
<i class="bi bi-fuel-pump-fill"></i>
|
|
Buka Input SPBU
|
|
<i class="bi bi-arrow-right arrow-icon"></i>
|
|
</div>
|
|
</a>
|
|
|
|
</div>
|
|
|
|
<!-- Footer -->
|
|
<div class="landing-footer">
|
|
<span>© <?= date('Y') ?> WebGIS Kalbar</span>
|
|
<span class="sep">|</span>
|
|
<a href="<?= BASE_URL ?>/admin/" title="Panel Admin">
|
|
<i class="bi bi-grid-3x3-gap-fill"></i> Panel Admin
|
|
</a>
|
|
<span class="sep">|</span>
|
|
<span>OpenStreetMap · Leaflet.js</span>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</body>
|
|
</html>
|