{"id":220546,"date":"2024-09-30T07:32:59","date_gmt":"2024-09-30T07:32:59","guid":{"rendered":"https:\/\/www.henryharvin.com\/blog\/?page_id=220546"},"modified":"2026-07-16T07:47:10","modified_gmt":"2026-07-16T07:47:10","slug":"blog","status":"publish","type":"page","link":"https:\/\/www.henryharvin.com\/blog\/","title":{"rendered":"blog"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"220546\" class=\"elementor elementor-220546\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-bd605d1 elementor-section-boxed elementor-section-height-default elementor-section-height-default wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no\" data-id=\"bd605d1\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t<div class=\"elementor-element elementor-element-88320e4 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"88320e4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dabe202 elementor-widget elementor-widget-html\" data-id=\"dabe202\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n\r\n<div class=\"hb-toolbar\">\r\n  <div class=\"hb-inner\">\r\n\r\n    <!-- ---------- LEFT: Blog search ---------- -->\r\n    <form class=\"hb-search\" action=\"https:\/\/www.henryharvin.com\/blog\/\" method=\"get\" role=\"search\">\r\n      <span class=\"hb-search__icon\" aria-hidden=\"true\">\r\n        <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"none\"\r\n             stroke=\"currentColor\" stroke-width=\"2\"\r\n             stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n          <circle cx=\"11\" cy=\"11\" r=\"7\"><\/circle>\r\n          <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"><\/line>\r\n        <\/svg>\r\n      <\/span>\r\n      <input class=\"hb-search__input\" type=\"search\" name=\"s\"\r\n             placeholder=\"Search blogs...\" aria-label=\"Search blogs\"\r\n             autocomplete=\"off\" required \/>\r\n      <button class=\"hb-search__btn\" type=\"submit\">Search<\/button>\r\n    <\/form>\r\n\r\n    <!-- ---------- RIGHT: Searchable category dropdown ---------- -->\r\n    <div class=\"hb-cat\" id=\"hbCat\">\r\n      <button class=\"hb-cat__toggle\" type=\"button\" id=\"hbCatToggle\"\r\n              aria-haspopup=\"listbox\" aria-expanded=\"false\">\r\n        <span class=\"hb-cat__icon\" aria-hidden=\"true\">\r\n          <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\"\r\n               stroke=\"currentColor\" stroke-width=\"2\"\r\n               stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"><\/line>\r\n            <line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"><\/line>\r\n            <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"><\/line>\r\n            <line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"><\/line>\r\n            <line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"><\/line>\r\n            <line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"><\/line>\r\n          <\/svg>\r\n        <\/span>\r\n        <span class=\"hb-cat__label\" id=\"hbCatLabel\">Search Blog Categories<\/span>\r\n        <span class=\"hb-cat__caret\" aria-hidden=\"true\">\r\n          <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\"\r\n               stroke=\"currentColor\" stroke-width=\"2\"\r\n               stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n            <polyline points=\"6 9 12 15 18 9\"><\/polyline>\r\n          <\/svg>\r\n        <\/span>\r\n      <\/button>\r\n\r\n      <!-- Panel: search field + filtered list -->\r\n      <div class=\"hb-cat__panel\" id=\"hbCatPanel\" role=\"dialog\" aria-label=\"Categories\">\r\n        <div class=\"hb-cat__search\">\r\n          <span class=\"hb-cat__search-icon\" aria-hidden=\"true\">\r\n            <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\"\r\n                 stroke=\"currentColor\" stroke-width=\"2\"\r\n                 stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n              <circle cx=\"11\" cy=\"11\" r=\"7\"><\/circle>\r\n              <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"><\/line>\r\n            <\/svg>\r\n          <\/span>\r\n          <input class=\"hb-cat__search-input\" type=\"text\" id=\"hbCatSearch\"\r\n                 placeholder=\"Type to filter categories...\" autocomplete=\"off\"\r\n                 aria-label=\"Filter categories\" \/>\r\n        <\/div>\r\n\r\n        <ul class=\"hb-cat__list\" id=\"hbCatList\" role=\"listbox\"><\/ul>\r\n\r\n        <!-- The ONLY message: shown when nothing matches (never a loader) -->\r\n        <p class=\"hb-cat__empty\" id=\"hbCatEmpty\" hidden>No categories found<\/p>\r\n      <\/div>\r\n    <\/div>\r\n\r\n  <\/div>\r\n<\/div>\r\n\r\n\r\n<style>\r\n\/* ============================================================\r\n   TOKENS\r\n============================================================ *\/\r\n.hb-toolbar{\r\n  --hb-navy:#0A0A2E;\r\n  --hb-navy-soft:#151544;\r\n  --hb-white:#ffffff;\r\n  --hb-ink:#0A0A2E;\r\n  --hb-muted:#6B7280;\r\n  --hb-line:#E5E7EB;\r\n  --hb-focus:#0A0A2E;          \/* brand navy \u2014 accents\/focus (no blue) *\/\r\n  --hb-hover:#F1F2F7;          \/* neutral list hover wash            *\/\r\n  --hb-ease:cubic-bezier(.4,0,.2,1);\r\n\r\n  box-sizing:border-box;\r\n  width:100%;\r\n  min-height:200px;            \/* section is 200px tall *\/\r\n  background:var(--hb-navy);\r\n  padding:16px 0;\r\n  font-family:\"Segoe UI\",\"Helvetica Neue\",Arial,sans-serif;\r\n\r\n  \/* Vertically centre the whole toolbar content inside the 200px *\/\r\n  display:flex;\r\n  align-items:center;\r\n}\r\n\r\n.hb-toolbar *,\r\n.hb-toolbar *::before,\r\n.hb-toolbar *::after{ box-sizing:border-box; }\r\n\r\n.hb-inner{\r\n  width:100%;\r\n  max-width:1200px;\r\n  margin:0 auto;\r\n  padding:0 20px;\r\n\r\n  display:flex;\r\n  align-items:center;\r\n  gap:16px;\r\n}\r\n\r\n\/* ============================================================\r\n   1. BLOG SEARCH (left)\r\n============================================================ *\/\r\n.hb-search{\r\n  flex:1 1 auto;\r\n  min-width:0;\r\n\r\n  display:flex;\r\n  align-items:center;\r\n  gap:8px;\r\n\r\n  background:var(--hb-white);\r\n  border:1px solid transparent;\r\n  border-radius:12px;\r\n  padding:6px 6px 6px 16px;\r\n\r\n  box-shadow:0 4px 14px -6px rgba(0,0,0,.35);\r\n  transition:border-color .2s var(--hb-ease), box-shadow .2s var(--hb-ease);\r\n}\r\n\r\n.hb-search:focus-within{\r\n  border-color:var(--hb-focus);\r\n  box-shadow:0 6px 20px -6px rgba(10,10,46,.28);\r\n}\r\n\r\n.hb-search__icon{\r\n  display:inline-flex;\r\n  color:var(--hb-muted);\r\n  flex:0 0 auto;\r\n}\r\n\r\n.hb-search__input{\r\n  flex:1 1 auto;\r\n  min-width:0;\r\n  border:0;\r\n  outline:0;\r\n  background:transparent;\r\n  padding:10px 4px;\r\n  font-size:16px;\r\n  color:var(--hb-ink);\r\n}\r\n\r\n.hb-search__input::placeholder{ color:var(--hb-muted); }\r\n\r\n.hb-search__btn{\r\n  flex:0 0 auto;\r\n  cursor:pointer;\r\n  border:0;\r\n  border-radius:9px;\r\n  padding:11px 22px;\r\n  font-size:15px;\r\n  font-weight:600;\r\n  color:#fff;\r\n  background:var(--hb-navy);\r\n  transition:background-color .2s var(--hb-ease), transform .2s var(--hb-ease);\r\n}\r\n\r\n.hb-search__btn:hover{ background:var(--hb-navy-soft); transform:translateY(-1px); }\r\n.hb-search__btn:active{ transform:translateY(0); }\r\n\r\n\/* ============================================================\r\n   2. CATEGORY DROPDOWN (right)\r\n============================================================ *\/\r\n.hb-cat{\r\n  position:relative;\r\n  flex:0 0 340px;\r\n  max-width:100%;\r\n}\r\n\r\n.hb-cat__toggle{\r\n  width:100%;\r\n  cursor:pointer;\r\n\r\n  display:flex;\r\n  align-items:center;\r\n  gap:10px;\r\n\r\n  \/* Kill any inherited WordPress\/theme button chrome (gradients,\r\n     blue focus rings, tap highlights) so only OUR design shows. *\/\r\n  -webkit-appearance:none;\r\n  appearance:none;\r\n  background:var(--hb-white);\r\n  background-image:none;\r\n  border:1px solid transparent;\r\n  border-radius:12px;\r\n  padding:13px 16px;\r\n  -webkit-tap-highlight-color:transparent;\r\n\r\n  font-size:15px;\r\n  color:var(--hb-ink);\r\n  text-align:left;\r\n\r\n  box-shadow:0 4px 14px -6px rgba(0,0,0,.35);\r\n  transition:border-color .2s var(--hb-ease), box-shadow .2s var(--hb-ease);\r\n}\r\n\r\n.hb-cat__toggle:hover{\r\n  background:var(--hb-white);\r\n  border-color:var(--hb-line);\r\n  color:var(--hb-ink);          \/* keep text dark \u2014 themes flip button text to white on hover *\/\r\n  box-shadow:0 4px 14px -6px rgba(0,0,0,.35);\r\n}\r\n\r\n\/* Focus + open: navy accent, never blue. :focus is included so a\r\n   theme's `button:focus` blue box-shadow can't override ours. *\/\r\n.hb-cat__toggle:focus,\r\n.hb-cat__toggle:focus-visible,\r\n.hb-cat.is-open .hb-cat__toggle{\r\n  outline:none;\r\n  background:var(--hb-white);\r\n  border-color:var(--hb-navy);\r\n  color:var(--hb-ink);\r\n  box-shadow:0 6px 20px -6px rgba(10,10,46,.25);\r\n}\r\n\r\n.hb-cat__icon{ display:inline-flex; color:var(--hb-muted); flex:0 0 auto; }\r\n\r\n\/* Label text \u2014 pinned dark in every state so no inherited WordPress\/\r\n   Kadence rule (often `button:hover{color:#fff !important}`) can turn\r\n   it white\/invisible. !important is required to beat those theme rules. *\/\r\n.hb-cat__label,\r\n.hb-cat__toggle .hb-cat__label,\r\n.hb-cat__toggle:hover .hb-cat__label,\r\n.hb-cat__toggle:focus .hb-cat__label,\r\n.hb-cat__toggle:active .hb-cat__label,\r\n.hb-cat.is-open .hb-cat__label{\r\n  flex:1 1 auto;\r\n  min-width:0;\r\n  overflow:hidden;\r\n  text-overflow:ellipsis;\r\n  white-space:nowrap;\r\n\r\n  color:var(--hb-ink) !important;\r\n  -webkit-text-fill-color:var(--hb-ink) !important;  \/* beats gradient-text themes *\/\r\n  opacity:1 !important;\r\n  visibility:visible !important;\r\n}\r\n\r\n\/* Belt-and-braces: force dark text on the whole toggle + its spans,\r\n   whatever state the theme tries to apply. *\/\r\n.hb-cat__toggle,\r\n.hb-cat__toggle:hover,\r\n.hb-cat__toggle:focus,\r\n.hb-cat__toggle:active,\r\n.hb-cat.is-open .hb-cat__toggle{\r\n  color:var(--hb-ink) !important;\r\n  -webkit-text-fill-color:var(--hb-ink) !important;\r\n}\r\n\r\n\/* Keep the icon + caret visible (muted grey) in every state *\/\r\n.hb-cat__icon,\r\n.hb-cat__caret,\r\n.hb-cat__toggle:hover .hb-cat__icon,\r\n.hb-cat__toggle:hover .hb-cat__caret,\r\n.hb-cat.is-open .hb-cat__icon,\r\n.hb-cat.is-open .hb-cat__caret{\r\n  color:var(--hb-muted) !important;\r\n  opacity:1 !important;\r\n}\r\n\r\n.hb-cat__caret{\r\n  display:inline-flex;\r\n  color:var(--hb-muted);\r\n  flex:0 0 auto;\r\n  transition:transform .25s var(--hb-ease);\r\n}\r\n\r\n.hb-cat.is-open .hb-cat__caret{ transform:rotate(180deg); }\r\n\r\n\/* --- Panel --- *\/\r\n.hb-cat__panel{\r\n  position:absolute;\r\n  top:calc(100% + 8px);\r\n  left:0;\r\n  right:0;\r\n  z-index:1000;\r\n\r\n  background:var(--hb-white);\r\n  border:1px solid var(--hb-line);\r\n  border-radius:12px;\r\n  box-shadow:0 20px 44px -16px rgba(10,10,46,.45);\r\n\r\n  padding:10px;\r\n\r\n  opacity:0;\r\n  visibility:hidden;\r\n  transform:translateY(-8px);\r\n  pointer-events:none;\r\n  transition:opacity .22s var(--hb-ease),\r\n             transform .22s var(--hb-ease),\r\n             visibility .22s var(--hb-ease);\r\n}\r\n\r\n.hb-cat.is-open .hb-cat__panel{\r\n  opacity:1;\r\n  visibility:visible;\r\n  transform:translateY(0);\r\n  pointer-events:auto;\r\n}\r\n\r\n\/* --- Panel search --- *\/\r\n.hb-cat__search{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:8px;\r\n\r\n  background:#F4F6FB;\r\n  border:1px solid var(--hb-line);\r\n  border-radius:9px;\r\n  padding:8px 12px;\r\n  margin-bottom:8px;\r\n  transition:border-color .2s var(--hb-ease);\r\n}\r\n\r\n.hb-cat__search:focus-within{ border-color:var(--hb-navy); }\r\n\r\n.hb-cat__search-input:focus{ outline:none; }\r\n\r\n.hb-cat__search-icon{ display:inline-flex; color:var(--hb-muted); flex:0 0 auto; }\r\n\r\n.hb-cat__search-input{\r\n  flex:1 1 auto;\r\n  min-width:0;\r\n  border:0;\r\n  outline:0;\r\n  background:transparent;\r\n  font-size:14px;\r\n  color:var(--hb-ink);\r\n}\r\n\r\n.hb-cat__search-input::placeholder{ color:var(--hb-muted); }\r\n\r\n\/* --- List --- *\/\r\n.hb-cat__list{\r\n  list-style:none;\r\n  margin:0;\r\n  padding:0;\r\n  max-height:300px;\r\n  overflow-y:auto;\r\n}\r\n\r\n.hb-cat__list li{ margin:0; }\r\n\r\n.hb-cat__list a{\r\n  display:block;\r\n  padding:10px 12px;\r\n  border-radius:8px;\r\n  font-size:14px;\r\n  color:var(--hb-ink);\r\n  text-decoration:none;\r\n  transition:background-color .15s var(--hb-ease), color .15s var(--hb-ease);\r\n}\r\n\r\n.hb-cat__list a:focus{ outline:none; }\r\n\r\n.hb-cat__list a:hover,\r\n.hb-cat__list a:focus-visible,\r\n.hb-cat__list a.is-active{\r\n  background:var(--hb-hover);\r\n  color:var(--hb-navy);\r\n  outline:none;\r\n}\r\n\r\n\/* --- Empty \/ no-results message (NO loader anywhere) --- *\/\r\n.hb-cat__empty{\r\n  margin:0;\r\n  padding:16px 12px;\r\n  font-size:14px;\r\n  color:var(--hb-muted);\r\n  text-align:center;\r\n}\r\n\r\n\/* Slim scrollbar *\/\r\n.hb-cat__list::-webkit-scrollbar{ width:8px; }\r\n.hb-cat__list::-webkit-scrollbar-thumb{ background:#D6D9E6; border-radius:8px; }\r\n\r\n\/* ============================================================\r\n   3. RESPONSIVE \u2014 stack on tablet \/ mobile\r\n============================================================ *\/\r\n@media (max-width:768px){\r\n  .hb-inner{\r\n    flex-direction:column;\r\n    align-items:stretch;\r\n    gap:12px;\r\n  }\r\n  .hb-cat{ flex:1 1 auto; }\r\n  .hb-search__input{ font-size:16px; } \/* keeps iOS from zooming *\/\r\n}\r\n\r\n@media (max-width:480px){\r\n  .hb-toolbar{ padding:14px 0; }\r\n  .hb-inner{ padding:0 14px; }\r\n  .hb-search__btn{ padding:11px 16px; }\r\n}\r\n\r\n\/* Reduced motion *\/\r\n@media (prefers-reduced-motion:reduce){\r\n  .hb-cat__panel,\r\n  .hb-cat__caret,\r\n  .hb-search__btn{ transition:none; }\r\n}\r\n<\/style>\r\n\r\n\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  \/* ============================================================\r\n     WordPress REST API endpoint for categories.\r\n     Categories are pulled live from here \u2014 none are hardcoded.\r\n     They are PREFETCHED on page load, so by the time the user\r\n     opens the dropdown they are already available. There is NO\r\n     loading state, spinner, or \"loading\u2026\" text anywhere.\r\n  ============================================================ *\/\r\n  var API      = \"https:\/\/www.henryharvin.com\/blog\/wp-json\/wp\/v2\/categories\";\r\n  var PER_PAGE = 100; \/\/ WP REST maximum per request.\r\n  var RETRIES  = 3;   \/\/ silent background retries on network failure.\r\n\r\n  var root   = document.getElementById(\"hbCat\");\r\n  var toggle = document.getElementById(\"hbCatToggle\");\r\n  var panel  = document.getElementById(\"hbCatPanel\");\r\n  var search = document.getElementById(\"hbCatSearch\");\r\n  var list   = document.getElementById(\"hbCatList\");\r\n  var empty  = document.getElementById(\"hbCatEmpty\");\r\n\r\n  if (!root || !toggle || !panel || !search || !list) { return; }\r\n\r\n  var items = [];        \/\/ current <a> nodes\r\n  var ready = false;     \/\/ true once the fetch has resolved (success or give-up)\r\n  var started = false;   \/\/ guards against duplicate fetches\r\n\r\n  \/* ---------- Helpers ---------- *\/\r\n  function esc(str) {\r\n    return String(str).replace(\/[&<>\"']\/g, function (c) {\r\n      return { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" }[c];\r\n    });\r\n  }\r\n\r\n  \/* ---------- Fetch ALL categories, following pagination ---------- *\/\r\n  function fetchAllCategories() {\r\n    var all = [];\r\n\r\n    function getPage(page, totalPages) {\r\n      var url = API +\r\n        \"?per_page=\" + PER_PAGE +\r\n        \"&page=\" + page +\r\n        \"&orderby=name&order=asc\" +\r\n        \"&_fields=id,name,link,count\";\r\n\r\n      return fetch(url, { headers: { \"Accept\": \"application\/json\" } })\r\n        .then(function (res) {\r\n          if (!res.ok) { throw new Error(\"HTTP \" + res.status); }\r\n\r\n          if (page === 1) {\r\n            var tp = parseInt(res.headers.get(\"X-WP-TotalPages\"), 10);\r\n            totalPages = (tp && tp > 0) ? tp : 1;\r\n          }\r\n\r\n          return res.json().then(function (data) {\r\n            if (Array.isArray(data)) { all = all.concat(data); }\r\n            if (page < totalPages) { return getPage(page + 1, totalPages); }\r\n            return all;\r\n          });\r\n        });\r\n    }\r\n\r\n    return getPage(1, 1);\r\n  }\r\n\r\n  \/* ---------- Build the list once, from fetched data ---------- *\/\r\n  function buildList(cats) {\r\n    var html = \"\";\r\n\r\n    for (var i = 0; i < cats.length; i++) {\r\n      var c = cats[i];\r\n      if (!c || !c.name || !c.link) { continue; }\r\n\r\n      html += '<li role=\"option\">' +\r\n                '<a href=\"' + esc(c.link) + '\" data-name=\"' + esc(String(c.name).toLowerCase()) + '\">' +\r\n                  esc(c.name) +\r\n                '<\/a>' +\r\n              '<\/li>';\r\n    }\r\n\r\n    list.innerHTML = html;\r\n    items = Array.prototype.slice.call(list.querySelectorAll(\"a\"));\r\n    ready = true;\r\n\r\n    applyFilter(); \/\/ respect anything already typed\r\n  }\r\n\r\n  \/* ---------- Prefetch on load; silent retries; no visible loader ---------- *\/\r\n  function loadCategories() {\r\n    if (started) { return; }\r\n    started = true;\r\n\r\n    var attempt = 0;\r\n\r\n    function tryFetch() {\r\n      fetchAllCategories()\r\n        .then(buildList)\r\n        .catch(function () {\r\n          attempt++;\r\n          if (attempt < RETRIES) {\r\n            window.setTimeout(tryFetch, 800);   \/\/ retry quietly\r\n          } else {\r\n            ready = true;                        \/\/ give up: show \"No categories found\"\r\n            items = [];\r\n            list.innerHTML = \"\";\r\n            applyFilter();\r\n          }\r\n        });\r\n    }\r\n\r\n    tryFetch();\r\n  }\r\n\r\n  \/* ---------- Instant client-side filter (no loading state) ---------- *\/\r\n  function applyFilter() {\r\n    \/\/ Before data is ready, show nothing \u2014 never a loader, never a message.\r\n    if (!ready) { empty.hidden = true; return; }\r\n\r\n    \/\/ Data ready but there are genuinely no categories at all.\r\n    if (!items.length) { empty.hidden = false; return; }\r\n\r\n    var q = search.value.trim().toLowerCase();\r\n    var shown = 0;\r\n\r\n    for (var i = 0; i < items.length; i++) {\r\n      var match = items[i].getAttribute(\"data-name\").indexOf(q) !== -1;\r\n      items[i].parentNode.style.display = match ? \"\" : \"none\";\r\n      if (match) { shown++; }\r\n    }\r\n\r\n    \/\/ Only message is \"No categories found\", shown when nothing matches.\r\n    empty.hidden = shown !== 0;\r\n  }\r\n\r\n  search.addEventListener(\"input\", applyFilter);\r\n\r\n  \/* ---------- Open \/ close ---------- *\/\r\n  function openMenu() {\r\n    root.classList.add(\"is-open\");\r\n    toggle.setAttribute(\"aria-expanded\", \"true\");\r\n    window.setTimeout(function () { search.focus(); }, 60);\r\n  }\r\n\r\n  function closeMenu() {\r\n    root.classList.remove(\"is-open\");\r\n    toggle.setAttribute(\"aria-expanded\", \"false\");\r\n  }\r\n\r\n  function isOpen() { return root.classList.contains(\"is-open\"); }\r\n\r\n  toggle.addEventListener(\"click\", function (e) {\r\n    e.stopPropagation();\r\n    if (isOpen()) { closeMenu(); } else { openMenu(); }\r\n  });\r\n\r\n  \/* ---------- Keyboard: Escape closes, Enter opens first match ---------- *\/\r\n  search.addEventListener(\"keydown\", function (e) {\r\n    if (e.key === \"Escape\") {\r\n      closeMenu();\r\n      toggle.focus();\r\n      return;\r\n    }\r\n    if (e.key === \"Enter\") {\r\n      e.preventDefault();\r\n      for (var i = 0; i < items.length; i++) {\r\n        if (items[i].parentNode.style.display !== \"none\") {\r\n          window.location.href = items[i].getAttribute(\"href\");\r\n          return;\r\n        }\r\n      }\r\n    }\r\n  });\r\n\r\n  toggle.addEventListener(\"keydown\", function (e) {\r\n    if (e.key === \"Escape\") { closeMenu(); }\r\n  });\r\n\r\n  \/* ---------- Close on outside click \/ touch ---------- *\/\r\n  document.addEventListener(\"click\", function (e) {\r\n    if (isOpen() && !root.contains(e.target)) { closeMenu(); }\r\n  });\r\n\r\n  document.addEventListener(\"touchstart\", function (e) {\r\n    if (isOpen() && !root.contains(e.target)) { closeMenu(); }\r\n  }, { passive: true });\r\n\r\n  \/* ---------- Guard: don't submit an empty blog search ---------- *\/\r\n  var form  = document.querySelector(\".hb-search\");\r\n  var sInput = form ? form.querySelector(\".hb-search__input\") : null;\r\n  if (form && sInput) {\r\n    form.addEventListener(\"submit\", function (e) {\r\n      if (sInput.value.trim() === \"\") { e.preventDefault(); sInput.focus(); }\r\n    });\r\n  }\r\n\r\n  \/* ---------- Kick off the prefetch immediately ---------- *\/\r\n  loadCategories();\r\n\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e61103e e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"e61103e\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a2aa00c elementor-widget elementor-widget-html\" data-id=\"a2aa00c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- ============================================================\r\n     HENRY HARVIN \u2014 CUSTOM BLOG POST GRID\r\n     Self-contained: HTML + internal <style> + internal <script>\r\n     Posts fetched LIVE from the WordPress REST API (with _embed).\r\n     Nothing hardcoded. No PHP, no external CSS\/JS libraries.\r\n     Paste directly into a WordPress HTML block \/ widget.\r\n============================================================ -->\r\n\r\n<div class=\"hhb-wrap\">\r\n  <div class=\"hhb-inner\">\r\n\r\n    <div class=\"hhb-grid\" id=\"hhbGrid\" aria-live=\"polite\"><\/div>\r\n\r\n    <p class=\"hhb-status\" id=\"hhbStatus\">Loading posts\u2026<\/p>\r\n\r\n    <nav class=\"hhb-pager\" id=\"hhbPager\" aria-label=\"Blog pagination\"><\/nav>\r\n\r\n  <\/div>\r\n<\/div>\r\n\r\n\r\n<style>\r\n\/* ============================================================\r\n   TOKENS\r\n============================================================ *\/\r\n.hhb-wrap{\r\n  --hhb-navy:#0A0A2E;\r\n  --hhb-navy-soft:#23235C;\r\n  --hhb-ink:#141728;\r\n  --hhb-text:#525A6E;\r\n  --hhb-muted:#8A90A0;\r\n  --hhb-line:#ECEEF3;\r\n  --hhb-card:#ffffff;\r\n  --hhb-wash:#F4F6FA;\r\n  --hhb-ease:cubic-bezier(.4,0,.2,1);\r\n\r\n  box-sizing:border-box;\r\n  width:100%;\r\n  padding:40px 0;\r\n  font-family:\"Segoe UI\",\"Helvetica Neue\",Arial,sans-serif;\r\n  color:var(--hhb-text);\r\n}\r\n\r\n.hhb-wrap *,\r\n.hhb-wrap *::before,\r\n.hhb-wrap *::after{ box-sizing:border-box; }\r\n\r\n.hhb-inner{\r\n  max-width:1300px;\r\n  margin:0 auto;\r\n  padding:0 20px;\r\n}\r\n\r\n\/* ============================================================\r\n   GRID \u2014 3 \/ 2 \/ 1 columns\r\n============================================================ *\/\r\n.hhb-grid{\r\n  display:grid;\r\n  grid-template-columns:repeat(3,1fr);\r\n  gap:28px;\r\n}\r\n\r\n\/* ============================================================\r\n   CARD\r\n============================================================ *\/\r\n.hhb-card{\r\n  display:flex;\r\n  flex-direction:column;\r\n  height:100%;\r\n\r\n  background:var(--hhb-card);\r\n  border:1px solid var(--hhb-line);\r\n  border-radius:14px;\r\n  overflow:hidden;\r\n\r\n  box-shadow:0 1px 2px rgba(20,23,40,.04);\r\n  transition:transform .25s var(--hhb-ease),\r\n             box-shadow .25s var(--hhb-ease),\r\n             border-color .25s var(--hhb-ease);\r\n}\r\n\r\n.hhb-card:hover{\r\n  transform:translateY(-3px);\r\n  border-color:#E1E4EC;\r\n  box-shadow:0 12px 30px -14px rgba(20,23,40,.22);\r\n}\r\n\r\n\/* --- Featured image (top of card) --- *\/\r\n.hhb-card__media{\r\n  position:relative;\r\n  display:block;\r\n  width:100%;\r\n  aspect-ratio:16 \/ 10;\r\n  min-height:170px;              \/* fallback if aspect-ratio unsupported *\/\r\n  overflow:hidden;\r\n  background:var(--hhb-wash);\r\n}\r\n\r\n.hhb-card__img{\r\n  width:100%;\r\n  height:100%;\r\n  object-fit:cover;\r\n  display:block;\r\n  transition:transform .4s var(--hhb-ease);\r\n}\r\n\r\n.hhb-card:hover .hhb-card__img{ transform:scale(1.04); }\r\n\r\n\/* Neutral placeholder when a post has no featured image *\/\r\n.hhb-card__ph{\r\n  width:100%;\r\n  height:100%;\r\n  background:linear-gradient(135deg,#EEF1F7 0%,#E4E8F0 100%);\r\n}\r\n\r\n\/* --- Body --- *\/\r\n.hhb-card__body{\r\n  display:flex;\r\n  flex-direction:column;\r\n  flex:1 1 auto;\r\n  padding:20px 20px 22px;\r\n}\r\n\r\n\/* --- Category \u2014 small rounded badge (below image \/ above title) --- *\/\r\n.hhb-card__cat{\r\n  display:inline-block;\r\n  align-self:flex-start;\r\n  max-width:100%;\r\n  margin:0 0 12px;\r\n  padding:4px 12px;\r\n\r\n  font-size:11px;\r\n  font-weight:700;\r\n  letter-spacing:.04em;\r\n  text-transform:uppercase;\r\n  color:var(--hhb-navy) !important;             \/* beat theme link color *\/\r\n  -webkit-text-fill-color:var(--hhb-navy);\r\n  text-decoration:none;\r\n\r\n  background:rgba(10,10,46,.06);\r\n  border:1px solid rgba(10,10,46,.10);\r\n  border-radius:999px;                          \/* rounded\/circular badge *\/\r\n\r\n  overflow:hidden;\r\n  text-overflow:ellipsis;\r\n  white-space:nowrap;\r\n  transition:background .2s var(--hhb-ease), color .2s var(--hhb-ease);\r\n}\r\n\r\n.hhb-card__cat:hover,\r\n.hhb-card__cat:focus{\r\n  background:var(--hhb-navy);\r\n  color:#fff !important;\r\n  -webkit-text-fill-color:#fff;\r\n  text-decoration:none;\r\n}\r\n\r\n\/* --- Title (2-line clamp for equal heights) --- *\/\r\n.hhb-card__title{\r\n  margin:0 0 12px;\r\n  font-size:16.5px;\r\n  line-height:1.4;\r\n  font-weight:700;\r\n  letter-spacing:-.01em;\r\n\r\n  display:-webkit-box;\r\n  -webkit-line-clamp:2;\r\n  -webkit-box-orient:vertical;\r\n  overflow:hidden;\r\n}\r\n\r\n.hhb-card__title a{\r\n  color:var(--hhb-ink);\r\n  text-decoration:none;\r\n  transition:color .2s var(--hhb-ease);\r\n}\r\n\r\n.hhb-card__title a:hover{ color:var(--hhb-navy); }\r\n\r\n\/* --- Meta (date + author) --- *\/\r\n.hhb-card__meta{\r\n  display:flex;\r\n  align-items:center;\r\n  flex-wrap:wrap;\r\n  gap:6px 18px;\r\n  margin-bottom:12px;\r\n\r\n  font-size:12.5px;\r\n  color:var(--hhb-muted);\r\n}\r\n\r\n.hhb-meta{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  gap:6px;\r\n  min-width:0;\r\n}\r\n\r\n.hhb-meta svg{ flex:0 0 auto; color:var(--hhb-navy); opacity:.85; }\r\n\r\n.hhb-meta__avatar{\r\n  width:19px;\r\n  height:19px;\r\n  border-radius:50%;\r\n  object-fit:cover;\r\n  flex:0 0 auto;\r\n  background:var(--hhb-wash);\r\n}\r\n\r\n.hhb-meta__name{\r\n  overflow:hidden;\r\n  text-overflow:ellipsis;\r\n  white-space:nowrap;\r\n}\r\n\r\n\/* --- Excerpt (2-line clamp) --- *\/\r\n.hhb-card__excerpt{\r\n  margin:0 0 18px;\r\n  font-size:13.5px;\r\n  line-height:1.6;\r\n  color:var(--hhb-text);\r\n\r\n  display:-webkit-box;\r\n  -webkit-line-clamp:2;\r\n  -webkit-box-orient:vertical;\r\n  overflow:hidden;\r\n}\r\n\r\n\/* --- Button (pinned to the bottom, aligned across cards) --- *\/\r\n.hhb-card__btn{\r\n  margin-top:auto;\r\n  align-self:flex-start;\r\n\r\n  display:inline-flex;\r\n  align-items:center;\r\n  gap:8px;\r\n\r\n  padding:10px 18px;\r\n  font-size:13px;\r\n  font-weight:600;\r\n  color:#fff;\r\n  text-decoration:none;\r\n\r\n  background:var(--hhb-navy);\r\n  border-radius:8px;\r\n  transition:background .2s var(--hhb-ease), gap .2s var(--hhb-ease);\r\n}\r\n\r\n.hhb-card__btn:hover{ background:var(--hhb-navy-soft); gap:11px; }\r\n.hhb-card__btn svg{ flex:0 0 auto; }\r\n\r\n\/* Keep button text white in every state \u2014 theme link\/button hover\r\n   rules (often turn text blue or invert it) must not override this. *\/\r\n.hhb-card__btn,\r\n.hhb-card__btn:hover,\r\n.hhb-card__btn:focus,\r\n.hhb-card__btn:active,\r\n.hhb-card__btn:visited{\r\n  color:#fff !important;\r\n  -webkit-text-fill-color:#fff !important;\r\n}\r\n\r\n\/* ============================================================\r\n   STATUS (network only) + PAGINATION\r\n============================================================ *\/\r\n.hhb-status{\r\n  margin:30px 0 0;\r\n  padding:24px 12px;\r\n  text-align:center;\r\n  font-size:15px;\r\n  color:var(--hhb-muted);\r\n}\r\n\r\n.hhb-status[hidden]{ display:none; }\r\n\r\n.hhb-pager{\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  flex-wrap:wrap;\r\n  gap:8px;\r\n  margin-top:40px;\r\n}\r\n\r\n.hhb-pager:empty{ display:none; }\r\n\r\n.hhb-page{\r\n  min-width:42px;\r\n  height:42px;\r\n  padding:0 12px;\r\n\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  gap:6px;\r\n\r\n  cursor:pointer;\r\n  font-size:14px;\r\n  font-weight:600;\r\n  color:var(--hhb-ink);\r\n\r\n  background:#fff;\r\n  border:1px solid var(--hhb-line);\r\n  border-radius:9px;\r\n  transition:background .2s var(--hhb-ease), color .2s var(--hhb-ease),\r\n             border-color .2s var(--hhb-ease);\r\n}\r\n\r\n.hhb-page:hover:not(:disabled):not(.is-active){\r\n  background:var(--hhb-wash);\r\n  border-color:#DCDFEA;\r\n  color:var(--hhb-ink) !important;              \/* number stays dark on hover, not white *\/\r\n  -webkit-text-fill-color:var(--hhb-ink) !important;\r\n}\r\n\r\n.hhb-page.is-active{\r\n  background:var(--hhb-navy);\r\n  border-color:var(--hhb-navy);\r\n  color:#fff !important;                        \/* active number stays white on navy *\/\r\n  -webkit-text-fill-color:#fff !important;\r\n  cursor:default;\r\n}\r\n\r\n.hhb-page:disabled{ opacity:.45; cursor:not-allowed; }\r\n.hhb-page svg{ flex:0 0 auto; }\r\n\r\n.hhb-ellipsis{\r\n  min-width:24px;\r\n  text-align:center;\r\n  color:var(--hhb-muted);\r\n  user-select:none;\r\n}\r\n\r\n\/* ============================================================\r\n   RESPONSIVE\r\n============================================================ *\/\r\n@media (max-width:1024px){\r\n  .hhb-grid{ grid-template-columns:repeat(2,1fr); gap:24px; }\r\n}\r\n\r\n@media (max-width:640px){\r\n  .hhb-wrap{ padding:28px 0; }\r\n  .hhb-grid{ grid-template-columns:1fr; gap:20px; }\r\n  .hhb-page{ min-width:38px; height:38px; }\r\n}\r\n\r\n\/* Reduced motion *\/\r\n@media (prefers-reduced-motion:reduce){\r\n  .hhb-card,\r\n  .hhb-card__img,\r\n  .hhb-card__btn{ transition:none; }\r\n  .hhb-card:hover{ transform:none; }\r\n  .hhb-card:hover .hhb-card__img{ transform:none; }\r\n}\r\n<\/style>\r\n\r\n\r\n<script>\r\n(function () {\r\n  \"use strict\";\r\n\r\n  var API       = \"https:\/\/www.henryharvin.com\/blog\/wp-json\/wp\/v2\/posts\";\r\n  var PER_PAGE  = 12;\r\n  var MONTHS    = [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];\r\n\r\n  var grid   = document.getElementById(\"hhbGrid\");\r\n  var status = document.getElementById(\"hhbStatus\");\r\n  var pager  = document.getElementById(\"hhbPager\");\r\n\r\n  if (!grid || !status || !pager) { return; }\r\n\r\n  var totalPages  = 1;\r\n  var currentPage = 0;\r\n  var cache       = {};     \/\/ page number -> posts[] (avoids refetching)\r\n  var controller  = null;   \/\/ AbortController for the in-flight request\r\n  var statusTimer = null;   \/\/ delayed, subtle status (never a blocking loader)\r\n\r\n  \/* ---------- URL <-> page (keeps the page number in the address bar) ----------\r\n     Root-cause fix for \"refresh resets to page 1\": the current page is now\r\n     derived FROM the WordPress URL, and every pagination click writes it BACK\r\n     to the URL (\/blog\/page\/N\/) so a browser refresh restores the same page. *\/\r\n\r\n  \/\/ Read the active page from the real URL: \/blog\/page\/5\/  or  ?paged=5 \/ ?page=5.\r\n  function getPageFromURL() {\r\n    var path = window.location.pathname || \"\";\r\n    var m = path.match(\/\\\/page\\\/(\\d+)\\\/?(?:$|[?#])\/);\r\n    if (m) { var n = parseInt(m[1], 10); if (n > 0) { return n; } }\r\n    var s = window.location.search || \"\";\r\n    var q = s.match(\/[?&](?:paged|page)=(\\d+)\/);\r\n    if (q) { var qn = parseInt(q[1], 10); if (qn > 0) { return qn; } }\r\n    return 1;\r\n  }\r\n\r\n  \/\/ Base listing path with any \"\/page\/N\/\" stripped off (e.g. \"\/blog\/\").\r\n  function getBasePath() {\r\n    var path = (window.location.pathname || \"\/\").replace(\/\\\/page\\\/\\d+\\\/?$\/, \"\/\");\r\n    if (path.charAt(path.length - 1) !== \"\/\") { path += \"\/\"; }\r\n    return path;\r\n  }\r\n\r\n  \/\/ Build the WordPress-style URL for a page (page 1 = base, no \/page\/1\/).\r\n  function urlForPage(page) {\r\n    var base = getBasePath();\r\n    return (page <= 1) ? base : base + \"page\/\" + page + \"\/\";\r\n  }\r\n\r\n  \/\/ Reflect the page in the address bar without reloading.\r\n  function pushPageURL(page) {\r\n    if (!window.history || !window.history.pushState) { return; }\r\n    try {\r\n      window.history.pushState({ hhbPage: page }, \"\", urlForPage(page));\r\n    } catch (e) { \/* pushState can throw on some sandboxed origins \u2014 ignore *\/ }\r\n  }\r\n\r\n  \/* ---------- Helpers ---------- *\/\r\n  function esc(str) {\r\n    return String(str == null ? \"\" : str).replace(\/[&<>\"']\/g, function (c) {\r\n      return { \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" }[c];\r\n    });\r\n  }\r\n\r\n  \/\/ Decode HTML entities + strip tags (for titles \/ excerpts).\r\n  var decoder = document.createElement(\"textarea\");\r\n  function decode(html) {\r\n    decoder.innerHTML = String(html == null ? \"\" : html);\r\n    var text = decoder.value || \"\";\r\n    var tmp = document.createElement(\"div\");\r\n    tmp.innerHTML = text;\r\n    return (tmp.textContent || tmp.innerText || \"\").trim();\r\n  }\r\n\r\n  function formatDate(iso) {\r\n    var d = new Date(iso);\r\n    if (isNaN(d.getTime())) { return \"\"; }\r\n    return MONTHS[d.getMonth()] + \" \" + d.getDate() + \", \" + d.getFullYear();\r\n  }\r\n\r\n  function getFeatured(post) {\r\n    var media = post._embedded && post._embedded[\"wp:featuredmedia\"] &&\r\n                post._embedded[\"wp:featuredmedia\"][0];\r\n    if (!media || media.code) { return \"\"; }\r\n\r\n    var sizes = media.media_details && media.media_details.sizes;\r\n    if (sizes) {\r\n      var pick = sizes.medium_large || sizes.large || sizes.medium || sizes.full;\r\n      if (pick && pick.source_url) { return pick.source_url; }\r\n    }\r\n    return media.source_url || \"\";\r\n  }\r\n\r\n  \/\/ Return only the FIRST\/primary category for the post.\r\n  function getCategory(post) {\r\n    var groups = post._embedded && post._embedded[\"wp:term\"];\r\n    if (!groups) { return null; }\r\n    for (var g = 0; g < groups.length; g++) {\r\n      var terms = groups[g] || [];\r\n      for (var t = 0; t < terms.length; t++) {\r\n        if (terms[t] && terms[t].taxonomy === \"category\") {\r\n          return { name: terms[t].name, link: terms[t].link || \"#\" };\r\n        }\r\n      }\r\n    }\r\n    return null;\r\n  }\r\n\r\n  function getAuthor(post) {\r\n    var a = post._embedded && post._embedded.author && post._embedded.author[0];\r\n    if (!a || a.code) { return { name: \"\", avatar: \"\" }; }\r\n    var avatar = a.avatar_urls && (a.avatar_urls[\"48\"] || a.avatar_urls[\"96\"] || a.avatar_urls[\"24\"]);\r\n    return { name: a.name || \"\", avatar: avatar || \"\" };\r\n  }\r\n\r\n  \/* ---------- Icons ---------- *\/\r\n  var CAL_ICON  = '<svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"><\/rect><line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"><\/line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"><\/line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"><\/line><\/svg>';\r\n  var USER_ICON = '<svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"><\/path><circle cx=\"12\" cy=\"7\" r=\"4\"><\/circle><\/svg>';\r\n  var ARROW     = '<svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"><\/line><polyline points=\"12 5 19 12 12 19\"><\/polyline><\/svg>';\r\n\r\n  \/* ---------- Card markup ---------- *\/\r\n  function cardHTML(post) {\r\n    var link    = esc(post.link || \"#\");\r\n    var title   = esc(decode(post.title && post.title.rendered));\r\n    var excerpt = esc(decode(post.excerpt && post.excerpt.rendered));\r\n    var date    = esc(formatDate(post.date));\r\n    var img     = getFeatured(post);\r\n    var cat     = getCategory(post);\r\n    var author  = getAuthor(post);\r\n\r\n    var media = img\r\n      ? '<img loading=\"lazy\" class=\"hhb-card__img\" src=\"' + esc(img) + '\" alt=\"' + title + '\" width=\"640\" height=\"400\" loading=\"lazy\" decoding=\"async\" \/>'\r\n      : '<div class=\"hhb-card__ph\"><\/div>';\r\n\r\n    var catRow = cat\r\n      ? '<a class=\"hhb-card__cat\" href=\"' + esc(cat.link) + '\">' + esc(cat.name) + '<\/a>'\r\n      : '';\r\n\r\n    var avatar = author.avatar\r\n      ? '<img loading=\"lazy\" class=\"hhb-meta__avatar\" src=\"' + esc(author.avatar) + '\" alt=\"\" width=\"19\" height=\"19\" loading=\"lazy\" decoding=\"async\" \/>'\r\n      : USER_ICON;\r\n\r\n    var authorMeta = author.name\r\n      ? '<span class=\"hhb-meta\">' + avatar + '<span class=\"hhb-meta__name\">' + esc(author.name) + '<\/span><\/span>'\r\n      : '';\r\n\r\n    var dateMeta = date\r\n      ? '<span class=\"hhb-meta\">' + CAL_ICON + '<span>' + date + '<\/span><\/span>'\r\n      : '';\r\n\r\n    return '' +\r\n      '<article class=\"hhb-card\">' +\r\n        '<a class=\"hhb-card__media\" href=\"' + link + '\" aria-label=\"' + title + '\">' +\r\n          media +\r\n        '<\/a>' +\r\n        '<div class=\"hhb-card__body\">' +\r\n          catRow +\r\n          '<h3 class=\"hhb-card__title\"><a href=\"' + link + '\">' + title + '<\/a><\/h3>' +\r\n          '<div class=\"hhb-card__meta\">' + dateMeta + authorMeta + '<\/div>' +\r\n          '<p class=\"hhb-card__excerpt\">' + excerpt + '<\/p>' +\r\n          '<a class=\"hhb-card__btn\" href=\"' + link + '\">Continue Reading ' + ARROW + '<\/a>' +\r\n        '<\/div>' +\r\n      '<\/article>';\r\n  }\r\n\r\n  \/* ---------- Render ---------- *\/\r\n  function renderPosts(posts) {\r\n    grid.innerHTML = posts.map(cardHTML).join(\"\");\r\n  }\r\n\r\n  function pageList(cur, total) {\r\n    var arr = [];\r\n    if (total <= 7) {\r\n      for (var i = 1; i <= total; i++) { arr.push(i); }\r\n      return arr;\r\n    }\r\n    arr.push(1);\r\n    if (cur > 3) { arr.push(\"\u2026\"); }\r\n    var s = Math.max(2, cur - 1), e = Math.min(total - 1, cur + 1);\r\n    for (var j = s; j <= e; j++) { arr.push(j); }\r\n    if (cur < total - 2) { arr.push(\"\u2026\"); }\r\n    arr.push(total);\r\n    return arr;\r\n  }\r\n\r\n  var PREV = '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"><\/polyline><\/svg>';\r\n  var NEXT = '<svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"><\/polyline><\/svg>';\r\n\r\n  function renderPager(cur, total) {\r\n    if (total <= 1) { pager.innerHTML = \"\"; return; }\r\n\r\n    var html = '<button class=\"hhb-page\" type=\"button\" data-page=\"' + (cur - 1) + '\"' +\r\n               (cur <= 1 ? \" disabled\" : \"\") + ' aria-label=\"Previous page\">' + PREV + '<\/button>';\r\n\r\n    pageList(cur, total).forEach(function (p) {\r\n      if (p === \"\u2026\") {\r\n        html += '<span class=\"hhb-ellipsis\">\u2026<\/span>';\r\n      } else {\r\n        html += '<button class=\"hhb-page' + (p === cur ? \" is-active\" : \"\") + '\" type=\"button\" ' +\r\n                'data-page=\"' + p + '\"' + (p === cur ? ' aria-current=\"page\"' : \"\") + '>' + p + '<\/button>';\r\n      }\r\n    });\r\n\r\n    html += '<button class=\"hhb-page\" type=\"button\" data-page=\"' + (cur + 1) + '\"' +\r\n            (cur >= total ? \" disabled\" : \"\") + ' aria-label=\"Next page\">' + NEXT + '<\/button>';\r\n\r\n    pager.innerHTML = html;\r\n  }\r\n\r\n  \/* ---------- Subtle status: only shown if a request is actually slow ---------- *\/\r\n  function showStatusSoon() {\r\n    clearTimeout(statusTimer);\r\n    statusTimer = window.setTimeout(function () {\r\n      status.textContent = \"Loading posts\u2026\";\r\n      status.hidden = false;\r\n    }, 300);\r\n  }\r\n\r\n  function hideStatus() {\r\n    clearTimeout(statusTimer);\r\n    status.hidden = true;\r\n  }\r\n\r\n  function scrollToGrid() {\r\n    var top = grid.getBoundingClientRect().top + window.pageYOffset - 20;\r\n    window.scrollTo({ top: top, behavior: \"smooth\" });\r\n  }\r\n\r\n  function paint(page, posts) {\r\n    currentPage = page;\r\n    renderPosts(posts);\r\n    renderPager(page, totalPages);\r\n  }\r\n\r\n  \/* ---------- Fetch one page (21 posts) \u2014 cached, abortable ---------- *\/\r\n  function loadPage(page, scroll, push) {\r\n    if (page === currentPage) { return; }         \/\/ already on screen \u2014 no work\r\n\r\n    \/\/ Keep the address bar in sync so a refresh restores this exact page.\r\n    if (push) { pushPageURL(page); }\r\n\r\n    \/\/ Already fetched? Paint from cache instantly, no network request.\r\n    if (cache[page]) {\r\n      hideStatus();\r\n      paint(page, cache[page]);\r\n      if (scroll) { scrollToGrid(); }\r\n      return;\r\n    }\r\n\r\n    \/\/ Cancel any request still in flight so we never process stale data.\r\n    if (controller) { controller.abort(); }\r\n    controller = (\"AbortController\" in window) ? new AbortController() : null;\r\n\r\n    showStatusSoon();\r\n    grid.setAttribute(\"aria-busy\", \"true\");\r\n\r\n    var url = API + \"?per_page=\" + PER_PAGE + \"&page=\" + page +\r\n              \"&orderby=date&order=desc&_embed=1\";\r\n\r\n    fetch(url, {\r\n      headers: { \"Accept\": \"application\/json\" },\r\n      signal: controller ? controller.signal : undefined\r\n    })\r\n      .then(function (res) {\r\n        if (!res.ok) { throw new Error(\"HTTP \" + res.status); }\r\n        var tp = parseInt(res.headers.get(\"X-WP-TotalPages\"), 10);\r\n        totalPages = (tp && tp > 0) ? tp : 1;\r\n        return res.json();\r\n      })\r\n      .then(function (posts) {\r\n        grid.removeAttribute(\"aria-busy\");\r\n        hideStatus();\r\n\r\n        if (!Array.isArray(posts) || posts.length === 0) {\r\n          currentPage = page;\r\n          grid.innerHTML = \"\";\r\n          pager.innerHTML = \"\";\r\n          status.hidden = false;\r\n          status.textContent = \"No posts found.\";\r\n          return;\r\n        }\r\n\r\n        cache[page] = posts;                        \/\/ remember for revisits\r\n        paint(page, posts);\r\n        if (scroll) { scrollToGrid(); }\r\n      })\r\n      .catch(function (err) {\r\n        if (err && err.name === \"AbortError\") { return; }   \/\/ superseded \u2014 ignore\r\n        grid.removeAttribute(\"aria-busy\");\r\n        hideStatus();\r\n        grid.innerHTML = \"\";\r\n        pager.innerHTML = \"\";\r\n        status.hidden = false;\r\n        status.textContent = \"Sorry, we couldn't load the posts. Please try again later.\";\r\n      });\r\n  }\r\n\r\n  \/* ---------- One delegated listener for pagination (post links stay native) ---------- *\/\r\n  pager.addEventListener(\"click\", function (e) {\r\n    var btn = e.target.closest(\".hhb-page\");\r\n    if (!btn || btn.disabled) { return; }\r\n    var p = parseInt(btn.getAttribute(\"data-page\"), 10);\r\n    if (!p || p < 1 || p > totalPages || p === currentPage) { return; }\r\n    loadPage(p, true, true);                       \/\/ scroll + write \/blog\/page\/N\/ to the URL\r\n  });\r\n\r\n  \/* ---------- Back \/ forward buttons: follow the URL, don't push again ---------- *\/\r\n  window.addEventListener(\"popstate\", function () {\r\n    loadPage(getPageFromURL(), false, false);\r\n  });\r\n\r\n  \/* ---------- Init \u2014 start on the page the URL asks for, not always page 1 ---------- *\/\r\n  loadPage(getPageFromURL(), false, false);\r\n\r\n})();\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Search Search Blog Categories No categories found<\/p>\n","protected":false},"author":1183,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","two_page_speed":[],"footnotes":""},"class_list":["post-220546","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Professional Certification Courses Blogs - Henry Harvin<\/title>\n<meta name=\"description\" content=\"Henry Harvin blog provides a deep insights of professional certifications courses with best institutes, career trends &amp; fee structures.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.henryharvin.com\/blog\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Professional Certification Courses Blogs - Henry Harvin\" \/>\n<meta property=\"og:description\" content=\"Henry Harvin blog provides a deep insights of professional certifications courses with best institutes, career trends &amp; fee structures.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.henryharvin.com\/blog\/\" \/>\n<meta property=\"og:site_name\" content=\"Henry Harvin Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-16T07:47:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hh-certificates.sgp1.digitaloceanspaces.com\/blog\/wp-content\/uploads\/2024\/05\/27170019\/HenryHarvin-3.png\" \/>\n\t<meta property=\"og:image:width\" content=\"300\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@henryharvin_in\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/\"},\"author\":{\"name\":\"Desh Deepak\",\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/#\\\/schema\\\/person\\\/8fa17a292f57dd832629a01a4f602c39\"},\"headline\":\"blog\",\"datePublished\":\"2024-09-30T07:32:59+00:00\",\"dateModified\":\"2026-07-16T07:47:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/\"},\"wordCount\":8,\"publisher\":{\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/#\\\/schema\\\/person\\\/a86f96dfdfc6fa224445f6b651967094\"},\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/\",\"url\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/\",\"name\":\"Professional Certification Courses Blogs - Henry Harvin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/#website\"},\"datePublished\":\"2024-09-30T07:32:59+00:00\",\"dateModified\":\"2026-07-16T07:47:10+00:00\",\"description\":\"Henry Harvin blog provides a deep insights of professional certifications courses with best institutes, career trends & fee structures.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"blog\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/\",\"name\":\"Henry Harvin Blog\",\"description\":\"Latest Online Courses &amp; Certification Blogs\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/#\\\/schema\\\/person\\\/a86f96dfdfc6fa224445f6b651967094\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/#\\\/schema\\\/person\\\/a86f96dfdfc6fa224445f6b651967094\",\"name\":\"George L V\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hh-certificates.sgp1.digitaloceanspaces.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/19130846\\\/cropped-Henry-harvin-logo-1.png\",\"url\":\"https:\\\/\\\/hh-certificates.sgp1.digitaloceanspaces.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/19130846\\\/cropped-Henry-harvin-logo-1.png\",\"contentUrl\":\"https:\\\/\\\/hh-certificates.sgp1.digitaloceanspaces.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/19130846\\\/cropped-Henry-harvin-logo-1.png\",\"width\":445,\"height\":130,\"caption\":\"George L V\"},\"logo\":{\"@id\":\"https:\\\/\\\/hh-certificates.sgp1.digitaloceanspaces.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/19130846\\\/cropped-Henry-harvin-logo-1.png\"},\"description\":\"George is an expert communicator. As a coordinator, senior language instructor, center head and a content writer the basic requirement at the DNA level was the same \u2013 effective communication. He discovered early in life that quality of communication makes the difference between great results and mediocre outcomes. And thus, he developed his first forte: focus on the listener and tailor the message accordingly. As he progressed in his career, he realized that the most compelling stories communicate through multi-sensory messaging - a powerful combination of visual, verbal, and intuitive content.\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/#\\\/schema\\\/person\\\/8fa17a292f57dd832629a01a4f602c39\",\"name\":\"Desh Deepak\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hh-certificates.sgp1.digitaloceanspaces.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/10131318\\\/WhatsApp-Image-2026-06-10-at-6.42.48-PM-150x150.jpeg\",\"url\":\"https:\\\/\\\/hh-certificates.sgp1.digitaloceanspaces.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/10131318\\\/WhatsApp-Image-2026-06-10-at-6.42.48-PM-150x150.jpeg\",\"contentUrl\":\"https:\\\/\\\/hh-certificates.sgp1.digitaloceanspaces.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/10131318\\\/WhatsApp-Image-2026-06-10-at-6.42.48-PM-150x150.jpeg\",\"caption\":\"Desh Deepak\"},\"url\":\"https:\\\/\\\/www.henryharvin.com\\\/blog\\\/author\\\/deshdeepakhenryharvin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Professional Certification Courses Blogs - Henry Harvin","description":"Henry Harvin blog provides a deep insights of professional certifications courses with best institutes, career trends & fee structures.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.henryharvin.com\/blog\/","og_locale":"en_US","og_type":"article","og_title":"Professional Certification Courses Blogs - Henry Harvin","og_description":"Henry Harvin blog provides a deep insights of professional certifications courses with best institutes, career trends & fee structures.","og_url":"https:\/\/www.henryharvin.com\/blog\/","og_site_name":"Henry Harvin Blog","article_modified_time":"2026-07-16T07:47:10+00:00","og_image":[{"width":300,"height":300,"url":"https:\/\/hh-certificates.sgp1.digitaloceanspaces.com\/blog\/wp-content\/uploads\/2024\/05\/27170019\/HenryHarvin-3.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@henryharvin_in","twitter_misc":{"Est. reading time":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.henryharvin.com\/blog\/#article","isPartOf":{"@id":"https:\/\/www.henryharvin.com\/blog\/"},"author":{"name":"Desh Deepak","@id":"https:\/\/www.henryharvin.com\/blog\/#\/schema\/person\/8fa17a292f57dd832629a01a4f602c39"},"headline":"blog","datePublished":"2024-09-30T07:32:59+00:00","dateModified":"2026-07-16T07:47:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.henryharvin.com\/blog\/"},"wordCount":8,"publisher":{"@id":"https:\/\/www.henryharvin.com\/blog\/#\/schema\/person\/a86f96dfdfc6fa224445f6b651967094"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.henryharvin.com\/blog\/","url":"https:\/\/www.henryharvin.com\/blog\/","name":"Professional Certification Courses Blogs - Henry Harvin","isPartOf":{"@id":"https:\/\/www.henryharvin.com\/blog\/#website"},"datePublished":"2024-09-30T07:32:59+00:00","dateModified":"2026-07-16T07:47:10+00:00","description":"Henry Harvin blog provides a deep insights of professional certifications courses with best institutes, career trends & fee structures.","breadcrumb":{"@id":"https:\/\/www.henryharvin.com\/blog\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.henryharvin.com\/blog\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.henryharvin.com\/blog\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.henryharvin.com\/blog\/"},{"@type":"ListItem","position":2,"name":"blog"}]},{"@type":"WebSite","@id":"https:\/\/www.henryharvin.com\/blog\/#website","url":"https:\/\/www.henryharvin.com\/blog\/","name":"Henry Harvin Blog","description":"Latest Online Courses &amp; Certification Blogs","publisher":{"@id":"https:\/\/www.henryharvin.com\/blog\/#\/schema\/person\/a86f96dfdfc6fa224445f6b651967094"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.henryharvin.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.henryharvin.com\/blog\/#\/schema\/person\/a86f96dfdfc6fa224445f6b651967094","name":"George L V","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hh-certificates.sgp1.digitaloceanspaces.com\/blog\/wp-content\/uploads\/2025\/01\/19130846\/cropped-Henry-harvin-logo-1.png","url":"https:\/\/hh-certificates.sgp1.digitaloceanspaces.com\/blog\/wp-content\/uploads\/2025\/01\/19130846\/cropped-Henry-harvin-logo-1.png","contentUrl":"https:\/\/hh-certificates.sgp1.digitaloceanspaces.com\/blog\/wp-content\/uploads\/2025\/01\/19130846\/cropped-Henry-harvin-logo-1.png","width":445,"height":130,"caption":"George L V"},"logo":{"@id":"https:\/\/hh-certificates.sgp1.digitaloceanspaces.com\/blog\/wp-content\/uploads\/2025\/01\/19130846\/cropped-Henry-harvin-logo-1.png"},"description":"George is an expert communicator. As a coordinator, senior language instructor, center head and a content writer the basic requirement at the DNA level was the same \u2013 effective communication. He discovered early in life that quality of communication makes the difference between great results and mediocre outcomes. And thus, he developed his first forte: focus on the listener and tailor the message accordingly. As he progressed in his career, he realized that the most compelling stories communicate through multi-sensory messaging - a powerful combination of visual, verbal, and intuitive content."},{"@type":"Person","@id":"https:\/\/www.henryharvin.com\/blog\/#\/schema\/person\/8fa17a292f57dd832629a01a4f602c39","name":"Desh Deepak","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hh-certificates.sgp1.digitaloceanspaces.com\/blog\/wp-content\/uploads\/2026\/06\/10131318\/WhatsApp-Image-2026-06-10-at-6.42.48-PM-150x150.jpeg","url":"https:\/\/hh-certificates.sgp1.digitaloceanspaces.com\/blog\/wp-content\/uploads\/2026\/06\/10131318\/WhatsApp-Image-2026-06-10-at-6.42.48-PM-150x150.jpeg","contentUrl":"https:\/\/hh-certificates.sgp1.digitaloceanspaces.com\/blog\/wp-content\/uploads\/2026\/06\/10131318\/WhatsApp-Image-2026-06-10-at-6.42.48-PM-150x150.jpeg","caption":"Desh Deepak"},"url":"https:\/\/www.henryharvin.com\/blog\/author\/deshdeepakhenryharvin-com\/"}]}},"_links":{"self":[{"href":"https:\/\/www.henryharvin.com\/blog\/wp-json\/wp\/v2\/pages\/220546","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.henryharvin.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.henryharvin.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.henryharvin.com\/blog\/wp-json\/wp\/v2\/users\/1183"}],"replies":[{"embeddable":true,"href":"https:\/\/www.henryharvin.com\/blog\/wp-json\/wp\/v2\/comments?post=220546"}],"version-history":[{"count":190,"href":"https:\/\/www.henryharvin.com\/blog\/wp-json\/wp\/v2\/pages\/220546\/revisions"}],"predecessor-version":[{"id":775633,"href":"https:\/\/www.henryharvin.com\/blog\/wp-json\/wp\/v2\/pages\/220546\/revisions\/775633"}],"wp:attachment":[{"href":"https:\/\/www.henryharvin.com\/blog\/wp-json\/wp\/v2\/media?parent=220546"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}