/* embeddedTR — blog ortak bileşenleri (liste + yazı sayfası paylaşır) */ const { useState: useStateB, useEffect: useEffectB } = React; /* tarih → Türkçe okunur biçim */ const TR_AY = ["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"]; function fmtDate(iso) { const d = new Date(iso + "T00:00:00"); if (isNaN(d)) return iso; return d.getDate() + " " + TR_AY[d.getMonth()] + " " + d.getFullYear(); } const CAT_ICON = { "Protokoller": "share", "Tarih": "book", "Linux": "terminal", "Donanım": "chip" }; /* ─── kapak: görsel varsa onu, yoksa şık yer tutucu çiz ─── */ function Cover({ post, showCat = true }) { const [err, setErr] = useStateB(false); // Görsel henüz yoksa/yüklenmezse yer tutucuya düş: onError + boş yükleme + // zaman aşımı (önizleme proxy'si 404 yerine isteği asabiliyor). const imgRef = React.useRef(null); useEffectB(() => { if (!post.cover || err) return; const el = imgRef.current; if (el && el.complete && el.naturalWidth === 0) { setErr(true); return; } const to = setTimeout(() => { const n = imgRef.current; if (!n || !n.complete || n.naturalWidth === 0) setErr(true); }, 2500); return () => clearTimeout(to); }, [post.cover, err]); const Cat = showCat && {post.category}; if (err || !post.cover) { const I = Icons[CAT_ICON[post.category] || "article"]; return (
{Cat}
); } return (
{post.title} setErr(true)} onLoad={(e) => { if (e.target.naturalWidth === 0) setErr(true); }} /> {Cat}
); } /* ─── nav (blog sayfaları için; linkler ana sayfaya döner) ─── */ function BlogNav({ theme, toggleTheme }) { const [scrolled, setScrolled] = useStateB(false); const [open, setOpen] = useStateB(false); useEffectB(() => { const f = () => setScrolled(window.scrollY > 12); f(); window.addEventListener("scroll", f, { passive: true }); return () => window.removeEventListener("scroll", f); }, []); const here = location.pathname.split("/").pop(); const links = [ ["Projeler", "index.html#projeler"], ["Blog", "blog.html"], ["Soru-Cevap", "index.html#soru-cevap"], ["Kütüphaneler", "index.html#kutuphaneler"], ["Topluluk", "index.html#topluluk"], ]; return (
embeddedTR
Giriş Yap Topluluğa Katıl
{open && (
setOpen(false)}>
e.stopPropagation()}>
embeddedTR
{links.map(([t, h]) => setOpen(false)} className="sheet__link">{t})}
)}
); } /* ─── footer (linkler ana sayfaya) ─── */ function BlogFooter() { const cols = [ ["Topluluk", [["Projeler","index.html#projeler"],["Blog","blog.html"],["Soru-Cevap","index.html#soru-cevap"],["Kütüphaneler","index.html#kutuphaneler"]]], ["Platformlar", [["STM32","blog.html"],["ESP32","blog.html"],["TMS320F","blog.html"],["Nuvoton","blog.html"]]], ["Kaynaklar", [["Başlangıç rehberi","blog.html"],["Katkı kuralları","blog.html"],["Etiketler","blog.html"],["SSS","blog.html"]]], ]; return ( ); } Object.assign(window, { fmtDate, Cover, BlogNav, BlogFooter });