Google blogger post new theme Gadget
Google blogger post new theme Gadget
Use it as new gadget and get new looks on webpage without an error.
<b:widget id='HTML15' type='HTML' version='2' locked='false' title='Latest Articles'>
<b:widget-settings>
<b:widget-setting name='content'>
<div class="rp-heading">
<h2>Latest Articles</h2>
<p>Explore our latest posts and updates</p>
</div>
<div id="rp-container">Loading posts...</div>
<div id="rp-pagination"></div>
</b:widget-setting>
</b:widget-settings>
<b:includable id='main'>
<div class='widget-content'>
<style>
#recent-posts-box {width:100%;max-width:1200px;margin:25px auto;font-family:Arial,sans-serif;box-sizing:border-box}
#recent-posts-box * {box-sizing:border-box}
.rp-heading {text-align:center;margin-bottom:25px}
.rp-heading h2 {font-size:27px;color:#202124;margin:0 0 8px}
.rp-heading p {color:#777;font-size:14px}
#rp-container {display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px}
.rp-card {display:flex;flex-direction:column;text-decoration:none!important;color:inherit!important;background:#fff;border:1px solid #eaeaea;border-radius:14px;overflow:hidden;box-shadow:0 4px 15px rgba(0,0,0,.06);transition:.25s;cursor:pointer}
.rp-card:hover {transform:translateY(-5px);box-shadow:0 9px 25px rgba(0,0,0,.12)}
.rp-image {width:100%;height:205px;object-fit:cover;display:block;background:#f0f0f0}
.rp-content {padding:18px;display:flex;flex-direction:column;flex:1}
.rp-date {font-size:12px;color:#888;margin-bottom:10px}
.rp-title {color:#222;font-size:18px;line-height:1.45;font-weight:700;margin:0 0 10px}
.rp-description {color:#666;font-size:14px;line-height:1.65;margin:0}
#rp-pagination {display:flex;justify-content:center;align-items:center;flex-wrap:wrap;gap:8px;margin:35px 0}
.rp-page {min-width:42px;height:42px;padding:0 12px;border:1px solid #e5e7eb;border-radius:9px;background:#fff;color:#333;font-size:14px;font-weight:700;cursor:pointer}
.rp-page:hover {background:#eef2ff;color:#4f46e5}
.rp-page.active {background:linear-gradient(135deg,#2563eb,#7c3aed);color:#fff;border-color:transparent}
.rp-page:disabled {opacity:.4;cursor:not-allowed}
.rp-loading,.rp-error {text-align:center;padding:30px;color:#777;grid-column:1/-1}
@media(max-width:900px) {#rp-container {grid-template-columns:repeat(2,minmax(0,1fr));gap:15px}}
@media(max-width:600px) {#rp-container {grid-template-columns:1fr}.rp-image {height:220px}.rp-heading h2 {font-size:23px}.rp-page {min-width:36px;height:38px;padding:0 9px}}
</style>
<script type='text/javascript'>
//<![CDATA[
(function() {
var container = document.getElementById("rp-container");
var pagination = document.getElementById("rp-pagination");
if (!container || !pagination) return;
var currentPage = 1;
var perPage = 9;
var totalPages = 1;
var loading = false;
function esc(s) {
return String(s || "").replace(/[&<>"']/g,function(c) {
return {"&":"&","<":"<",">":">",'"':""","'":"'"}[c];
});
}
function plain(s) {
var d = document.createElement("div");
d.innerHTML = s || "";
return (d.textContent || "").replace(/\s+/g," ").trim();
}
function imageOf(p) {
if (p.media$thumbnail) {
return p.media$thumbnail.url.replace(/\/s72-c\//,"/s600/");
}
var html = p.content ? p.content.$t : "";
var m = html.match(/<img[^>]+src=["']([^"']+)["']/i);
return m ? m[1] : "";
}
function urlOf(p) {
var links = p.link || [];
for (var i=0;i<links.length;i++) {
if (links[i].rel === "alternate") return links[i].href;
}
return "#";
}
function card(p) {
var title = p.title ? p.title.$t : "Untitled";
var html = p.content ? p.content.$t : (p.summary ? p.summary.$t : "");
var desc = plain(html).substring(0,140);
if (plain(html).length > 140) desc += "...";
var date = p.published ? new Date(p.published.$t).toLocaleDateString() : "";
var img = imageOf(p);
var a = document.createElement("a");
a.className = "rp-card";
a.href = urlOf(p);
a.innerHTML =
(img ? '<img class="rp-image" src="' + esc(img) + '" alt="' + esc(title) + '" loading="lazy"/>' : '<div class="rp-image"></div>') +
'<div class="rp-content"><div class="rp-date">' + esc(date) + '</div>' +
'<h3 class="rp-title">' + esc(title) + '</h3>' +
'<p class="rp-description">' + esc(desc) + '</p></div>';
container.appendChild(a);
}
function button(label,page,active,disabled) {
var b = document.createElement("button");
b.type = "button";
b.className = "rp-page" + (active ? " active" : "");
b.textContent = label;
b.disabled = disabled;
b.addEventListener("click",function() {
if (!disabled) load(page,true);
});
pagination.appendChild(b);
}
function renderPages() {
pagination.innerHTML = "";
if (totalPages <= 1) return;
button("\u00AB",currentPage-1,false,currentPage===1);
var start = Math.max(1,currentPage-2);
var end = Math.min(totalPages,currentPage+2);
if (start > 1) {
button("1",1,currentPage===1,false);
if (start > 2) pagination.appendChild(document.createTextNode("..."));
}
for (var i=start;i<=end;i++) {
button(String(i),i,currentPage===i,false);
}
if (end < totalPages) {
if (end < totalPages-1) pagination.appendChild(document.createTextNode("..."));
button(String(totalPages),totalPages,currentPage===totalPages,false);
}
button("\u00BB",currentPage+1,false,currentPage===totalPages);
}
function load(page,scroll) {
if (loading || page < 1) return;
loading = true;
container.innerHTML = '<div class="rp-loading">Loading posts...</div>';
var start = (page-1)*perPage+1;
var feedURL = window.location.origin +
"/feeds/posts/default?alt=json&start-index=" +
start + "&max-results=" + perPage;
fetch(feedURL)
.then(function(r) {
if (!r.ok) throw new Error("Feed error");
return r.json();
})
.then(function(data) {
var feed = data.feed;
var posts = feed.entry || [];
var total = parseInt(feed.openSearch$totalResults.$t,10) || 0;
totalPages = Math.ceil(total/perPage);
currentPage = page;
container.innerHTML = "";
posts.forEach(card);
renderPages();
if (!posts.length) {
container.innerHTML = '<div class="rp-error">No posts found.</div>';
pagination.innerHTML = "";
}
if (scroll) {
var section = document.getElementById("recent-posts-box");
var top = section.getBoundingClientRect().top + window.pageYOffset - 90;
window.scrollTo({top:top,behavior:"smooth"});
}
})
.catch(function() {
container.innerHTML = '<div class="rp-error">Unable to load posts. Check your Blogger feed settings.</div>';
})
.finally(function() {
loading = false;
});
}
window.addEventListener("popstate",function() {
var page = parseInt(new URLSearchParams(location.search).get("rp-page"),10) || 1;
load(page,false);
});
var initial = parseInt(new URLSearchParams(location.search).get("rp-page"),10) || 1;
load(initial,false);
})();
//]]>
</script>
</div>
</b:includable>
</b:widget>
Comments
Post a Comment
Thanks for your Comments.