{"id":120,"date":"2026-07-22T06:01:21","date_gmt":"2026-07-21T23:01:21","guid":{"rendered":"https:\/\/dev.ympai.org\/family-community-learning-center\/"},"modified":"2026-09-03T16:11:10","modified_gmt":"2026-09-03T09:11:10","slug":"fclc","status":"publish","type":"page","link":"https:\/\/ympai.org\/en\/fclc\/","title":{"rendered":"Family &#038; Community Learning Center"},"content":{"rendered":"\n<div class=\"wp-block-group alignfull has-background has-global-padding is-content-justification-center is-layout-constrained wp-container-core-group-is-layout-792b74f4 wp-block-group-is-layout-constrained\" style=\"background-color:#eef2fa;margin-top:0;margin-bottom:0;padding-top:80px;padding-right:48px;padding-bottom:80px;padding-left:48px\">\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-794e3cfa wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<div class=\"wp-block-group has-text-color has-link-color wp-elements-1 is-vertical is-layout-flex wp-container-core-group-is-layout-89410b5e wp-block-group-is-layout-flex\" style=\"color:#eef2fa\">\n<h2 class=\"wp-block-heading has-text-color has-link-color has-merriweather-font-family wp-elements-2\" style=\"color:#0d1e3a;font-style:normal;font-weight:600\">Family &amp; Community Learning Center<\/h2>\n\n\n\n<p class=\"has-text-color has-link-color has-lato-font-family wp-elements-3 wp-block-paragraph\" style=\"color:#4a5568;font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);font-style:normal;font-weight:400;text-transform:none\">Family &amp; Community Learning Center menjadi wadah untuk mengumpulkan data sekaligus menyediakan materi edukasi keluarga yang lengkap, mulai dari tahap dasar sampai lanjut. Kami berupaya membangun lingkungan belajar yang inklusif demi mendukung kesehatan mental generasi mendatang. Dengan basis data lapangan yang akurat, program ini dirancang untuk mencetak praktisi yang teredukasi serta memperkuat dukungan kesehatan mental dan edukasi bagi masyarakat luas.<\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-vertically-aligned-center is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:50%\">\n<figure class=\"wp-block-image size-full has-custom-border\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"563\" src=\"https:\/\/ympai.org\/wp-content\/uploads\/2026\/08\/ympai_3_20250309_105022-3_edited-1-1.png\" alt=\"\" class=\"wp-image-312\" style=\"border-top-left-radius:18px;border-top-right-radius:18px;border-bottom-left-radius:18px;border-bottom-right-radius:18px;object-fit:cover\" srcset=\"https:\/\/ympai.org\/wp-content\/uploads\/2026\/08\/ympai_3_20250309_105022-3_edited-1-1.png 1000w, https:\/\/ympai.org\/wp-content\/uploads\/2026\/08\/ympai_3_20250309_105022-3_edited-1-1-300x169.png 300w, https:\/\/ympai.org\/wp-content\/uploads\/2026\/08\/ympai_3_20250309_105022-3_edited-1-1-768x432.png 768w, https:\/\/ympai.org\/wp-content\/uploads\/2026\/08\/ympai_3_20250309_105022-3_edited-1-1-18x10.png 18w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n<\/div>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-global-padding is-content-justification-center is-layout-constrained wp-container-core-group-is-layout-abde3486 wp-block-group-is-layout-constrained\" style=\"margin-top:0;margin-bottom:0;padding-top:80px;padding-right:48px;padding-bottom:80px;padding-left:48px\">\n<h2 class=\"wp-block-heading has-text-align-center has-text-color has-link-color has-merriweather-font-family wp-elements-4\" style=\"color:#0f1c3f;font-style:normal;font-weight:600\">Fasilitator Kami<\/h2>\n\n\n\n<style data-wp-block-html=\"css\">\n#fk-tabs { display: none; }\n\n#fk-wilayah-picker { position: relative; max-width: 320px; margin: 32px auto 20px; }\n#fk-wilayah-search {\n  width: 100%;\n  padding: 10px 16px;\n  border: 1px solid #222;\n  border-radius: 50px;\n  font-size: 14px;\n  box-sizing: border-box;\n}\n#fk-wilayah-dropdown {\n  position: absolute;\n  top: calc(100% + 4px);\n  left: 0;\n  right: 0;\n  background: #fff;\n  border: 1px solid #e0e0e0;\n  border-radius: 12px;\n  max-height: 240px;\n  overflow-y: auto;\n  z-index: 10;\n  box-shadow: 0 4px 12px rgba(0,0,0,0.08);\n}\n.fk-dropdown-hidden { display: none; }\n.fk-dropdown-item { padding: 10px 16px; cursor: pointer; font-size: 14px; }\n.fk-dropdown-item:hover { background: #f5f5f5; }\n.fk-dropdown-empty { padding: 10px 16px; font-size: 13px; color: #999; }\n#fk-wilayah-selected { margin-bottom: 20px; text-align: center; }\n.fk-chip {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n  padding: 6px 14px;\n  background: #111;\n  color: #fff;\n  border-radius: 50px;\n  font-size: 13px;\n}\n.fk-chip button { background: none; border: none; color: #fff; cursor: pointer; font-size: 14px; line-height: 1; padding: 0; }\n\n#fk-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; }\n@media (max-width: 992px) { #fk-grid { grid-template-columns: repeat(2, 1fr); } }\n@media (max-width: 576px) { #fk-grid { grid-template-columns: repeat(1, 1fr); } }\n.fk-card { background: #fff; border: 1px solid #e0e0e0; border-radius: 20px; overflow: hidden; text-align: center; }\n.fk-card img { width: 100%; aspect-ratio: 3 \/ 2; object-fit: cover; background: #f0f0f0; }\n.fk-card h4 { font-size: 16px; margin: 12px 16px 2px; }\n.fk-card p { font-size: 14px; color: #666; margin: 0 16px 16px; }\n.fk-empty, .fk-loading, .fk-error { grid-column: 1 \/ -1; text-align: center; padding: 40px 0; color: #777; }\n.fk-error { color: #b32424; }\n.fk-retry { margin-top: 10px; padding: 8px 20px; border: 1px solid #b32424; background: #fff; color: #b32424; border-radius: 6px; cursor: pointer; }\n#fk-more { display: block; margin: 30px auto 0; padding: 10px 28px; border: 1px solid #1b3a6b; background: #fff; color: #1b3a6b; border-radius: 8px; cursor: pointer; }\n.fk-photo-box {\n  width: 100%;\n  aspect-ratio: 3 \/ 2;\n  background: #f0f0f0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.fk-photo-box img {\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n}\n.fk-photo-box svg {\n  width: 38%;\n  height: 38%;\n  fill: #c0c4cc;\n}\n<\/style>\n\n<div id=\"fk-wilayah-picker\">\n  <input type=\"text\" id=\"fk-wilayah-search\" placeholder=\"Cari wilayah...\" autocomplete=\"off\">\n  <div id=\"fk-wilayah-dropdown\" class=\"fk-dropdown-hidden\"><\/div>\n<\/div>\n<div id=\"fk-wilayah-selected\"><\/div>\n\n<div id=\"fk-grid\">\n  <p class=\"fk-loading\">Memuat data fasilitator&#8230;<\/p>\n<\/div>\n<button id=\"fk-more\" style=\"display:none;\" onclick=\"tambahTampil()\">Lihat lainnya<\/button>\n\n<script>\nlet wilayahAktif = '';\nlet halamanIni = 1;\nconst perHalaman = 4;\nlet totalHalaman = 1;\nlet suggestionAktif = [];\n\nconst API_FASILITATOR = 'https:\/\/ympai.org\/wp-json\/ympai\/v1\/fasilitator';\nconst API_CARI_WILAYAH = 'https:\/\/ympai.org\/wp-json\/ympai\/v1\/cari-wilayah-fasilitator';\nconst isEnglish = window.location.pathname.startsWith('\/en\/');\n\nconst teksUI = {\n  loading: isEnglish ? 'Loading facilitator data...' : 'Memuat data fasilitator...',\n  empty: isEnglish ? 'No facilitators in this region yet.' : 'Belum ada fasilitator di wilayah ini.',\n  error: isEnglish ? 'Failed to load facilitator data.' : 'Gagal memuat data fasilitator.',\n  retry: isEnglish ? 'Try Again' : 'Coba Lagi',\n  more: isEnglish ? 'See More' : 'Lihat lainnya',\n  searchPlaceholder: isEnglish ? 'Search region...' : 'Cari wilayah...',\n  noResult: isEnglish ? 'No region found' : 'Wilayah tidak ditemukan'\n};\n\ndocument.getElementById('fk-more').textContent = teksUI.more;\nconst searchInput = document.getElementById('fk-wilayah-search');\nsearchInput.placeholder = teksUI.searchPlaceholder;\nconst dropdownEl = document.getElementById('fk-wilayah-dropdown');\n\nlet debounceTimer = null;\nsearchInput.addEventListener('input', () => {\n  clearTimeout(debounceTimer);\n  const keyword = searchInput.value.trim();\n  debounceTimer = setTimeout(() => cariWilayah(keyword), 300);\n});\n\nsearchInput.addEventListener('focus', () => {\n  cariWilayah(searchInput.value.trim());\n});\n\nsearchInput.addEventListener('keydown', (e) => {\n  if (e.key === 'Enter') {\n    e.preventDefault();\n    if (suggestionAktif.length > 0) pilihWilayah(suggestionAktif[0]);\n  }\n});\n\ndocument.addEventListener('click', (e) => {\n  if (!document.getElementById('fk-wilayah-picker').contains(e.target)) {\n    dropdownEl.classList.add('fk-dropdown-hidden');\n  }\n});\n\nasync function cariWilayah(keyword) {\n  const url = new URL(API_CARI_WILAYAH);\n  if (keyword) url.searchParams.set('search', keyword);\n\n  try {\n    const res = await fetch(url);\n    if (!res.ok) throw new Error(`HTTP ${res.status}`);\n    const json = await res.json();\n    suggestionAktif = json.wilayah || [];\n    renderDropdownWilayah(suggestionAktif);\n  } catch (error) {\n    console.error('Error fetching wilayah:', error);\n    suggestionAktif = [];\n    dropdownEl.innerHTML = `<div class=\"fk-dropdown-empty\">${teksUI.error}<\/div>`;\n    dropdownEl.classList.remove('fk-dropdown-hidden');\n  }\n}\n\nfunction renderDropdownWilayah(daftarWilayah) {\n  dropdownEl.innerHTML = daftarWilayah.length === 0\n    ? `<div class=\"fk-dropdown-empty\">${teksUI.noResult}<\/div>`\n    : daftarWilayah.map(w => `<div class=\"fk-dropdown-item\" onclick=\"pilihWilayah('${w.replace(\/'\/g, \"\\\\'\")}')\">${w}<\/div>`).join('');\n  dropdownEl.classList.remove('fk-dropdown-hidden');\n}\n\nfunction pilihWilayah(nama) {\n  wilayahAktif = nama;\n  searchInput.value = '';\n  suggestionAktif = [];\n  dropdownEl.classList.add('fk-dropdown-hidden');\n  renderChipWilayah();\n  halamanIni = 1;\n  loadFasilitator();\n}\n\nfunction hapusWilayah() {\n  wilayahAktif = '';\n  renderChipWilayah();\n  halamanIni = 1;\n  loadFasilitator();\n}\n\nfunction renderChipWilayah() {\n  const selectedEl = document.getElementById('fk-wilayah-selected');\n  selectedEl.innerHTML = wilayahAktif\n    ? `<span class=\"fk-chip\">${wilayahAktif} <button onclick=\"hapusWilayah()\">\u2715<\/button><\/span>`\n    : '';\n}\n\nasync function loadFasilitator() {\n  const gridEl = document.getElementById('fk-grid');\n  const moreBtn = document.getElementById('fk-more');\n  if (halamanIni === 1) gridEl.innerHTML = `<p class=\"fk-loading\">${teksUI.loading}<\/p>`;\n  moreBtn.style.display = 'none';\n\n  const url = new URL(API_FASILITATOR);\n  url.searchParams.set('page', halamanIni);\n  url.searchParams.set('per_page', perHalaman);\n  if (wilayahAktif) url.searchParams.set('wilayah', wilayahAktif);\n\n  try {\n    const response = await fetch(url);\n    if (!response.ok) throw new Error(`HTTP ${response.status}`);\n    const json = await response.json();\n\n    totalHalaman = json.total_pages || 1;\n    renderGridFasilitator(json.data || [], halamanIni === 1);\n    moreBtn.style.display = halamanIni < totalHalaman ? 'block' : 'none';\n  } catch (error) {\n    console.error('Error fetching fasilitator:', error);\n    gridEl.innerHTML = `<div class=\"fk-error\">${teksUI.error}<br><button class=\"fk-retry\" onclick=\"loadFasilitator()\">${teksUI.retry}<\/button><\/div>`;\n  }\n}\n\nfunction renderGridFasilitator(data, isFirstPage) {\n  const gridEl = document.getElementById('fk-grid');\n  const ikonOrang = `<svg viewBox=\"0 0 24 24\"><path d=\"M12 12c2.7 0 4.9-2.2 4.9-4.9S14.7 2.2 12 2.2 7.1 4.4 7.1 7.1 9.3 12 12 12zm0 2.5c-3.3 0-9.8 1.6-9.8 4.9v2.4h19.6v-2.4c0-3.3-6.5-4.9-9.8-4.9z\"\/><\/svg>`;\n\n  if (isFirstPage && data.length === 0) {\n    gridEl.innerHTML = `<div class=\"fk-empty\">${teksUI.empty}<\/div>`;\n    return;\n  }\n\n  const html = data.map(k => {\n    const foto = k.foto ? `<img decoding=\"async\" src=\"${k.foto}\" alt=\"${k.nama}\">` : ikonOrang;\n    return `<div class=\"fk-card\"><div class=\"fk-photo-box\">${foto}<\/div><h4>${k.nama}<\/h4><p>${k.nama_wilayah}<\/p><\/div>`;\n  }).join('');\n\n  gridEl.innerHTML = isFirstPage ? html : gridEl.innerHTML + html;\n}\n\nfunction tambahTampil() {\n  halamanIni += 1;\n  loadFasilitator();\n}\n\nwindow.addEventListener('load', loadFasilitator);\n<\/script>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-global-padding is-content-justification-center is-layout-constrained wp-container-core-group-is-layout-abde3486 wp-block-group-is-layout-constrained\" style=\"margin-top:0;margin-bottom:0;padding-top:80px;padding-right:48px;padding-bottom:80px;padding-left:48px\">\n<h2 class=\"wp-block-heading has-text-align-center has-text-color has-link-color has-merriweather-font-family wp-elements-5\" style=\"color:#0f1c3f;font-style:normal;font-weight:600\">Peta Persebaran Program<\/h2>\n\n\n\n<style data-wp-block-html=\"css\">\n#peta-wrapper {\n  display: flex;\n  gap: 0;\n  border: 1px solid #e0e0e0;\n  border-radius: 12px;\n  overflow: hidden;\n}\n\n#peta-program .leaflet-tile-pane {\n  filter: saturate(0.5) brightness(1.05);\n}\n\n#peta-list {\n  width: 340px;\n  flex-shrink: 0;\n  max-height: 500px;\n  overflow-y: auto;\n  padding: 20px;\n  background: #fff;\n}\n#peta-program {\n  flex: 1;\n  height: 500px;\n}\n.pl-item {\n  border: none;\n  border-bottom: 1px solid #eee;\n  padding: 16px 4px;\n  cursor: pointer;\n}\n.pl-item:last-child { border-bottom: none; }\n.pl-item.aktif {\n  border: 1.5px solid #1b3a6b;\n  border-radius: 10px;\n  padding: 16px;\n  margin: 4px 0;\n}\n.pl-nama {\n  font-weight: 700;\n  font-size: 15px;\n  color: #101828;\n  margin-bottom: 8px;\n}\n.pl-stat {\n  font-size: 14px;\n  color: #333;\n}\n.pl-loading, .pl-error {\n  text-align: center;\n  color: #777;\n  padding: 30px 10px;\n}\n.pl-error { color: #b32424; }\n.pl-retry {\n  margin-top: 10px;\n  padding: 6px 18px;\n  border: 1px solid #b32424;\n  background: #fff;\n  color: #b32424;\n  border-radius: 6px;\n  cursor: pointer;\n}\n\n@media (max-width: 768px) {\n  #peta-wrapper {\n    flex-direction: column;\n  }\n  #peta-program {\n    order: -1;\n    flex: none;\n    height: 220px;\n  }\n  #peta-list {\n    order: 2;\n    width: 100%;\n    max-height: none;\n    display: flex;\n    flex-direction: row;\n    overflow-x: auto;\n    overflow-y: hidden;\n    -webkit-overflow-scrolling: touch;\n    gap: 12px;\n    padding: 16px;\n  }\n  .pl-item {\n    flex: 0 0 260px;\n    border: 1px solid #eee;\n    border-radius: 10px;\n    padding: 14px;\n    margin: 0;\n  }\n  .pl-item.aktif {\n    border: 1.5px solid #1b3a6b;\n    padding: 14px;\n    margin: 0;\n  }\n}\n\n.popup-kelurahan .leaflet-popup-content-wrapper {\n  background: #fff;\n  border: 1.5px solid #1b3a6b;\n  border-radius: 12px;\n  box-shadow: 0 4px 12px rgba(0,0,0,0.1);\n}\n.popup-kelurahan .leaflet-popup-content {\n  margin: 14px 16px;\n  font-size: 14px;\n  line-height: 1.5;\n}\n.popup-kelurahan .leaflet-popup-content strong {\n  display: block;\n  font-size: 15px;\n  color: #101828;\n  margin-bottom: 4px;\n}\n.popup-kelurahan .leaflet-popup-tip {\n  background: #fff;\n  border: 1.5px solid #1b3a6b;\n}\n<\/style>\n\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\">\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n<div id=\"peta-wrapper\">\n  <div id=\"peta-list\">\n    <p class=\"pl-loading\">Memuat data wilayah&#8230;<\/p>\n  <\/div>\n  <div id=\"peta-program\"><\/div>\n<\/div>\n<script>\n(function () {\n  let map = null;\n  let markers = [];\n  const API_KELURAHAN = 'https:\/\/ympai.org\/wp-json\/ympai\/v1\/kelurahan';\n\n  const isEnglish = window.location.pathname.startsWith('\/en\/');\n\n  const teksUI = {\n    loading: isEnglish ? 'Loading region data...' : 'Memuat data wilayah...',\n    empty: isEnglish ? 'No region data yet.' : 'Belum ada data wilayah.',\n    noCoord: isEnglish ? 'No valid coordinates found.' : 'Tidak ada lokasi koordinat yang valid.',\n    error: isEnglish ? 'Failed to load region data.' : 'Gagal memuat data wilayah.',\n    retry: isEnglish ? 'Try Again' : 'Coba Lagi',\n    program: isEnglish ? 'Program' : 'Program',\n    peserta: isEnglish ? 'Participants' : 'Peserta'\n  };\n\n  const iconMerah = new L.Icon({\n    iconUrl: 'https:\/\/raw.githubusercontent.com\/pointhi\/leaflet-color-markers\/master\/img\/marker-icon-2x-red.png',\n    shadowUrl: 'https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/leaflet\/1.7.1\/images\/marker-shadow.png',\n    iconSize: [25, 41],\n    iconAnchor: [12, 41],\n    popupAnchor: [1, -34],\n    shadowSize: [41, 41]\n  });\n\n  function initMap() {\n    map = L.map('peta-program').setView([-6.402, 106.794], 11);\n    L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n      attribution: '&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a> contributors'\n    }).addTo(map);\n    window.addEventListener('resize', () => map.invalidateSize());\n    setTimeout(() => map.invalidateSize(), 300);\n  }\n\n  function isiPopupHtml(item) {\n    return `<strong>${item.nama}<\/strong>${item.program} ${teksUI.program}, ${item.peserta} ${teksUI.peserta}`;\n  }\n\n  function pilihItemKelurahan(index) {\n    document.querySelectorAll('.pl-item').forEach(el => el.classList.remove('aktif'));\n    const activeEl = document.getElementById(`pl-item-${index}`);\n    if (activeEl) activeEl.classList.add('aktif');\n    const m = markers[index];\n    if (m) {\n      map.setView(m.getLatLng(), 14, { animate: true });\n      setTimeout(() => m.openPopup(), 300);\n    }\n  }\n\n  async function loadKelurahan() {\n    const listEl = document.getElementById('peta-list');\n    listEl.innerHTML = `<p class=\"pl-loading\">${teksUI.loading}<\/p>`;\n    markers.forEach(m => map.removeLayer(m));\n    markers = [];\n    try {\n      const response = await fetch(API_KELURAHAN);\n      if (!response.ok) throw new Error(`HTTP ${response.status}`);\n      const list = await response.json();\n      if (!Array.isArray(list) || list.length === 0) {\n        listEl.innerHTML = `<div class=\"pl-loading\">${teksUI.empty}<\/div>`;\n        return;\n      }\n      listEl.innerHTML = '';\n      let validMarkerIndex = 0;\n      list.forEach(item => {\n        if (!item.latitude || !item.longitude) return;\n        const currentIdx = validMarkerIndex;\n        const marker = L.marker([item.latitude, item.longitude], { icon: iconMerah })\n          .addTo(map)\n          .bindPopup(isiPopupHtml(item), { className: 'popup-kelurahan' });\n\n        markers.push(marker);\n        const el = document.createElement('div');\n        el.className = `pl-item ${currentIdx === 0 ? 'aktif' : ''}`;\n        el.id = `pl-item-${currentIdx}`;\n        el.innerHTML = `\n          <div class=\"pl-nama\">${item.nama}<\/div>\n          <div class=\"pl-stat\">${item.program} ${teksUI.program.toLowerCase()}, ${item.peserta} ${teksUI.peserta.toLowerCase()}<\/div>\n        `;\n\n        el.addEventListener('click', () => pilihItemKelurahan(currentIdx));\n        listEl.appendChild(el);\n        validMarkerIndex++;\n      });\n      if (markers.length > 0) {\n        map.setView(markers[0].getLatLng(), 14);\n      } else {\n        listEl.innerHTML = `<div class=\"pl-loading\">${teksUI.noCoord}<\/div>`;\n      }\n    } catch (err) {\n      console.error('Gagal ambil data kelurahan:', err);\n      listEl.innerHTML = `\n        <div class=\"pl-error\">\n          ${teksUI.error}<br>\n          <button class=\"pl-retry\" onclick=\"window.__loadKelurahan()\">${teksUI.retry}<\/button>\n        <\/div>`;\n    }\n  }\n\n  window.__loadKelurahan = loadKelurahan; \/\/ biar tombol retry inline onclick bisa manggil\n\n  window.addEventListener('load', () => {\n    initMap();\n    loadKelurahan();\n  });\n})();\n<\/script>\n<\/div>\n\n\n\n<div class=\"wp-block-group alignfull has-global-padding is-content-justification-center is-layout-constrained wp-container-core-group-is-layout-abde3486 wp-block-group-is-layout-constrained\" style=\"margin-top:0;margin-bottom:0;padding-top:80px;padding-right:48px;padding-bottom:80px;padding-left:48px\">\n<h2 class=\"wp-block-heading has-text-align-center has-text-color has-link-color has-merriweather-font-family wp-elements-6\" style=\"color:#0f1c3f;font-style:normal;font-weight:600\">Ringkasan Program Terakhir<\/h2>\n\n\n\n<style data-wp-block-html=\"css\">\n.ympai-card {\n  max-width: 900px;\n  margin: 32px auto 0;\n  background: #fff;\n  border: 1px solid #eceef1;\n  border-radius: 14px;\n  overflow: hidden;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Arial, sans-serif;\n  box-shadow: 0 2px 8px rgba(16, 24, 40, 0.05);\n}\n.ympai-header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-wrap: wrap;\n  gap: 12px;\n  padding: 22px 24px 18px;\n}\n.ympai-header h2 {\n  margin: 0;\n  font-family: Georgia, \"Times New Roman\", serif;\n  font-size: 26px;\n  font-weight: 700;\n  color: #1f2430;\n}\n.ympai-filters {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  flex-wrap: wrap;\n}\n.ympai-dash {\n  color: #98a2b3;\n}\n.ympai-select {\n  padding: 6px 10px;\n  border: 1px solid #e2e5ea;\n  border-radius: 8px;\n  background: #fff;\n  font-size: 13px;\n  color: #667085;\n  cursor: pointer;\n}\ninput[type=\"date\"].ympai-select {\n  font-family: inherit;\n  cursor: text;\n}\n.ympai-clear-btn {\n  border: 1px solid #e2e5ea;\n  border-radius: 8px;\n  background: #fff;\n  color: #98a2b3;\n  width: 30px;\n  flex-shrink: 0;\n  font-size: 15px;\n  line-height: 1;\n  cursor: pointer;\n}\n.ympai-clear-btn:hover {\n  background: #f8f9fb;\n  color: #444;\n}\n.ympai-table-wrap {\n  overflow-x: auto;\n  padding: 0 24px;\n}\n.ympai-table {\n  width: 100%;\n  border-collapse: collapse;\n  font-size: 14px;\n}\n.ympai-table thead th {\n  text-align: left;\n  background: transparent;\n  color: #1f2430;\n  font-weight: 700;\n  padding: 10px 14px 14px;\n  border-bottom: 2px solid #eceef1;\n  white-space: nowrap;\n}\n.ympai-table tbody td {\n  padding: 14px 14px;\n  border-bottom: 1px solid #f1f2f4;\n  color: #475467;\n  white-space: nowrap;\n}\n.ympai-table tbody tr:last-child td {\n  border-bottom: none;\n}\n.ympai-loading,\n.ympai-empty,\n.ympai-error {\n  text-align: center;\n  padding: 24px 14px;\n  color: #888;\n}\n.ympai-error {\n  color: #b3452c;\n}\n.ympai-retry-btn {\n  margin-left: 8px;\n  padding: 4px 12px;\n  border: 1px solid #b3452c;\n  border-radius: 6px;\n  background: #fff;\n  color: #b3452c;\n  font-size: 13px;\n  cursor: pointer;\n}\n.ympai-retry-btn:hover {\n  background: #b3452c;\n  color: #fff;\n}\n.ympai-footer {\n  text-align: center;\n  padding: 12px;\n  margin: 18px 0 0;\n  background: #eef1f6;\n  color: #667085;\n  font-size: 13px;\n}\n.ympai-pagination {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 12px;\n  padding: 16px 24px 4px;\n  font-size: 13px;\n  color: #667085;\n}\n.ympai-page-btn {\n  padding: 6px 12px;\n  border: 1px solid #e2e5ea;\n  border-radius: 8px;\n  background: #fff;\n  color: #475467;\n  font-size: 13px;\n  cursor: pointer;\n}\n.ympai-page-btn:hover:not(:disabled) {\n  background: #f8f9fb;\n}\n.ympai-page-btn:disabled {\n  opacity: 0.4;\n  cursor: not-allowed;\n}\n\n@media (max-width: 640px) {\n  .ympai-header {\n    padding: 18px 16px 14px;\n  }\n  .ympai-header h2 {\n    font-size: 21px;\n  }\n\n  \/* filter: Dari - Sampai satu baris dibagi rata, Wilayah full-width di baris sendiri *\/\n  .ympai-filters {\n    width: 100%;\n  }\n  #ympaiFilterDari,\n  #ympaiFilterSampai {\n    flex: 1 1 0;\n    min-width: 0; \/* biar input date bisa nyusut, gak overflow *\/\n  }\n  #ympaiFilterWilayah {\n    flex: 1 1 100%;\n    width: 100%;\n  }\n\n  \/* tabel: scroll horizontal (kolom banyak) + scroll vertical (data banyak) *\/\n  .ympai-table-wrap {\n    padding: 0 16px;\n    max-height: 360px;\n    overflow-y: auto;\n  }\n  .ympai-table thead th {\n    position: sticky;\n    top: 0;\n    background: #fff;\n    padding: 8px 10px 10px;\n    font-size: 13px;\n  }\n  .ympai-table tbody td {\n    padding: 10px 10px;\n    font-size: 13px;\n  }\n\n  .ympai-pagination {\n    padding: 12px 16px 4px;\n  }\n}\n<\/style>\n\n<div class=\"ympai-card\" id=\"ympaiCard\">\n\n\n    <div class=\"ympai-filters\">\n      <input type=\"date\" id=\"ympaiFilterDari\" class=\"ympai-select\" title=\"Dari tanggal\">\n      <span class=\"ympai-dash\">\u2013<\/span>\n      <input type=\"date\" id=\"ympaiFilterSampai\" class=\"ympai-select\" title=\"Sampai tanggal\">\n      <button type=\"button\" id=\"ympaiClearTanggal\" class=\"ympai-clear-btn\" title=\"Hapus filter tanggal\">\u00d7<\/button>\n\n      <select id=\"ympaiFilterWilayah\" class=\"ympai-select\"><\/select>\n    <\/div>\n  <\/div>\n\n  <div class=\"ympai-table-wrap\">\n    <table class=\"ympai-table\">\n      <thead>\n        <tr>\n          <th>Nama Program<\/th>\n          <th>Tanggal<\/th>\n          <th>Peserta<\/th>\n          <th>Wilayah<\/th>\n        <\/tr>\n      <\/thead>\n      <tbody id=\"ympaiTableBody\">\n        <tr><td colspan=\"4\" class=\"ympai-loading\">Memuat data&#8230;<\/td><\/tr>\n      <\/tbody>\n    <\/table>\n  <\/div>\n\n  <div class=\"ympai-pagination\" id=\"ympaiPagination\"><\/div>\n\n  <div class=\"ympai-footer\">\n    Data diupdate oleh Admin Internal YMPAI\n  <\/div>\n\n\n\n\n<script>\n(() => {\n  const API_BASE = 'https:\/\/ympai.org\/wp-json\/ympai\/v1';\n  const PER_PAGE = 10;\n\n  const isEnglish = window.location.pathname.startsWith('\/en\/');\n\n  const teksUI = {\n    loading: isEnglish ? 'Loading data...' : 'Memuat data...',\n    empty: isEnglish ? 'No program data yet.' : 'Belum ada data program.',\n    error: isEnglish ? 'Failed to load data.' : 'Gagal memuat data.',\n    retry: isEnglish ? 'Try Again' : 'Coba lagi',\n    semuaWilayah: isEnglish ? 'All Regions' : 'Semua Wilayah',\n    prev: isEnglish ? 'Previous' : 'Sebelumnya',\n    next: isEnglish ? 'Next' : 'Selanjutnya',\n    pageLabel: (page, total) => isEnglish ? `Page ${page} of ${total}` : `Halaman ${page} dari ${total}`\n  };\n\n  const tbody       = document.getElementById('ympaiTableBody');\n  const inputDari   = document.getElementById('ympaiFilterDari');\n  const inputSampai = document.getElementById('ympaiFilterSampai');\n  const btnClear    = document.getElementById('ympaiClearTanggal');\n  const selWilayah  = document.getElementById('ympaiFilterWilayah');\n  const paginationEl = document.getElementById('ympaiPagination');\n\n  let currentPage = 1;\n\n  async function loadFilterOptions() {\n    const optSemua = document.createElement('option');\n    optSemua.value = 'all';\n    optSemua.textContent = teksUI.semuaWilayah;\n    selWilayah.appendChild(optSemua);\n\n    try {\n      const res = await fetch(`${API_BASE}\/filter-options`);\n      if (!res.ok) return;\n\n      const data = await res.json();\n      (data.wilayah || []).forEach(w => {\n        const opt = document.createElement('option');\n        opt.value = w;\n        opt.textContent = w;\n        selWilayah.appendChild(opt);\n      });\n    } catch (err) {\n      \/\/ Dropdown gagal dimuat, tabel tetap berfungsi tanpa filter wilayah\n    }\n  }\n\n  function buildParams() {\n    const params = new URLSearchParams();\n    if (inputDari.value) params.set('tanggal_dari', inputDari.value);\n    if (inputSampai.value) params.set('tanggal_sampai', inputSampai.value);\n    if (selWilayah.value !== 'all') params.set('wilayah', selWilayah.value);\n    params.set('page', currentPage);\n    params.set('per_page', PER_PAGE);\n    return params;\n  }\n\n  function renderPagination(page, totalPages) {\n    currentPage = page;\n\n    if (totalPages <= 1) {\n      paginationEl.innerHTML = '';\n      return;\n    }\n\n    paginationEl.innerHTML = `\n      <button type=\"button\" class=\"ympai-page-btn\" id=\"ympaiPrevBtn\" ${page <= 1 ? 'disabled' : ''}>${teksUI.prev}<\/button>\n      <span>${teksUI.pageLabel(page, totalPages)}<\/span>\n      <button type=\"button\" class=\"ympai-page-btn\" id=\"ympaiNextBtn\" ${page >= totalPages ? 'disabled' : ''}>${teksUI.next}<\/button>\n    `;\n\n    document.getElementById('ympaiPrevBtn')?.addEventListener('click', () => {\n      currentPage -= 1;\n      loadTable();\n    });\n    document.getElementById('ympaiNextBtn')?.addEventListener('click', () => {\n      currentPage += 1;\n      loadTable();\n    });\n  }\n\n  async function loadTable() {\n    tbody.innerHTML = `<tr><td colspan=\"4\" class=\"ympai-loading\">${teksUI.loading}<\/td><\/tr>`;\n    paginationEl.innerHTML = '';\n\n    try {\n      const res = await fetch(`${API_BASE}\/kegiatan?${buildParams().toString()}`);\n      if (!res.ok) throw new Error(`HTTP ${res.status}`);\n\n      const result = await res.json();\n      const rows = result.data || [];\n\n      if (rows.length === 0) {\n        tbody.innerHTML = `<tr><td colspan=\"4\" class=\"ympai-empty\">${teksUI.empty}<\/td><\/tr>`;\n        return;\n      }\n\n      tbody.innerHTML = rows.map(row => `\n        <tr>\n          <td>${escapeHtml(row.nama_program)}<\/td>\n          <td>${escapeHtml(row.tanggal)}<\/td>\n          <td>${escapeHtml(row.jumlah_peserta)}<\/td>\n          <td>${escapeHtml(row.wilayah)}<\/td>\n        <\/tr>\n      `).join('');\n\n      renderPagination(result.page, result.total_pages);\n\n    } catch (err) {\n      console.error('Error loading table:', err);\n      tbody.innerHTML = `\n        <tr>\n          <td colspan=\"4\" class=\"ympai-error\">\n            ${teksUI.error}\n            <button type=\"button\" class=\"ympai-retry-btn\" id=\"ympaiRetryBtn\">${teksUI.retry}<\/button>\n          <\/td>\n        <\/tr>`;\n\n      document.getElementById('ympaiRetryBtn')?.addEventListener('click', loadTable);\n    }\n  }\n\n  function escapeHtml(str) {\n    if (str === null || str === undefined) return '';\n    return String(str)\n      .replace(\/&\/g, '&amp;')\n      .replace(\/<\/g, '&lt;')\n      .replace(\/>\/g, '&gt;');\n  }\n\n  function resetKeHalaman1DanMuat() {\n    currentPage = 1;\n    loadTable();\n  }\n\n  inputDari.addEventListener('change', resetKeHalaman1DanMuat);\n  inputSampai.addEventListener('change', resetKeHalaman1DanMuat);\n  selWilayah.addEventListener('change', resetKeHalaman1DanMuat);\n  btnClear.addEventListener('click', () => {\n    inputDari.value = '';\n    inputSampai.value = '';\n    resetKeHalaman1DanMuat();\n  });\n\n  loadFilterOptions();\n  loadTable();\n})();\n<\/script>\n<\/div>\n\n\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-794e3cfa wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:33.33%\"><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:66.66%\"><\/div>\n<\/div>\n\n\n\n<!-- 1. STYLING CSS TERISOLASI (AMAN UNTUK HEADER) -->\n<style>\n  \/* Menjaga CSS hanya aktif di dalam .fasilitator-wrapper *\/\n  .fasilitator-wrapper {\n    width: 100%;\n    max-width: 1200px;\n    margin: 40px auto;\n    padding: 0 20px;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n    box-sizing: border-box;\n  }\n\n  .fasilitator-wrapper .fasilitator-main-title {\n    text-align: center;\n    font-size: 32px;\n    font-weight: 700;\n    color: #101828;\n    margin-bottom: 28px;\n    font-family: Georgia, serif;\n  }\n\n  .fasilitator-wrapper .fasilitator-filters {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    flex-wrap: wrap;\n    gap: 12px;\n    margin-bottom: 36px;\n  }\n\n  .fasilitator-wrapper .filter-btn {\n    background: #ffffff;\n    border: 1px solid #d0d5dd;\n    border-radius: 20px;\n    padding: 8px 22px;\n    font-size: 14px;\n    font-weight: 500;\n    color: #344054;\n    cursor: pointer;\n    transition: all 0.2s ease;\n  }\n\n  .fasilitator-wrapper .filter-btn:hover {\n    border-color: #344054;\n    background: #f9fafb;\n  }\n\n  .fasilitator-wrapper .filter-btn.active {\n    border: 1.5px solid #101828;\n    background: #ffffff;\n    color: #101828;\n    font-weight: 600;\n  }\n\n  .fasilitator-wrapper .fasilitator-grid {\n    display: grid;\n    grid-template-columns: repeat(4, 1fr);\n    gap: 20px;\n    margin-bottom: 40px;\n  }\n\n  @media (max-width: 1024px) {\n    .fasilitator-wrapper .fasilitator-grid {\n      grid-template-columns: repeat(3, 1fr);\n    }\n  }\n\n  @media (max-width: 768px) {\n    .fasilitator-wrapper .fasilitator-grid {\n      grid-template-columns: repeat(2, 1fr);\n    }\n  }\n\n  @media (max-width: 480px) {\n    .fasilitator-wrapper .fasilitator-grid {\n      grid-template-columns: 1fr;\n    }\n  }\n\n  .fasilitator-wrapper .fasilitator-card {\n    background: #ffffff;\n    border: 1px solid #eaecf0;\n    border-radius: 12px;\n    padding: 24px 20px;\n    text-align: center;\n    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);\n    transition: transform 0.2s ease, box-shadow 0.2s ease;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n  }\n\n  .fasilitator-wrapper .fasilitator-card:hover {\n    transform: translateY(-3px);\n    box-shadow: 0 8px 16px -4px rgba(16, 24, 40, 0.08);\n    border-color: #b2ddff;\n  }\n\n  .fasilitator-wrapper .fasilitator-name {\n    margin: 0 0 6px 0;\n    font-size: 16px;\n    font-weight: 600;\n    color: #101828;\n  }\n\n  .fasilitator-wrapper .fasilitator-city {\n    margin: 0;\n    font-size: 13px;\n    color: #667085;\n    font-weight: 500;\n  }\n\n  .fasilitator-wrapper .fasilitator-more {\n    text-align: center;\n  }\n\n  .fasilitator-wrapper .btn-load-more {\n    background: #eff4ff;\n    border: 1px solid #b2ddff;\n    border-radius: 10px;\n    padding: 10px 24px;\n    font-size: 14px;\n    font-weight: 600;\n    color: #175cd3;\n    cursor: pointer;\n    transition: all 0.2s ease;\n  }\n\n  .fasilitator-wrapper .btn-load-more:hover {\n    background: #d1e9ff;\n    color: #1570ef;\n  }\n<\/style>\n\n<!-- 2. STRUKTUR ELEMEN HTML -->\n<div class=\"fasilitator-wrapper\">\n  <h2 class=\"fasilitator-main-title\">Fasilitator Kami<\/h2>\n\n  <div class=\"fasilitator-filters\" id=\"filterContainer\">\n    <button class=\"filter-btn active\" onclick=\"filterData('Semua', this)\">Semua<\/button>\n    <button class=\"filter-btn\" onclick=\"filterData('Medan', this)\">Medan<\/button>\n    <button class=\"filter-btn\" onclick=\"filterData('Cilegon', this)\">Cilegon<\/button>\n    <button class=\"filter-btn\" onclick=\"filterData('Tangerang', this)\">Tangerang<\/button>\n    <button class=\"filter-btn\" onclick=\"filterData('Depok', this)\">Depok<\/button>\n    <button class=\"filter-btn\" onclick=\"filterData('Yogyakarta', this)\">Yogyakarta<\/button>\n    <button class=\"filter-btn\" onclick=\"filterData('Surabaya', this)\">Surabaya<\/button>\n    <button class=\"filter-btn\" onclick=\"filterData('Bali', this)\">Bali<\/button>\n  <\/div>\n\n  <div class=\"fasilitator-grid\" id=\"fasilitatorContainer\">\n    <p style=\"grid-column: 1\/-1; text-align: center; color: #666;\">Memuat data fasilitator&#8230;<\/p>\n  <\/div>\n\n  <div class=\"fasilitator-more\">\n    <button class=\"btn-load-more\" id=\"btnLoadMore\">Lihat lainnya<\/button>\n  <\/div>\n<\/div>\n\n<!-- 3. JAVASCRIPT FETCH & FILTER -->\n<script>\n  let allData = [];\n\n  window.addEventListener(\"load\", async function() {\n    const API_URL = 'https:\/\/ympai.org\/wp-json\/fclc\/v1\/fasilitator';\n    const container = document.getElementById('fasilitatorContainer');\n\n    try {\n      const response = await fetch(API_URL);\n      if (!response.ok) throw new Error('Gagal mengambil data');\n\n      allData = await response.json();\n      renderCards(allData);\n\n    } catch (error) {\n      console.error('Error:', error);\n      container.innerHTML = '<p style=\"grid-column: 1\/-1; text-align: center; color: red;\">Gagal memuat data fasilitator.<\/p>';\n    }\n  });\n\n  function renderCards(data) {\n    const container = document.getElementById('fasilitatorContainer');\n    container.innerHTML = '';\n\n    if (!data || data.length === 0) {\n      container.innerHTML = '<p style=\"grid-column: 1\/-1; text-align: center; color: #666;\">Tidak ada data fasilitator untuk wilayah ini.<\/p>';\n      return;\n    }\n\n    data.forEach(item => {\n      const card = document.createElement('div');\n      card.className = 'fasilitator-card';\n\n      const nama = item.nama || item.nama_fasilitator || 'Tanpa Nama';\n      const wilayah = item.kelurahan || item.wilayah || 'Depok';\n\n      card.innerHTML = `\n        <h4 class=\"fasilitator-name\">${nama}<\/h4>\n        <p class=\"fasilitator-city\">${wilayah}<\/p>\n      `;\n\n      container.appendChild(card);\n    });\n  }\n\n  function filterData(city, btnElement) {\n    document.querySelectorAll('.fasilitator-wrapper .filter-btn').forEach(btn => btn.classList.remove('active'));\n    btnElement.classList.add('active');\n\n    if (city === 'Semua') {\n      renderCards(allData);\n    } else {\n      const filtered = allData.filter(item => {\n        const wil = (item.kelurahan || item.wilayah || '').toLowerCase();\n        return wil.includes(city.toLowerCase());\n      });\n      renderCards(filtered);\n    }\n  }\n<\/script>\n\n\n\n<!-- STYLING CSS KELURAHAN & PETA -->\n<link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\" \/>\n<style>\n  .kelurahan-map-wrapper {\n    width: 100%;\n    max-width: 1200px;\n    margin: 40px auto;\n    padding: 0 20px;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n    box-sizing: border-box;\n  }\n\n  .kelurahan-map-wrapper .section-title {\n    text-align: center;\n    font-size: 32px;\n    font-weight: 700;\n    color: #101828;\n    margin-bottom: 28px;\n    font-family: Georgia, serif;\n  }\n\n  .kelurahan-map-grid {\n    display: grid;\n    grid-template-columns: 1fr 1.3fr; \/* Kiri: Kelurahan, Kanan: Map *\/\n    gap: 24px;\n    align-items: start;\n  }\n\n  @media (max-width: 868px) {\n    .kelurahan-map-grid { grid-template-columns: 1fr; }\n  }\n\n  .kelurahan-box {\n    background: #ffffff;\n    border: 1px solid #eaecf0;\n    border-radius: 16px;\n    padding: 24px;\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n  }\n\n  .kelurahan-box h3 {\n    margin: 0 0 16px 0;\n    font-size: 20px;\n    color: #101828;\n  }\n\n  .kelurahan-list {\n    max-height: 420px;\n    overflow-y: auto;\n    display: flex;\n    flex-direction: column;\n    gap: 12px;\n    padding-right: 6px;\n  }\n\n  .kelurahan-item {\n    padding: 14px 16px;\n    border: 1px solid #f2f4f7;\n    border-radius: 10px;\n    background: #f9fafb;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    transition: background 0.2s ease;\n  }\n\n  .kelurahan-item:hover {\n    background: #eff4ff;\n    border-color: #b2ddff;\n  }\n\n  .kelurahan-item-title {\n    font-weight: 600;\n    color: #101828;\n    font-size: 15px;\n  }\n\n  .kelurahan-item-sub {\n    font-size: 13px;\n    color: #667085;\n  }\n\n  .map-container-box {\n    background: #ffffff;\n    border: 1px solid #eaecf0;\n    border-radius: 16px;\n    padding: 12px;\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);\n  }\n\n  #fclcMap {\n    width: 100%;\n    height: 460px;\n    border-radius: 12px;\n    z-index: 1;\n  }\n<\/style>\n\n<!-- ELEMEN HTML KELURAHAN & PETA -->\n<div class=\"kelurahan-map-wrapper\">\n  <h2 class=\"section-title\">Peta Sebaran Wilayah<\/h2>\n  \n  <div class=\"kelurahan-map-grid\">\n    <div class=\"kelurahan-box\">\n      <h3>Daftar Kelurahan<\/h3>\n      <div class=\"kelurahan-list\" id=\"kelurahanListContainer\">\n        <p style=\"text-align: center; color: #666;\">Memuat data kelurahan&#8230;<\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"map-container-box\">\n      <div id=\"fclcMap\"><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- JAVASCRIPT LEAFLET & KELURAHAN -->\n<script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n<script>\n  let map;\n\n  window.addEventListener(\"load\", function() {\n    initMap();\n    fetchKelurahan();\n  });\n\n  function initMap() {\n    map = L.map('fclcMap').setView([-6.4025, 106.7942], 11);\n    L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n      attribution: '&copy; OpenStreetMap contributors'\n    }).addTo(map);\n  }\n\n  async function fetchKelurahan() {\n    const API_KELURAHAN = 'https:\/\/ympai.org\/wp-json\/fclc\/v1\/kelurahan';\n    const listContainer = document.getElementById('kelurahanListContainer');\n\n    try {\n      const response = await fetch(API_KELURAHAN);\n      if (!response.ok) throw new Error('Gagal mengambil data kelurahan');\n\n      const data = await response.json();\n      listContainer.innerHTML = '';\n\n      if (!data || data.length === 0) {\n        listContainer.innerHTML = '<p style=\"text-align: center; color: #666;\">Belum ada data kelurahan.<\/p>';\n        return;\n      }\n\n      data.forEach(item => {\n        const namaKel = item.nama_kelurahan || item.kelurahan || item.nama || 'Kelurahan';\n        const kec = item.kecamatan || item.kota || 'Depok';\n        const lat = parseFloat(item.latitude || item.lat);\n        const lng = parseFloat(item.longitude || item.lng || item.long);\n\n        const el = document.createElement('div');\n        el.className = 'kelurahan-item';\n        el.innerHTML = `\n          <div>\n            <div class=\"kelurahan-item-title\">${namaKel}<\/div>\n            <div class=\"kelurahan-item-sub\">${kec}<\/div>\n          <\/div>\n        `;\n\n        if (!isNaN(lat) && !isNaN(lng)) {\n          el.style.cursor = 'pointer';\n          el.onclick = () => {\n            map.flyTo([lat, lng], 14, { duration: 1.5 });\n          };\n\n          L.marker([lat, lng])\n            .addTo(map)\n            .bindPopup(`<b>${namaKel}<\/b><br>${kec}`);\n        }\n\n        listContainer.appendChild(el);\n      });\n\n    } catch (error) {\n      console.error('Error Kelurahan:', error);\n      listContainer.innerHTML = '<p style=\"text-align: center; color: red;\">Gagal memuat daftar kelurahan.<\/p>';\n    }\n  }\n<\/script>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Family &amp; Community Learning Center Family &amp; Community Learning Center menjadi wadah untuk mengumpulkan data sekaligus menyediakan materi edukasi keluarga yang lengkap, mulai dari tahap dasar sampai lanjut. Kami berupaya membangun lingkungan belajar yang inklusif demi mendukung kesehatan mental generasi mendatang. Dengan basis data lapangan yang akurat, program ini dirancang untuk mencetak praktisi yang teredukasi [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"class_list":["post-120","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/ympai.org\/en\/wp-json\/wp\/v2\/pages\/120","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ympai.org\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ympai.org\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ympai.org\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ympai.org\/en\/wp-json\/wp\/v2\/comments?post=120"}],"version-history":[{"count":113,"href":"https:\/\/ympai.org\/en\/wp-json\/wp\/v2\/pages\/120\/revisions"}],"predecessor-version":[{"id":493,"href":"https:\/\/ympai.org\/en\/wp-json\/wp\/v2\/pages\/120\/revisions\/493"}],"wp:attachment":[{"href":"https:\/\/ympai.org\/en\/wp-json\/wp\/v2\/media?parent=120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}