Files
D1041231084-WebGIS-PovertyMap/index.php
T
2026-06-10 20:51:12 +07:00

591 lines
20 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WebGIS Portal Sistem Informasi Spasial Kota Pontianak</title>
<meta name="description" content="Portal terpadu sistem informasi geografis Kota Pontianak. Akses WebGIS Tata Ruang (SPBU, Jalan, Parsil) dan GeoSosial (Peta Kemiskinan) dalam satu platform.">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Space+Grotesk:wght@500;600;700;800;900&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--ink: #080e1f;
--ink2: #2d3a55;
--ink3: #7a88a4;
--paper: #f4f7ff;
--white: #ffffff;
--blue: #1a5fff;
--blue2: #0038cc;
--purple: #7c3aed;
--teal: #00c9aa;
--amber: #f59e0b;
--red: #f03e5a;
--bdr: rgba(11,17,32,.08);
}
html { scroll-behavior: smooth; }
body {
font-family: 'Inter', system-ui, sans-serif;
background: var(--paper);
color: var(--ink);
min-height: 100vh;
overflow-x: hidden;
}
/* ── ANIMATED BACKGROUND ── */
.bg-mesh {
position: fixed; inset: 0; z-index: 0;
background:
radial-gradient(ellipse 80% 60% at 20% -10%, rgba(26,95,255,.12) 0%, transparent 60%),
radial-gradient(ellipse 60% 50% at 80% 110%, rgba(124,58,237,.10) 0%, transparent 55%),
radial-gradient(ellipse 50% 40% at 50% 50%, rgba(0,201,170,.06) 0%, transparent 60%),
linear-gradient(180deg, #eef3ff 0%, #f4f7ff 50%, #f0f4ff 100%);
}
/* Floating orbs */
.orb {
position: fixed; border-radius: 50%; filter: blur(80px);
pointer-events: none; animation: float-orb 12s ease-in-out infinite;
}
.orb-1 {
width: 500px; height: 500px;
background: radial-gradient(circle, rgba(26,95,255,.15) 0%, transparent 70%);
top: -200px; left: -100px;
animation-duration: 14s;
}
.orb-2 {
width: 400px; height: 400px;
background: radial-gradient(circle, rgba(124,58,237,.12) 0%, transparent 70%);
bottom: -150px; right: -80px;
animation-duration: 18s; animation-delay: -6s;
}
.orb-3 {
width: 300px; height: 300px;
background: radial-gradient(circle, rgba(0,201,170,.10) 0%, transparent 70%);
top: 40%; left: 50%;
animation-duration: 10s; animation-delay: -3s;
}
@keyframes float-orb {
0%, 100% { transform: translate(0, 0) scale(1); }
33% { transform: translate(30px, -20px) scale(1.05); }
66% { transform: translate(-20px, 15px) scale(0.95); }
}
/* Grid pattern */
.bg-grid {
position: fixed; inset: 0; z-index: 0;
background-image:
linear-gradient(rgba(26,95,255,.04) 1px, transparent 1px),
linear-gradient(90deg, rgba(26,95,255,.04) 1px, transparent 1px);
background-size: 40px 40px;
}
/* ── LAYOUT ── */
.page { position: relative; z-index: 1; }
/* ── NAVBAR ── */
.nav {
position: sticky; top: 0; z-index: 100;
padding: 16px 40px;
display: flex; align-items: center; justify-content: space-between;
background: rgba(255,255,255,.7);
backdrop-filter: blur(24px); -webkit-backdrop-filter: blur(24px);
border-bottom: 1px solid var(--bdr);
}
.nav-brand {
display: flex; align-items: center; gap: 12px;
text-decoration: none;
}
.nav-logo {
width: 40px; height: 40px; border-radius: 12px;
background: linear-gradient(135deg, var(--blue) 0%, var(--purple) 100%);
display: flex; align-items: center; justify-content: center;
font-size: 20px; box-shadow: 0 4px 16px rgba(26,95,255,.3);
}
.nav-name {
font-family: 'Space Grotesk', sans-serif;
font-size: 18px; font-weight: 700; color: var(--ink);
letter-spacing: -.3px;
}
.nav-sub { font-size: 11px; color: var(--ink3); margin-top: 1px; }
.nav-pill {
display: flex; align-items: center; gap: 6px;
padding: 6px 14px; border-radius: 99px;
background: rgba(0,201,170,.1); border: 1px solid rgba(0,201,170,.25);
font-size: 11px; font-weight: 700; color: #00a88d; letter-spacing: .04em;
}
.nav-pill-dot {
width: 7px; height: 7px; border-radius: 50%;
background: #00c9aa; animation: pulse-dot 2s ease-in-out infinite;
}
@keyframes pulse-dot {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: .6; transform: scale(.8); }
}
/* ── HERO ── */
.hero {
padding: 80px 40px 60px;
text-align: center;
max-width: 780px; margin: 0 auto;
}
.hero-eyebrow {
display: inline-flex; align-items: center; gap: 8px;
padding: 6px 16px; border-radius: 99px;
background: rgba(26,95,255,.08); border: 1px solid rgba(26,95,255,.18);
font-size: 11px; font-weight: 700; color: var(--blue); letter-spacing: .06em;
margin-bottom: 28px;
animation: fade-up .6s ease both;
}
.hero-title {
font-family: 'Space Grotesk', sans-serif;
font-size: clamp(40px, 6vw, 72px);
font-weight: 900; line-height: 1.05; letter-spacing: -2px;
color: var(--ink);
animation: fade-up .6s ease .1s both;
}
.hero-title span {
background: linear-gradient(135deg, var(--blue) 0%, var(--purple) 100%);
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
background-clip: text;
}
.hero-sub {
margin-top: 20px;
font-size: 17px; line-height: 1.7; color: var(--ink3); font-weight: 400;
animation: fade-up .6s ease .2s both;
}
.hero-cta-hint {
margin-top: 36px;
display: flex; align-items: center; justify-content: center; gap: 8px;
font-size: 12px; font-weight: 600; color: var(--ink3); letter-spacing: .1em;
text-transform: uppercase;
animation: fade-up .6s ease .3s both;
}
.hero-cta-hint::before,
.hero-cta-hint::after {
content: ''; flex: 1; max-width: 60px; height: 1px;
background: linear-gradient(90deg, transparent, var(--bdr));
}
.hero-cta-hint::after { background: linear-gradient(90deg, var(--bdr), transparent); }
@keyframes fade-up {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
/* ── PROJECT CARDS ── */
.cards-wrap {
max-width: 1100px; margin: 0 auto;
padding: 0 40px 80px;
display: grid; grid-template-columns: 1fr 1fr;
gap: 28px;
animation: fade-up .7s ease .35s both;
}
.project-card {
position: relative;
background: rgba(255,255,255,.85);
backdrop-filter: blur(20px);
border-radius: 28px;
border: 1.5px solid rgba(255,255,255,.9);
box-shadow: 0 8px 40px rgba(11,17,32,.06), 0 2px 8px rgba(11,17,32,.04);
overflow: hidden;
transition: transform .35s cubic-bezier(.34,1.56,.64,1), box-shadow .35s ease;
color: inherit;
display: flex; flex-direction: column;
cursor: pointer;
}
.project-card:hover {
transform: translateY(-8px) scale(1.01);
box-shadow: 0 24px 60px rgba(11,17,32,.12), 0 4px 12px rgba(11,17,32,.06);
}
.project-card:hover .card-arrow { transform: translateX(4px); }
/* Gradient top border */
.project-card::before {
content: '';
position: absolute; top: 0; left: 0; right: 0; height: 3px;
border-radius: 28px 28px 0 0;
}
.card-blue::before { background: linear-gradient(90deg, var(--blue), var(--purple)); }
.card-teal::before { background: linear-gradient(90deg, var(--teal), var(--blue)); }
/* Glow on hover */
.project-card::after {
content: '';
position: absolute; inset: 0; border-radius: 28px;
opacity: 0; transition: opacity .35s ease;
pointer-events: none;
}
.card-blue::after { background: radial-gradient(ellipse at 30% 0%, rgba(26,95,255,.06) 0%, transparent 60%); }
.card-teal::after { background: radial-gradient(ellipse at 30% 0%, rgba(0,201,170,.06) 0%, transparent 60%); }
.project-card:hover::after { opacity: 1; }
.card-inner { padding: 36px 36px 32px; flex: 1; display: flex; flex-direction: column; }
.card-badge {
display: inline-flex; align-items: center; gap: 6px;
padding: 4px 12px; border-radius: 99px;
font-size: 10px; font-weight: 800; letter-spacing: .1em;
text-transform: uppercase; margin-bottom: 24px;
width: fit-content;
}
.badge-blue { background: rgba(26,95,255,.08); color: var(--blue); border: 1px solid rgba(26,95,255,.15); }
.badge-teal { background: rgba(0,201,170,.08); color: #00a88d; border: 1px solid rgba(0,201,170,.15); }
.card-icon-wrap {
width: 64px; height: 64px; border-radius: 20px;
display: flex; align-items: center; justify-content: center;
font-size: 30px; margin-bottom: 20px;
position: relative; overflow: hidden;
}
.icon-blue {
background: linear-gradient(135deg, rgba(26,95,255,.12), rgba(124,58,237,.08));
border: 1.5px solid rgba(26,95,255,.15);
}
.icon-teal {
background: linear-gradient(135deg, rgba(0,201,170,.12), rgba(26,95,255,.08));
border: 1.5px solid rgba(0,201,170,.15);
}
.card-title {
font-family: 'Space Grotesk', sans-serif;
font-size: 26px; font-weight: 800; line-height: 1.15;
letter-spacing: -.5px; color: var(--ink);
margin-bottom: 12px;
}
.card-desc {
font-size: 14px; line-height: 1.75; color: var(--ink3);
flex: 1; margin-bottom: 24px;
}
/* Feature tags */
.card-tags {
display: flex; flex-wrap: wrap; gap: 8px;
margin-bottom: 28px;
}
.tag {
display: flex; align-items: center; gap: 5px;
padding: 5px 11px; border-radius: 99px;
font-size: 11px; font-weight: 600;
background: var(--paper); border: 1px solid var(--bdr);
color: var(--ink2);
}
.tag-dot {
width: 6px; height: 6px; border-radius: 50%;
}
.dot-blue { background: var(--blue); }
.dot-purple { background: var(--purple); }
.dot-teal { background: var(--teal); }
.dot-red { background: var(--red); }
.dot-amber { background: var(--amber); }
/* CTA Button */
.card-cta {
display: flex; align-items: center; justify-content: space-between;
padding: 14px 20px; border-radius: 16px;
font-size: 14px; font-weight: 700;
transition: all .25s ease;
border: none; cursor: pointer; width: 100%; text-decoration: none;
}
.cta-blue {
background: linear-gradient(135deg, var(--blue) 0%, #4b6fff 100%);
color: #fff;
box-shadow: 0 6px 24px rgba(26,95,255,.28);
}
.cta-blue:hover {
box-shadow: 0 10px 32px rgba(26,95,255,.38);
transform: translateY(-1px);
}
.cta-teal {
background: linear-gradient(135deg, #00b89a 0%, var(--teal) 100%);
color: #fff;
box-shadow: 0 6px 24px rgba(0,201,170,.28);
}
.cta-teal:hover {
box-shadow: 0 10px 32px rgba(0,201,170,.38);
transform: translateY(-1px);
}
.card-arrow {
font-size: 18px; transition: transform .25s ease;
}
/* Stats strip */
.card-stats {
display: grid; grid-template-columns: 1fr 1fr 1fr;
gap: 0; border-top: 1px solid var(--bdr);
}
.stat-item {
padding: 16px 20px; text-align: center;
border-right: 1px solid var(--bdr);
}
.stat-item:last-child { border-right: none; }
.stat-n {
font-size: 10px; font-weight: 700; text-transform: uppercase;
letter-spacing: .07em; color: var(--ink3); margin-bottom: 4px;
}
.stat-v {
font-family: 'Space Grotesk', sans-serif;
font-size: 20px; font-weight: 800; color: var(--ink);
}
.sv-blue { color: var(--blue); }
.sv-teal { color: var(--teal); }
.sv-purple { color: var(--purple); }
.sv-red { color: var(--red); }
/* ── BOTTOM INFO ── */
.bottom-info {
max-width: 1100px; margin: 0 auto;
padding: 0 40px 60px;
display: flex; align-items: center; justify-content: space-between;
flex-wrap: wrap; gap: 16px;
animation: fade-up .7s ease .5s both;
}
.info-left {
display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
}
.info-chip {
display: flex; align-items: center; gap: 7px;
padding: 8px 14px; border-radius: 99px;
background: rgba(255,255,255,.8);
border: 1px solid var(--bdr);
font-size: 12px; font-weight: 600; color: var(--ink2);
backdrop-filter: blur(12px);
}
.info-chip-ic { font-size: 14px; }
.footer-text {
font-size: 12px; color: var(--ink3); text-align: right;
}
/* ── RESPONSIVE ── */
@media (max-width: 860px) {
.nav { padding: 14px 20px; }
.hero { padding: 60px 20px 40px; }
.cards-wrap { grid-template-columns: 1fr; padding: 0 20px 60px; }
.bottom-info { padding: 0 20px 40px; flex-direction: column; align-items: flex-start; }
.footer-text { text-align: left; }
.card-inner { padding: 28px 24px 24px; }
}
/* ── HOVER GLOW EFFECT ── */
.project-card .card-glow {
position: absolute;
width: 200px; height: 200px; border-radius: 50%;
filter: blur(60px); pointer-events: none;
opacity: 0; transition: opacity .4s ease;
transform: translate(-50%, -50%);
}
.project-card:hover .card-glow { opacity: .5; }
.glow-blue { background: rgba(26,95,255,.3); }
.glow-teal { background: rgba(0,201,170,.3); }
</style>
</head>
<body>
<!-- Backgrounds -->
<div class="bg-mesh"></div>
<div class="bg-grid"></div>
<div class="orb orb-1"></div>
<div class="orb orb-2"></div>
<div class="orb orb-3"></div>
<div class="page">
<!-- Navbar -->
<nav class="nav">
<a href="#" class="nav-brand">
<div class="nav-logo">🌐</div>
<div>
<div class="nav-name">WebGIS Portal</div>
<div class="nav-sub">Kota Pontianak</div>
</div>
</a>
<div class="nav-pill">
<div class="nav-pill-dot"></div>
SISTEM AKTIF &amp; BERJALAN
</div>
</nav>
<!-- Hero -->
<section class="hero">
<div class="hero-eyebrow">
🗺️ PLATFORM PEMETAAN DIGITAL
</div>
<h1 class="hero-title">
Portal Pemetaan<br>
<span>Spasial Digital</span>
</h1>
<p class="hero-sub">
Platform terpadu untuk eksplorasi data geografis Kota Pontianak.<br>
Pilih project di bawah ini untuk mulai menjelajah.
</p>
<div class="hero-cta-hint">Pilih Project</div>
</section>
<!-- Cards -->
<div class="cards-wrap">
<!-- PROJECT 1: SPBU / WebGIS Tata Ruang -->
<div class="project-card card-blue" id="card-spbu" onclick="window.location='spbu/index.php'">
<div class="card-glow glow-blue" id="glow-spbu"></div>
<div class="card-inner">
<div class="card-badge badge-blue">🔵 PROJECT 01</div>
<div class="card-icon-wrap icon-blue">🏗️</div>
<h2 class="card-title">Spatial Metrics<br>SPBU dan Infrastruktur</h2>
<p class="card-desc">
Pemetaan komprehensif Point of Interest SPBU, jaringan jalan, dan parsil tanah berbasis
administrasi kecamatan Kota Pontianak. Dilengkapi editor GIS interaktif.
</p>
<div class="card-tags">
<span class="tag"><span class="tag-dot dot-blue"></span> SPBU &amp; POI</span>
<span class="tag"><span class="tag-dot dot-purple"></span> Jaringan Jalan</span>
<span class="tag"><span class="tag-dot dot-teal"></span> Parsil Tanah</span>
<span class="tag"><span class="tag-dot dot-amber"></span> Editor GIS</span>
</div>
<a href="spbu/index.php" class="card-cta cta-blue" onclick="event.stopPropagation()">
<span>Buka Aplikasi</span>
<span class="card-arrow"></span>
</a>
</div>
<div class="card-stats">
<div class="stat-item">
<div class="stat-n">SPBU</div>
<div class="stat-v sv-blue" id="st-spbu"></div>
</div>
<div class="stat-item">
<div class="stat-n">Jalan</div>
<div class="stat-v sv-purple" id="st-jalan"></div>
</div>
<div class="stat-item">
<div class="stat-n">Parsil</div>
<div class="stat-v sv-blue" id="st-parsil"></div>
</div>
</div>
</div>
<!-- PROJECT 2: GeoSosial -->
<div class="project-card card-teal" id="card-geo" onclick="window.location='geososial/index.php'">
<div class="card-glow glow-teal" id="glow-geo"></div>
<div class="card-inner">
<div class="card-badge badge-teal">🟢 PROJECT 02</div>
<div class="card-icon-wrap icon-teal">👥</div>
<h2 class="card-title">GeoSosial<br><small style="font-size:.6em;font-weight:600;color:var(--ink3)">Peta Sosial</small></h2>
<p class="card-desc">
Sistem informasi pemetaan kemiskinan berbasis Rumah Ibadah. Visualisasi sebaran KK
miskin, ekstrem, dan blank spot layanan sosial Kota Pontianak.
</p>
<div class="card-tags">
<span class="tag"><span class="tag-dot dot-red"></span> Data KK Miskin</span>
<span class="tag"><span class="tag-dot dot-teal"></span> Rumah Ibadah</span>
<span class="tag"><span class="tag-dot dot-amber"></span> Laporan Warga</span>
<span class="tag"><span class="tag-dot dot-purple"></span> Dashboard</span>
</div>
<a href="geososial/index.php" class="card-cta cta-teal" onclick="event.stopPropagation()">
<span>Buka Aplikasi</span>
<span class="card-arrow"></span>
</a>
</div>
<div class="card-stats">
<div class="stat-item">
<div class="stat-n">Total KK</div>
<div class="stat-v sv-teal" id="st-kk"></div>
</div>
<div class="stat-item">
<div class="stat-n">Sgt Miskin</div>
<div class="stat-v sv-red" id="st-sm"></div>
</div>
<div class="stat-item">
<div class="stat-n">Kelurahan</div>
<div class="stat-v sv-teal">24</div>
</div>
</div>
</div>
</div>
<!-- Bottom Info -->
<div class="bottom-info">
<div class="info-left">
<div class="info-chip">
<span class="info-chip-ic">🏙️</span>
Kota Pontianak, Kalimantan Barat
</div>
<div class="info-chip">
<span class="info-chip-ic">📅</span>
Tahun Anggaran 20252026
</div>
<div class="info-chip">
<span class="info-chip-ic">🔒</span>
Sistem Terverifikasi
</div>
</div>
<div class="footer-text">
Dinas Sosial &amp; Tata Ruang Kota Pontianak<br>
WebGIS Platform &copy; 2025
</div>
</div>
</div><!-- /page -->
<script>
// Mouse-follow glow effect for each card
document.querySelectorAll('.project-card').forEach(card => {
const glow = card.querySelector('.card-glow');
card.addEventListener('mousemove', e => {
const rect = card.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
glow.style.left = x + 'px';
glow.style.top = y + 'px';
});
});
// Load live stats from SPBU project
fetch('spbu/ambil_data.php')
.then(r => r.json())
.then(d => {
if (Array.isArray(d)) {
document.getElementById('st-spbu').textContent = d.length;
}
})
.catch(() => {});
fetch('spbu/ambil_jalan.php')
.then(r => r.json())
.then(d => {
if (Array.isArray(d) || (d && d.features)) {
const n = Array.isArray(d) ? d.length : d.features.length;
document.getElementById('st-jalan').textContent = n;
}
})
.catch(() => {});
fetch('spbu/ambil_parsil.php')
.then(r => r.json())
.then(d => {
if (Array.isArray(d) || (d && d.features)) {
const n = Array.isArray(d) ? d.length : d.features.length;
document.getElementById('st-parsil').textContent = n;
}
})
.catch(() => {});
// Load live stats from GeoSosial project
fetch('geososial/api/dashboard.php')
.then(r => r.json())
.then(j => {
if (!j.success) return;
const kpis = j.data?.kpis || {};
const kk = kpis.total_kk || 0;
const sm = kpis.sangat_miskin || 0;
document.getElementById('st-kk').textContent = kk > 999 ? (kk/1000).toFixed(1)+'K' : kk;
document.getElementById('st-sm').textContent = sm > 999 ? (sm/1000).toFixed(1)+'K' : sm;
})
.catch(() => {});
</script>
</body>
</html>