Files
WebGIS-Poverty-MAP/landing.php
T

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>