Publishing…
Preparing files…
'; } function generateListingHtml(posts, depthPrefix) { var px = depthPrefix||'../'; var years = [...new Set(posts.map(function(p){return p.year;}))] .sort().reverse() .map(function(y){return '';}).join(''); var cats = ['Contract Award','New Client','Upgrade','Installation','Milestone','News']; var pills = cats.map(function(c){ return ''; }).join(''); // featured = first (newest) var feat = posts[0]; var fcm = catMeta(feat.cat); var featHtml = ''; var cards = posts.slice(1).map(function(p) { var cm = catMeta(p.cat); return '' + '
' + '
' + ''+p.cat+'' + ''+p.date_display+'
' + '

'+p.title+'

' + '

'+p.excerpt+'

' + 'Read Article →
'; }).join(''); var filterJs = 'var aC="",aY="",sV="";'+ 'function aF(){var c=document.querySelectorAll("#bG .blog-card"),n=0;'+ 'c.forEach(function(x){var ok=(!aC||x.dataset.cat===aC)&&(!aY||x.dataset.year===aY)&&(!sV||x.dataset.title.includes(sV.toLowerCase()));x.style.display=ok?"":"none";if(ok)n++;});'+ 'document.getElementById("rC").textContent=n+(n===1?" article":" articles");'+ 'document.getElementById("nR").style.display=n===0?"block":"none";'+ 'document.getElementById("cB").style.display=(aC||aY||sV)?"inline":"none";}'+ 'function clearAll(){aC="";aY="";sV="";document.getElementById("sI").value="";document.getElementById("yS").value="";document.querySelectorAll(".filter-pill").forEach(function(p){p.classList.remove("active");});aF();}'+ 'document.querySelectorAll(".filter-pill").forEach(function(b){b.addEventListener("click",function(){aC=aC===b.dataset.cat?"":b.dataset.cat;document.querySelectorAll(".filter-pill").forEach(function(p){p.classList.remove("active");});if(aC)b.classList.add("active");aF();});});'+ 'document.getElementById("yS").addEventListener("change",function(){aY=this.value;aF();});'+ 'var st;document.getElementById("sI").addEventListener("input",function(){clearTimeout(st);var v=this.value;st=setTimeout(function(){sV=v;aF();},220);});'+ 'document.getElementById("cB").addEventListener("click",clearAll);'+ 'document.querySelector(".blog-featured").addEventListener("keydown",function(e){if(e.key==="Enter"||e.key===" "){e.preventDefault();window.location=this.querySelector("a").href;}});'; return '' + '' + 'Blog | Total Parking Solutions' + '' + '' + '' + '' + '' + '
' + '
Total Parking Solutions
' + '

News & Updates

' + '

Installations, upgrades, new clients, and milestones — 20 years of parking innovation across Chicagoland and beyond.

' + '
' + '
'+featHtml+'
' + '
' + '' + '|' + '' + '|'+pills+ '
' + '
' + '
'+(posts.length-1)+' articles
' + '
'+cards+'
' + '

No articles match.

' + '
' + '' + '