{"id":169,"date":"2026-10-15T21:23:38","date_gmt":"2026-10-15T21:23:38","guid":{"rendered":"https:\/\/vpmc.co.ke\/staging\/?page_id=169"},"modified":"2026-10-15T21:47:17","modified_gmt":"2026-10-15T21:47:17","slug":"latest","status":"publish","type":"page","link":"https:\/\/vpmc.co.ke\/staging\/latest\/","title":{"rendered":"Latest"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"169\" class=\"elementor elementor-169\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-62e648d e-con e-atomic-element e-flexbox-base e-default-div e-ac74832 \" data-id=\"62e648d\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"62e648d\" data-e-type=\"e-flexbox\" data-id=\"62e648d\">\n    \t\t<div class=\"elementor-element elementor-element-0ad409b elementor-widget elementor-widget-html\" data-id=\"0ad409b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\n<section id=\"vpmc-latest\">\n  <div class=\"vpmc-blog-hero\">\n    <div class=\"vpmc-blog-hero-inner\">\n      <span class=\"vpmc-blog-eyebrow\">VPMC INSIGHTS & UPDATES<\/span>\n      <h1>Latest News & Insights<\/h1>\n      <p>Explore our latest articles, professional insights, organisational updates, and practical ideas for stronger organisations.<\/p>\n      <a class=\"vpmc-blog-hero-btn\" href=\"https:\/\/vpmc.co.ke\/staging\/contact\/\">Talk to Our Team <span>\u2197<\/span><\/a>\n    <\/div>\n  <\/div>\n\n  <div class=\"vpmc-blog-container\">\n    <div class=\"vpmc-blog-intro\">\n      <div>\n        <span class=\"vpmc-blog-kicker\">KNOWLEDGE THAT MOVES YOU FORWARD<\/span>\n        <h2>Explore Our Latest Articles<\/h2>\n        <p>Discover insights and updates published by VPMC.<\/p>\n      <\/div>\n    <\/div>\n\n    <div id=\"vpmc-blog-status\" class=\"vpmc-blog-status\" role=\"status\" aria-live=\"polite\">\n      <span class=\"vpmc-blog-spinner\"><\/span>\n      <span>Loading published articles...<\/span>\n    <\/div>\n\n    <div id=\"vpmc-blog-content\" hidden>\n      <div id=\"vpmc-blog-featured\"><\/div>\n\n      <div class=\"vpmc-blog-list-heading\">\n        <div>\n          <span class=\"vpmc-blog-kicker\">FROM OUR BLOG<\/span>\n          <h2>More Insights<\/h2>\n        <\/div>\n        <span id=\"vpmc-blog-count\" class=\"vpmc-blog-count\"><\/span>\n      <\/div>\n\n      <div id=\"vpmc-blog-filters\" class=\"vpmc-blog-filters\" aria-label=\"Filter articles by category\"><\/div>\n\n      <div id=\"vpmc-blog-grid\" class=\"vpmc-blog-grid\"><\/div>\n\n      <div id=\"vpmc-blog-empty-filter\" class=\"vpmc-blog-empty\" hidden>\n        No articles found in this category.\n      <\/div>\n\n      <div class=\"vpmc-blog-load-wrap\">\n        <button id=\"vpmc-blog-load-more\" type=\"button\">Load More Articles <span>\u2193<\/span><\/button>\n      <\/div>\n    <\/div>\n\n    <div id=\"vpmc-blog-empty\" class=\"vpmc-blog-empty\" hidden>\n      <div class=\"vpmc-blog-empty-icon\">\u2726<\/div>\n      <h3>No published posts yet<\/h3>\n      <p>New articles will appear here once they are published in WordPress.<\/p>\n    <\/div>\n\n    <div id=\"vpmc-blog-error\" class=\"vpmc-blog-empty\" hidden>\n      <h3>Articles could not be loaded<\/h3>\n      <p>Please try again shortly. If the problem continues, check that the WordPress REST API is accessible.<\/p>\n      <button id=\"vpmc-blog-retry\" type=\"button\">Try Again<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"vpmc-blog-bottom\">\n    <div class=\"vpmc-blog-bottom-inner\">\n      <div>\n        <span class=\"vpmc-blog-kicker\">LET'S WORK TOGETHER<\/span>\n        <h2>Looking for practical solutions for your organisation?<\/h2>\n        <p>Connect with VPMC to discuss your consultancy, training, and technical support needs.<\/p>\n      <\/div>\n      <a href=\"https:\/\/vpmc.co.ke\/staging\/contact\/\">Contact VPMC <span>\u2197<\/span><\/a>\n    <\/div>\n  <\/div>\n<\/section>\n\n<style>\n#vpmc-latest {\n  --vbl-blue: #174A86;\n  --vbl-dark: #103761;\n  --vbl-cyan: #08B5E5;\n  --vbl-text: #263238;\n  --vbl-muted: #64748b;\n  --vbl-light: #F4F8FC;\n  --vbl-border: #e1e9f1;\n  color: var(--vbl-text);\n  font-family: inherit;\n  background: #fff;\n  width: 100%;\n  overflow: hidden;\n}\n\n#vpmc-latest *,\n#vpmc-latest *::before,\n#vpmc-latest *::after {\n  box-sizing: border-box;\n}\n\n#vpmc-latest [hidden] {\n  display: none !important;\n}\n\n#vpmc-latest a {\n  text-decoration: none;\n}\n\n#vpmc-latest .vpmc-blog-hero {\n  position: relative;\n  padding: 92px 24px 100px;\n  background:\n    radial-gradient(ellipse at 85% 10%, rgba(8,181,229,.24), transparent 38%),\n    linear-gradient(125deg, #103761 0%, #174A86 58%, #176da4 100%);\n  color: #fff;\n}\n\n#vpmc-latest .vpmc-blog-hero::after {\n  content: \"\";\n  position: absolute;\n  width: 340px;\n  height: 340px;\n  right: -100px;\n  bottom: -200px;\n  border: 1px solid rgba(255,255,255,.17);\n  border-radius: 50%;\n  box-shadow: 0 0 0 38px rgba(255,255,255,.035),\n              0 0 0 76px rgba(255,255,255,.025);\n  pointer-events: none;\n}\n\n#vpmc-latest .vpmc-blog-hero-inner,\n#vpmc-latest .vpmc-blog-container,\n#vpmc-latest .vpmc-blog-bottom-inner {\n  width: 100%;\n  max-width: 1200px;\n  margin: 0 auto;\n  position: relative;\n}\n\n#vpmc-latest .vpmc-blog-eyebrow,\n#vpmc-latest .vpmc-blog-kicker {\n  display: inline-block;\n  font-size: 11px;\n  line-height: 1.5;\n  font-weight: 800;\n  letter-spacing: 2px;\n}\n\n#vpmc-latest .vpmc-blog-eyebrow {\n  color: #9beaff;\n  margin-bottom: 18px;\n}\n\n#vpmc-latest .vpmc-blog-hero h1 {\n  color: #fff;\n  max-width: 800px;\n  font-size: clamp(38px, 5.3vw, 64px);\n  line-height: 1.08;\n  font-weight: 800;\n  letter-spacing: -1.8px;\n  margin: 0 0 20px;\n}\n\n#vpmc-latest .vpmc-blog-hero p {\n  max-width: 690px;\n  color: rgba(255,255,255,.86);\n  font-size: 17px;\n  line-height: 1.85;\n  margin: 0 0 30px;\n}\n\n#vpmc-latest .vpmc-blog-hero-btn {\n  display: inline-flex;\n  align-items: center;\n  gap: 22px;\n  padding: 14px 20px;\n  color: #103761;\n  background: #fff;\n  border-radius: 5px;\n  font-size: 13px;\n  font-weight: 800;\n  transition: .2s ease;\n}\n\n#vpmc-latest .vpmc-blog-hero-btn:hover {\n  background: #9beaff;\n  transform: translateY(-2px);\n}\n\n#vpmc-latest .vpmc-blog-container {\n  padding: 74px 24px 85px;\n}\n\n#vpmc-latest .vpmc-blog-intro {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: 24px;\n  margin-bottom: 35px;\n}\n\n#vpmc-latest .vpmc-blog-kicker {\n  color: var(--vbl-blue);\n  margin-bottom: 10px;\n}\n\n#vpmc-latest .vpmc-blog-intro h2,\n#vpmc-latest .vpmc-blog-list-heading h2 {\n  color: var(--vbl-dark);\n  font-size: clamp(26px, 3vw, 36px);\n  line-height: 1.2;\n  font-weight: 800;\n  letter-spacing: -.6px;\n  margin: 0 0 10px;\n}\n\n#vpmc-latest .vpmc-blog-intro p {\n  color: var(--vbl-muted);\n  margin: 0;\n  line-height: 1.7;\n  font-size: 15px;\n}\n\n#vpmc-latest .vpmc-blog-status {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 12px;\n  padding: 65px 20px;\n  color: var(--vbl-muted);\n  font-size: 14px;\n}\n\n#vpmc-latest .vpmc-blog-spinner {\n  width: 20px;\n  height: 20px;\n  border: 2px solid #d8e6f1;\n  border-top-color: var(--vbl-cyan);\n  border-radius: 50%;\n  animation: vpmcBlogSpin .8s linear infinite;\n  flex-shrink: 0;\n}\n\n@keyframes vpmcBlogSpin {\n  to { transform: rotate(360deg); }\n}\n\n#vpmc-latest .vpmc-blog-featured {\n  display: grid;\n  grid-template-columns: minmax(0, 1.08fr) minmax(0, .92fr);\n  min-height: 350px;\n  background: var(--vbl-light);\n  border: 1px solid var(--vbl-border);\n  border-radius: 10px;\n  overflow: hidden;\n  margin-bottom: 72px;\n}\n\n#vpmc-latest .vpmc-blog-featured-image {\n  display: block;\n  min-height: 350px;\n  background: #e8f0f7;\n  overflow: hidden;\n}\n\n#vpmc-latest .vpmc-blog-featured-image img {\n  width: 100%;\n  height: 100%;\n  min-height: 350px;\n  display: block;\n  object-fit: cover;\n  transition: transform .5s ease;\n}\n\n#vpmc-latest .vpmc-blog-featured-image:hover img {\n  transform: scale(1.035);\n}\n\n#vpmc-latest .vpmc-blog-featured-no-image {\n  min-height: 350px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background: linear-gradient(135deg, #103761, #176da4);\n  color: #fff;\n  font-size: 54px;\n}\n\n#vpmc-latest .vpmc-blog-featured-copy {\n  padding: 38px;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n}\n\n#vpmc-latest .vpmc-blog-featured-label {\n  color: var(--vbl-blue);\n  font-size: 10px;\n  font-weight: 800;\n  letter-spacing: 1.7px;\n  margin-bottom: 18px;\n}\n\n#vpmc-latest .vpmc-blog-meta {\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 9px;\n  color: var(--vbl-muted);\n  font-size: 12px;\n  line-height: 1.6;\n}\n\n#vpmc-latest .vpmc-blog-meta-dot {\n  color: var(--vbl-cyan);\n}\n\n#vpmc-latest .vpmc-blog-featured h2 {\n  color: var(--vbl-dark);\n  font-size: clamp(23px, 2.6vw, 32px);\n  line-height: 1.3;\n  font-weight: 800;\n  letter-spacing: -.5px;\n  margin: 15px 0;\n}\n\n#vpmc-latest .vpmc-blog-featured h2 a,\n#vpmc-latest .vpmc-blog-card h3 a {\n  color: inherit;\n}\n\n#vpmc-latest .vpmc-blog-featured h2 a:hover,\n#vpmc-latest .vpmc-blog-card h3 a:hover {\n  color: var(--vbl-blue);\n}\n\n#vpmc-latest .vpmc-blog-featured-excerpt {\n  color: var(--vbl-muted);\n  font-size: 14px;\n  line-height: 1.8;\n  margin: 0 0 23px;\n}\n\n#vpmc-latest .vpmc-blog-read-link {\n  display: inline-flex;\n  align-items: center;\n  gap: 10px;\n  color: var(--vbl-blue);\n  font-size: 13px;\n  font-weight: 800;\n  margin-top: auto;\n}\n\n#vpmc-latest .vpmc-blog-read-link span {\n  transition: transform .2s ease;\n}\n\n#vpmc-latest .vpmc-blog-read-link:hover span {\n  transform: translateX(4px);\n}\n\n#vpmc-latest .vpmc-blog-list-heading {\n  display: flex;\n  align-items: flex-end;\n  justify-content: space-between;\n  gap: 20px;\n  margin-bottom: 25px;\n}\n\n#vpmc-latest .vpmc-blog-count {\n  color: var(--vbl-muted);\n  font-size: 12px;\n  padding-bottom: 12px;\n}\n\n#vpmc-latest .vpmc-blog-filters {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 9px;\n  margin-bottom: 30px;\n}\n\n#vpmc-latest .vpmc-blog-filter {\n  border: 1px solid var(--vbl-border);\n  background: #fff;\n  color: #4b6074;\n  border-radius: 4px;\n  padding: 10px 15px;\n  font: inherit;\n  font-size: 12px;\n  font-weight: 700;\n  cursor: pointer;\n  transition: .2s ease;\n}\n\n#vpmc-latest .vpmc-blog-filter:hover,\n#vpmc-latest .vpmc-blog-filter.is-active {\n  color: #fff;\n  border-color: var(--vbl-blue);\n  background: var(--vbl-blue);\n}\n\n#vpmc-latest .vpmc-blog-grid {\n  display: grid;\n  grid-template-columns: repeat(3, minmax(0, 1fr));\n  gap: 25px;\n}\n\n#vpmc-latest .vpmc-blog-card {\n  min-width: 0;\n  display: flex;\n  flex-direction: column;\n  background: #fff;\n  border: 1px solid var(--vbl-border);\n  border-radius: 8px;\n  overflow: hidden;\n  transition: transform .25s ease, box-shadow .25s ease;\n}\n\n#vpmc-latest .vpmc-blog-card:hover {\n  transform: translateY(-5px);\n  box-shadow: 0 14px 35px rgba(16,55,97,.09);\n}\n\n#vpmc-latest .vpmc-blog-card-image {\n  display: block;\n  width: 100%;\n  aspect-ratio: 16 \/ 10;\n  overflow: hidden;\n  background: #e8f0f7;\n}\n\n#vpmc-latest .vpmc-blog-card-image img {\n  width: 100%;\n  height: 100%;\n  display: block;\n  object-fit: cover;\n  transition: transform .45s ease;\n}\n\n#vpmc-latest .vpmc-blog-card:hover .vpmc-blog-card-image img {\n  transform: scale(1.04);\n}\n\n#vpmc-latest .vpmc-blog-card-no-image {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  aspect-ratio: 16 \/ 10;\n  background: linear-gradient(135deg, #103761, #176da4);\n  color: #fff;\n  font-size: 36px;\n}\n\n#vpmc-latest .vpmc-blog-card-body {\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  align-items: flex-start;\n  padding: 22px;\n}\n\n#vpmc-latest .vpmc-blog-category {\n  display: inline-block;\n  color: var(--vbl-blue);\n  background: #edf6fc;\n  border-radius: 3px;\n  padding: 5px 8px;\n  margin-bottom: 13px;\n  font-size: 10px;\n  font-weight: 800;\n  letter-spacing: .5px;\n}\n\n#vpmc-latest .vpmc-blog-card h3 {\n  font-size: 19px;\n  line-height: 1.45;\n  font-weight: 800;\n  color: var(--vbl-dark);\n  margin: 13px 0 11px;\n  overflow-wrap: anywhere;\n}\n\n#vpmc-latest .vpmc-blog-card-excerpt {\n  color: var(--vbl-muted);\n  font-size: 13px;\n  line-height: 1.8;\n  margin: 0 0 20px;\n}\n\n#vpmc-latest .vpmc-blog-card .vpmc-blog-read-link {\n  padding-top: 4px;\n}\n\n#vpmc-latest .vpmc-blog-card .vpmc-blog-meta {\n  margin-bottom: 2px;\n}\n\n#vpmc-latest .vpmc-blog-load-wrap {\n  display: flex;\n  justify-content: center;\n  padding-top: 42px;\n}\n\n#vpmc-latest #vpmc-blog-load-more,\n#vpmc-latest #vpmc-blog-retry {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  gap: 15px;\n  min-height: 48px;\n  padding: 13px 22px;\n  border: 1px solid var(--vbl-blue);\n  border-radius: 4px;\n  background: var(--vbl-blue);\n  color: #fff;\n  font: inherit;\n  font-size: 13px;\n  font-weight: 800;\n  cursor: pointer;\n  transition: .2s ease;\n}\n\n#vpmc-latest #vpmc-blog-load-more:hover,\n#vpmc-latest #vpmc-blog-retry:hover {\n  background: var(--vbl-dark);\n}\n\n#vpmc-latest #vpmc-blog-load-more:disabled {\n  opacity: .65;\n  cursor: wait;\n}\n\n#vpmc-latest .vpmc-blog-empty {\n  text-align: center;\n  padding: 65px 20px;\n  border: 1px solid var(--vbl-border);\n  border-radius: 8px;\n  background: var(--vbl-light);\n}\n\n#vpmc-latest .vpmc-blog-empty-icon {\n  font-size: 32px;\n  color: var(--vbl-cyan);\n  margin-bottom: 12px;\n}\n\n#vpmc-latest .vpmc-blog-empty h3 {\n  color: var(--vbl-dark);\n  font-size: 23px;\n  margin: 0 0 10px;\n}\n\n#vpmc-latest .vpmc-blog-empty p {\n  color: var(--vbl-muted);\n  font-size: 14px;\n  line-height: 1.8;\n  margin: 0 auto 20px;\n  max-width: 560px;\n}\n\n#vpmc-latest .vpmc-blog-bottom {\n  background: var(--vbl-light);\n  border-top: 1px solid var(--vbl-border);\n  padding: 55px 24px;\n}\n\n#vpmc-latest .vpmc-blog-bottom-inner {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 35px;\n}\n\n#vpmc-latest .vpmc-blog-bottom h2 {\n  color: var(--vbl-dark);\n  font-size: clamp(23px, 3vw, 32px);\n  line-height: 1.3;\n  font-weight: 800;\n  max-width: 690px;\n  margin: 0 0 12px;\n}\n\n#vpmc-latest .vpmc-blog-bottom p {\n  color: var(--vbl-muted);\n  font-size: 14px;\n  line-height: 1.8;\n  margin: 0;\n  max-width: 680px;\n}\n\n#vpmc-latest .vpmc-blog-bottom-inner > a {\n  display: inline-flex;\n  flex-shrink: 0;\n  align-items: center;\n  justify-content: center;\n  gap: 15px;\n  padding: 15px 21px;\n  color: #fff;\n  background: var(--vbl-blue);\n  border-radius: 4px;\n  font-size: 13px;\n  font-weight: 800;\n  transition: .2s ease;\n}\n\n#vpmc-latest .vpmc-blog-bottom-inner > a:hover {\n  background: var(--vbl-dark);\n}\n\n@media (max-width: 900px) {\n  #vpmc-latest .vpmc-blog-featured {\n    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n  }\n\n  #vpmc-latest .vpmc-blog-featured-copy {\n    padding: 26px;\n  }\n\n  #vpmc-latest .vpmc-blog-grid {\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n  }\n}\n\n@media (max-width: 600px) {\n  #vpmc-latest .vpmc-blog-hero {\n    padding: 65px 20px 72px;\n  }\n\n  #vpmc-latest .vpmc-blog-hero h1 {\n    font-size: 38px;\n    letter-spacing: -1px;\n  }\n\n  #vpmc-latest .vpmc-blog-hero p {\n    font-size: 15px;\n  }\n\n  #vpmc-latest .vpmc-blog-container {\n    padding: 48px 18px 55px;\n  }\n\n  #vpmc-latest .vpmc-blog-intro {\n    margin-bottom: 25px;\n  }\n\n  #vpmc-latest .vpmc-blog-featured {\n    grid-template-columns: 1fr;\n    margin-bottom: 50px;\n  }\n\n  #vpmc-latest .vpmc-blog-featured-image,\n  #vpmc-latest .vpmc-blog-featured-image img,\n  #vpmc-latest .vpmc-blog-featured-no-image {\n    min-height: 0;\n    height: auto;\n    aspect-ratio: 16 \/ 10;\n  }\n\n  #vpmc-latest .vpmc-blog-featured-copy {\n    padding: 24px;\n  }\n\n  #vpmc-latest .vpmc-blog-grid {\n    grid-template-columns: 1fr;\n    gap: 20px;\n  }\n\n  #vpmc-latest .vpmc-blog-card-body {\n    padding: 20px;\n  }\n\n  #vpmc-latest .vpmc-blog-list-heading {\n    align-items: flex-start;\n  }\n\n  #vpmc-latest .vpmc-blog-count {\n    padding-top: 8px;\n    text-align: right;\n  }\n\n  #vpmc-latest .vpmc-blog-bottom {\n    padding: 42px 20px;\n  }\n\n  #vpmc-latest .vpmc-blog-bottom-inner {\n    align-items: flex-start;\n    flex-direction: column;\n    gap: 25px;\n  }\n}\n\n@media (prefers-reduced-motion: reduce) {\n  #vpmc-latest *,\n  #vpmc-latest *::before,\n  #vpmc-latest *::after {\n    animation-duration: .01ms !important;\n    transition-duration: .01ms !important;\n    scroll-behavior: auto !important;\n  }\n}\n<\/style>\n\n<script>\n(function () {\n  \"use strict\";\n\n  const root = document.getElementById(\"vpmc-latest\");\n  if (!root || root.dataset.blogInitialized === \"true\") return;\n  root.dataset.blogInitialized = \"true\";\n\n  const API = \"https:\/\/vpmc.co.ke\/staging\/wp-json\/wp\/v2\/\";\n\n  const statusEl = root.querySelector(\"#vpmc-blog-status\");\n  const contentEl = root.querySelector(\"#vpmc-blog-content\");\n  const featuredEl = root.querySelector(\"#vpmc-blog-featured\");\n  const filtersEl = root.querySelector(\"#vpmc-blog-filters\");\n  const gridEl = root.querySelector(\"#vpmc-blog-grid\");\n  const countEl = root.querySelector(\"#vpmc-blog-count\");\n  const loadMoreBtn = root.querySelector(\"#vpmc-blog-load-more\");\n  const emptyEl = root.querySelector(\"#vpmc-blog-empty\");\n  const filterEmptyEl = root.querySelector(\"#vpmc-blog-empty-filter\");\n  const errorEl = root.querySelector(\"#vpmc-blog-error\");\n  const retryBtn = root.querySelector(\"#vpmc-blog-retry\");\n\n  const PAGE_SIZE = 9;\n\n  let posts = [];\n  let categories = [];\n  let currentCategory = 0;\n  let currentPage = 1;\n  let totalPages = 1;\n  let visibleCount = PAGE_SIZE;\n  let loading = false;\n  let requestNumber = 0;\n\n  function escapeHTML(value) {\n    return String(value == null ? \"\" : value).replace(\/[&<>\"']\/g, function (ch) {\n      return {\n        \"&\": \"&amp;\",\n        \"<\": \"&lt;\",\n        \">\": \"&gt;\",\n        '\"': \"&quot;\",\n        \"'\": \"&#039;\"\n      }[ch];\n    });\n  }\n\n  function cleanText(html) {\n    const doc = new DOMParser().parseFromString(html || \"\", \"text\/html\");\n    doc.querySelectorAll(\"script, style, noscript\").forEach(el => el.remove());\n    return (doc.body.textContent || \"\").replace(\/\\s+\/g, \" \").trim();\n  }\n\n  function getTitle(post) {\n    return cleanText(post.title && post.title.rendered);\n  }\n\n  function getExcerpt(post, maxLength) {\n    let text = cleanText(post.excerpt && post.excerpt.rendered);\n\n    if (!text) {\n      text = cleanText(post.content && post.content.rendered);\n    }\n\n    if (text.length > maxLength) {\n      text = text.slice(0, maxLength).replace(\/\\s+\\S*$\/, \"\") + \"\u2026\";\n    }\n\n    return text;\n  }\n\n  function getDate(post) {\n    if (!post.date) return \"\";\n\n    const date = new Date(post.date);\n    if (Number.isNaN(date.getTime())) return \"\";\n\n    return new Intl.DateTimeFormat(undefined, {\n      year: \"numeric\",\n      month: \"short\",\n      day: \"numeric\"\n    }).format(date);\n  }\n\n  function getImage(post) {\n    const media = post._embedded &&\n      post._embedded[\"wp:featuredmedia\"] &&\n      post._embedded[\"wp:featuredmedia\"][0];\n\n    if (!media) return \"\";\n\n    const sizes = media.media_details && media.media_details.sizes;\n\n    return (\n      (sizes && sizes.medium_large && sizes.medium_large.source_url) ||\n      (sizes && sizes.large && sizes.large.source_url) ||\n      media.source_url ||\n      \"\"\n    );\n  }\n\n  function getCategoryNames(post) {\n    const ids = Array.isArray(post.categories) ? post.categories : [];\n\n    return ids\n      .map(id => categories.find(category => category.id === id))\n      .filter(Boolean)\n      .map(category => category.name);\n  }\n\n  function getCategoryLabel(post) {\n    return getCategoryNames(post)[0] || \"Article\";\n  }\n\n  function postURL(post) {\n    return post.link || \"#\";\n  }\n\n  function imageMarkup(post, featured) {\n    const image = getImage(post);\n    const title = escapeHTML(getTitle(post));\n\n    if (!image) {\n      return featured\n        ? '<div class=\"vpmc-blog-featured-no-image\" aria-hidden=\"true\">VPMC<\/div>'\n        : '<div class=\"vpmc-blog-card-no-image\" aria-hidden=\"true\">VPMC<\/div>';\n    }\n\n    if (featured) {\n      return '<a class=\"vpmc-blog-featured-image\" href=\"' +\n        escapeHTML(postURL(post)) + '\" aria-label=\"Read ' + title + '\">' +\n        '<img decoding=\"async\" src=\"' + escapeHTML(image) + '\" alt=\"' + title +\n        '\" loading=\"eager\"><\/a>';\n    }\n\n    return '<a class=\"vpmc-blog-card-image\" href=\"' +\n      escapeHTML(postURL(post)) + '\" aria-label=\"Read ' + title + '\">' +\n      '<img decoding=\"async\" src=\"' + escapeHTML(image) + '\" alt=\"' + title +\n      '\" loading=\"lazy\"><\/a>';\n  }\n\n  function metaMarkup(post) {\n    const date = getDate(post);\n    const category = getCategoryLabel(post);\n\n    return '<div class=\"vpmc-blog-meta\">' +\n      (date ? '<span>' + escapeHTML(date) + '<\/span>' : '') +\n      (date && category ? '<span class=\"vpmc-blog-meta-dot\">\u2022<\/span>' : '') +\n      (category ? '<span>' + escapeHTML(category) + '<\/span>' : '') +\n      '<\/div>';\n  }\n\n  function renderFeatured() {\n    featuredEl.innerHTML = \"\";\n    if (!posts.length) return;\n\n    const post = posts[0];\n    const excerpt = getExcerpt(post, 300);\n\n    featuredEl.innerHTML =\n      '<article class=\"vpmc-blog-featured\">' +\n        imageMarkup(post, true) +\n        '<div class=\"vpmc-blog-featured-copy\">' +\n          '<span class=\"vpmc-blog-featured-label\">LATEST PUBLISHED ARTICLE<\/span>' +\n          metaMarkup(post) +\n          '<h2><a href=\"' + escapeHTML(postURL(post)) + '\">' +\n            escapeHTML(getTitle(post)) + '<\/a><\/h2>' +\n          (excerpt ? '<p class=\"vpmc-blog-featured-excerpt\">' +\n            escapeHTML(excerpt) + '<\/p>' : '') +\n          '<a class=\"vpmc-blog-read-link\" href=\"' +\n            escapeHTML(postURL(post)) +\n            '\">Read Full Article <span>\u2192<\/span><\/a>' +\n        '<\/div>' +\n      '<\/article>';\n  }\n\n  function renderFilters() {\n    const usedIds = new Set();\n\n    posts.forEach(post => {\n      (post.categories || []).forEach(id => usedIds.add(id));\n    });\n\n    const usedCategories = categories.filter(category => usedIds.has(category.id));\n\n    let html =\n      '<button type=\"button\" class=\"vpmc-blog-filter ' +\n      (currentCategory === 0 ? \"is-active\" : \"\") +\n      '\" data-category=\"0\" aria-pressed=\"' +\n      (currentCategory === 0) + '\">All Articles<\/button>';\n\n    usedCategories.forEach(category => {\n      const active = currentCategory === category.id;\n\n      html += '<button type=\"button\" class=\"vpmc-blog-filter ' +\n        (active ? \"is-active\" : \"\") +\n        '\" data-category=\"' + category.id +\n        '\" aria-pressed=\"' + active + '\">' +\n        escapeHTML(category.name) + '<\/button>';\n    });\n\n    filtersEl.innerHTML = html;\n  }\n\n  function getFilteredPosts() {\n    return posts.slice(1).filter(post => {\n      return currentCategory === 0 ||\n        (post.categories || []).includes(currentCategory);\n    });\n  }\n\n  function renderGrid() {\n    const filtered = getFilteredPosts();\n    const shown = filtered.slice(0, visibleCount);\n\n    countEl.textContent = filtered.length +\n      (filtered.length === 1 ? \" article\" : \" articles\");\n\n    gridEl.innerHTML = shown.map(post => {\n      const excerpt = getExcerpt(post, 170);\n\n      return '<article class=\"vpmc-blog-card\">' +\n        imageMarkup(post, false) +\n        '<div class=\"vpmc-blog-card-body\">' +\n          '<span class=\"vpmc-blog-category\">' +\n            escapeHTML(getCategoryLabel(post)) +\n          '<\/span>' +\n          metaMarkup(post) +\n          '<h3><a href=\"' + escapeHTML(postURL(post)) + '\">' +\n            escapeHTML(getTitle(post)) + '<\/a><\/h3>' +\n          (excerpt ? '<p class=\"vpmc-blog-card-excerpt\">' +\n            escapeHTML(excerpt) + '<\/p>' : '') +\n          '<a class=\"vpmc-blog-read-link\" href=\"' +\n            escapeHTML(postURL(post)) +\n            '\">Read Article <span>\u2192<\/span><\/a>' +\n        '<\/div>' +\n      '<\/article>';\n    }).join(\"\");\n\n    filterEmptyEl.hidden = filtered.length !== 0;\n    gridEl.hidden = filtered.length === 0;\n\n    const hasMoreLoaded = visibleCount < filtered.length;\n    const hasMorePages = currentPage < totalPages;\n\n    loadMoreBtn.hidden = !(hasMoreLoaded || hasMorePages);\n    loadMoreBtn.disabled = loading;\n    loadMoreBtn.innerHTML = loading\n      ? \"Loading Articles...\"\n      : 'Load More Articles <span>\u2193<\/span>';\n  }\n\n  async function fetchPosts(page) {\n    const url = new URL(\"posts\", API);\n    url.searchParams.set(\"status\", \"publish\");\n    url.searchParams.set(\"per_page\", String(PAGE_SIZE));\n    url.searchParams.set(\"page\", String(page));\n    url.searchParams.set(\"orderby\", \"date\");\n    url.searchParams.set(\"order\", \"desc\");\n    url.searchParams.set(\"_embed\", \"1\");\n\n    const response = await fetch(url.href, {\n      method: \"GET\",\n      credentials: \"same-origin\",\n      headers: { \"Accept\": \"application\/json\" }\n    });\n\n    if (!response.ok) {\n      throw new Error(\"WordPress posts request failed: \" + response.status);\n    }\n\n    const data = await response.json();\n\n    if (!Array.isArray(data)) {\n      throw new Error(\"WordPress returned an unexpected posts response.\");\n    }\n\n    const headerPages = parseInt(\n      response.headers.get(\"X-WP-TotalPages\") || \"1\",\n      10\n    );\n\n    return {\n      posts: data,\n      pages: Number.isFinite(headerPages) && headerPages > 0 ? headerPages : 1\n    };\n  }\n\n  async function fetchCategories() {\n    const url = new URL(\"categories\", API);\n    url.searchParams.set(\"per_page\", \"100\");\n    url.searchParams.set(\"hide_empty\", \"true\");\n    url.searchParams.set(\"orderby\", \"name\");\n    url.searchParams.set(\"order\", \"asc\");\n\n    const response = await fetch(url.href, {\n      credentials: \"same-origin\",\n      headers: { \"Accept\": \"application\/json\" }\n    });\n\n    if (!response.ok) {\n      throw new Error(\"WordPress categories request failed: \" + response.status);\n    }\n\n    const data = await response.json();\n    return Array.isArray(data) ? data : [];\n  }\n\n  async function loadInitial() {\n    const thisRequest = ++requestNumber;\n\n    statusEl.hidden = false;\n    statusEl.innerHTML =\n      '<span class=\"vpmc-blog-spinner\"><\/span><span>Loading published articles...<\/span>';\n\n    contentEl.hidden = true;\n    emptyEl.hidden = true;\n    errorEl.hidden = true;\n    loading = true;\n\n    try {\n      const results = await Promise.all([\n        fetchPosts(1),\n        fetchCategories()\n      ]);\n\n      if (thisRequest !== requestNumber) return;\n\n      posts = results[0].posts;\n      totalPages = results[0].pages;\n      categories = results[1];\n      currentPage = 1;\n      visibleCount = PAGE_SIZE;\n      currentCategory = 0;\n\n      statusEl.hidden = true;\n\n      if (!posts.length) {\n        emptyEl.hidden = false;\n        return;\n      }\n\n      contentEl.hidden = false;\n      renderFeatured();\n      renderFilters();\n      renderGrid();\n    } catch (error) {\n      if (thisRequest !== requestNumber) return;\n\n      console.error(\"[VPMC Latest] Could not load WordPress posts:\", error);\n      statusEl.hidden = true;\n      errorEl.hidden = false;\n    } finally {\n      loading = false;\n      loadMoreBtn.disabled = false;\n    }\n  }\n\n  async function loadMore() {\n    if (loading) return;\n\n    const filtered = getFilteredPosts();\n\n    if (visibleCount < filtered.length) {\n      visibleCount += PAGE_SIZE;\n      renderGrid();\n      return;\n    }\n\n    if (currentPage >= totalPages) {\n      renderGrid();\n      return;\n    }\n\n    loading = true;\n    renderGrid();\n\n    try {\n      const nextPage = currentPage + 1;\n      const result = await fetchPosts(nextPage);\n      const existingIds = new Set(posts.map(post => post.id));\n\n      result.posts.forEach(post => {\n        if (!existingIds.has(post.id)) {\n          posts.push(post);\n          existingIds.add(post.id);\n        }\n      });\n\n      currentPage = nextPage;\n      totalPages = result.pages;\n      visibleCount += PAGE_SIZE;\n\n      renderFilters();\n      renderGrid();\n    } catch (error) {\n      console.error(\"[VPMC Latest] Could not load more posts:\", error);\n      loadMoreBtn.textContent = \"Could Not Load \u2014 Try Again\";\n    } finally {\n      loading = false;\n      loadMoreBtn.disabled = false;\n\n      if (loadMoreBtn.innerHTML === \"Loading Articles...\") {\n        renderGrid();\n      }\n    }\n  }\n\n  filtersEl.addEventListener(\"click\", function (event) {\n    const button = event.target.closest(\"[data-category]\");\n    if (!button) return;\n\n    currentCategory = Number(button.dataset.category) || 0;\n    visibleCount = PAGE_SIZE;\n\n    filtersEl.querySelectorAll(\".vpmc-blog-filter\").forEach(filter => {\n      const active = filter === button;\n      filter.classList.toggle(\"is-active\", active);\n      filter.setAttribute(\"aria-pressed\", String(active));\n    });\n\n    renderGrid();\n  });\n\n  loadMoreBtn.addEventListener(\"click\", loadMore);\n  retryBtn.addEventListener(\"click\", loadInitial);\n\n  loadInitial();\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>VPMC INSIGHTS &#038; UPDATES Latest News &#038; Insights Explore our latest articles, professional insights, organisational updates, and practical ideas for stronger organisations. Talk to Our Team \u2197 KNOWLEDGE THAT MOVES YOU FORWARD Explore Our Latest Articles Discover insights and updates published by VPMC. Loading published articles&#8230; FROM OUR BLOG More Insights No articles found in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-169","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/vpmc.co.ke\/staging\/wp-json\/wp\/v2\/pages\/169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpmc.co.ke\/staging\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/vpmc.co.ke\/staging\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/vpmc.co.ke\/staging\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vpmc.co.ke\/staging\/wp-json\/wp\/v2\/comments?post=169"}],"version-history":[{"count":13,"href":"https:\/\/vpmc.co.ke\/staging\/wp-json\/wp\/v2\/pages\/169\/revisions"}],"predecessor-version":[{"id":191,"href":"https:\/\/vpmc.co.ke\/staging\/wp-json\/wp\/v2\/pages\/169\/revisions\/191"}],"wp:attachment":[{"href":"https:\/\/vpmc.co.ke\/staging\/wp-json\/wp\/v2\/media?parent=169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}