{"id":1341,"date":"2024-02-26T10:10:21","date_gmt":"2024-02-26T10:10:21","guid":{"rendered":"https:\/\/british.edu.pl\/lowicz\/?page_id=1341"},"modified":"2025-10-20T10:38:44","modified_gmt":"2025-10-20T10:38:44","slug":"blog","status":"publish","type":"page","link":"https:\/\/british.edu.pl\/lowicz\/blog\/","title":{"rendered":"Blog"},"content":{"rendered":"\n    \n    <section class=\"u-clearfix u-section-2\" id=\"sec-a338\">\n      <div class=\"u-clearfix u-sheet u-sheet-1\">\n        <h2 class=\"u-align-left u-text u-text-1\">Blog<\/h2>\n      <\/div>\n    <\/section>\n    <section class=\"u-clearfix u-section-3\" id=\"sec-5417\">\n      <div class=\"u-clearfix u-sheet u-sheet-1\">\n        <div class=\"u-clearfix u-custom-html u-expanded-width u-custom-html-1\"><!-- BLOG \u2013 \u0141owicz | Featured + All posts grid (REST + RSS fallback) + WYBIELENIE D\u00d3\u0141 20% + HOVER + WY\u017bSZE MINIATURY + DATA WHITE -->\n          <div id=\"blog-widget\"><\/div>\n          <script> (function(){\n  const SITE = \"https:\/\/british.edu.pl\/lowicz\";  \n  const MAX_POSTS = 100;\n  const BTN_TEXT = \"czytaj wi\u0119cej\";\n  const DATE_LOCALE = \"pl-PL\";\n  const PLACEHOLDER = SITE + \"\/wp-content\/uploads\/placeholder.jpg\";\n  const API_REST = `${SITE}\/wp-json\/wp\/v2\/posts?per_page=${MAX_POSTS}&_embed`;\n  const API_RSS  = `${SITE}\/feed\/`;\n  const el = document.getElementById(\"blog-widget\");\n  const styles = `\n  <style>\n  :root{--brand:#0a75c6;--brand-ink:#fff;--ink:#0e1726;--muted:#6b7280;--card:#fff;--ring:rgba(10,117,198,.14);--radius:18px}\n  #blog-widget{font-family:system-ui,-apple-system,Segoe UI,Roboto,Inter,Arial,sans-serif;color:var(--ink)}\n  .blog-wrap{max-width:1140px;margin:0 auto;padding:18px;box-sizing:border-box}\n  \/* FEATURED *\/\n  .featured{background:var(--brand);color:var(--brand-ink);border-radius:var(--radius);padding:24px;display:grid;gap:16px;overflow:hidden}\n  @media(min-width:900px){.featured{grid-template-columns:1.1fr .9fr;align-items:stretch}}\n  .featured .meta{color:var(--brand-ink)!important;opacity:.9;font-size:13px}\n  .featured h2{margin:6px 0 8px;font-size:32px;line-height:1.15}\n  @media(max-width:520px){.featured h2{font-size:24px}}\n  .featured p{margin:0 8px 8px 0;opacity:.95}\n  .featured .btn{display:inline-flex;gap:8px;align-items:center;background:#fff;color:#0a75c6;border-radius:999px;padding:10px 14px;text-decoration:none;font-weight:600;border:1px solid #fff;transition:transform .18s ease, box-shadow .18s ease}\n  .featured .btn:hover{transform:translateY(-1px);box-shadow:0 6px 18px rgba(0,0,0,.18)}\n  .featured .img{border-radius:14px;overflow:hidden;position:relative;min-height:220px;background:#0f1c2a10}\n  .featured .img img{width:100%;height:100%;object-fit:cover;display:block}\n  \/* GRID *\/\n  .cards{display:grid;gap:18px;margin-top:18px}\n  @media(min-width:900px){.cards{grid-template-columns:repeat(3,1fr)}}\n  .card{background:var(--card);border-radius:var(--radius);overflow:hidden;box-shadow:0 2px 10px var(--ring);display:flex;flex-direction:column;min-height:100%}\n  \/* MINIATURY \u2013 wy\u017csze *\/\n  .thumb{\n    position:relative;\n    aspect-ratio:16\/12; \/* wy\u017csze miniatury *\/\n    overflow:hidden;\n    background:#eef3f8;\n  }\n  .thumb img{width:100%;height:100%;object-fit:cover;display:block;transform:scale(1.02)}\n  \/* WYBIELENIE tylko w dolnych ~20% zdj\u0119cia *\/\n  .thumb:after{\n    content:\"\";\n    position:absolute;\n    left:0;right:0;bottom:0;\n    height:20%; \/* tylko dolna cz\u0119\u015b\u0107 *\/\n    pointer-events:none;\n    background:linear-gradient(\n      to top,\n      rgba(255,255,255,1.0) 0%,   \/* pe\u0142na biel na dole *\/\n      rgba(255,255,255,0.0) 100%  \/* pe\u0142na widoczno\u015b\u0107 na g\u00f3rze gradientu *\/\n    );\n    opacity:1;\n    transition:opacity .35s ease-in-out;\n  }\n  \/* Hover \u2013 poka\u017c zdj\u0119cie w pe\u0142ni *\/\n  .thumb:hover:after{opacity:0}\n  .body{padding:14px 14px 16px}\n  .meta{color:var(--muted);font-size:12px}\n  .card h3{margin:6px 0 8px;font-size:18px;line-height:1.25}\n  .card p{margin:0 0 12px;color:#374151}\n  .link{color:var(--brand);text-decoration:none;font-weight:600;display:inline-flex;gap:6px;align-items:center}\n  a.reset{all:unset}\n  .error{max-width:1140px;margin:0 auto;padding:18px;color:#b91c1c;background:#fee2e2;border-radius:12px}\n  <\/style>`;\n  const fmtDate = iso => new Date(iso).toLocaleDateString(DATE_LOCALE,{day:\"2-digit\",month:\"2-digit\",year:\"numeric\"});\n  const plain = html => { const t=document.createElement(\"div\"); t.innerHTML=html; return t.textContent||t.innerText||\"\"; };\n  const shorten = (txt,n=160) => txt && txt.length>n ? txt.slice(0,n).trim()+\"\u2026\" : (txt||\"\");\n  const firstImgFromHTML = html => { try{ const m=(html||\"\").match(\/<img[^>]+src=[\"']([^\"']+)[\"']\/i); return m?m[1]:null; }catch(e){ return null; } };\n  const normalizeFromREST = (arr) => arr.map(p => ({\n    id: p.id,\n    title: p.title?.rendered || \"\",\n    link: p.link,\n    date: p.date,\n    excerpt: plain(p.excerpt?.rendered || \"\"),\n    image: (p._embedded?.[\"wp:featuredmedia\"]?.[0]?.media_details?.sizes?.medium_large?.source_url)\n        || (p._embedded?.[\"wp:featuredmedia\"]?.[0]?.source_url)\n        || firstImgFromHTML(p.content?.rendered)\n        || PLACEHOLDER\n  }));\n  const normalizeFromRSS = (xml) => {\n    const items = [...xml.querySelectorAll(\"item\")].slice(0, MAX_POSTS);\n    return items.map(it => {\n      const title = it.querySelector(\"title\")?.textContent || \"\";\n      const link  = it.querySelector(\"link\")?.textContent || \"#\";\n      const date  = it.querySelector(\"pubDate\")?.textContent || new Date().toISOString();\n      const desc  = it.querySelector(\"description\")?.textContent || \"\";\n      const content = it.querySelector(\"content\\\\:encoded, encoded\")?.textContent || desc;\n      const media = it.querySelector(\"media\\\\:content, content\");\n      const mediaUrl = media?.getAttribute(\"url\");\n      const img = mediaUrl || firstImgFromHTML(content) || PLACEHOLDER;\n      return {\n        id: link, title, link,\n        date: new Date(date).toISOString(),\n        excerpt: plain(content).replace(\/\\s+\/g,\" \").trim(),\n        image: img\n      };\n    });\n  };\n  const render = (posts) => {\n    const [first, ...rest] = posts;\n    const feat = `\n      <section class=\"featured\">\n        <div class=\"txt\">\n          <div class=\"meta\">${fmtDate(first.date)}<\/div>\n          <h2><a class=\"reset\" href=\"${first.link}\" aria-label=\"${plain(first.title)}\">${first.title}<\/a><\/h2>\n          <p>${shorten(first.excerpt, 190)}<\/p>\n          <a class=\"btn\" href=\"${first.link}\">${BTN_TEXT} <span aria-hidden>&#x2197;<\/span><\/a>\n        <\/div>\n        <a class=\"img\" href=\"${first.link}\" aria-label=\"${plain(first.title)}\">\n          <img decoding=\"async\" src=\"${first.image}\" alt=\"\">\n        <\/a>\n      <\/section>`;\n    const cards = rest.map(p => `\n      <article class=\"card\">\n        <a class=\"thumb\" href=\"${p.link}\" aria-label=\"${plain(p.title)}\">\n          <img decoding=\"async\" src=\"${p.image}\" alt=\"\">\n        <\/a>\n        <div class=\"body\">\n          <div class=\"meta\">${fmtDate(p.date)}<\/div>\n          <h3><a class=\"reset\" href=\"${p.link}\">${p.title}<\/a><\/h3>\n          <p>${shorten(p.excerpt, 120)}<\/p>\n          <a class=\"link\" href=\"${p.link}\">${BTN_TEXT} \u2192<\/a>\n        <\/div>\n      <\/article>\n    `).join(\"\");\n    return `${styles}\n      <div class=\"blog-wrap\">\n        ${feat}\n        <section class=\"cards\">${cards}<\/section>\n      <\/div>`;\n  };\n  const showError = (msg) => { el.innerHTML = `${styles}<div class=\"error\"><strong>B\u0142\u0105d:<\/strong> ${msg}<\/div>`; };\n  document.addEventListener(\"DOMContentLoaded\", async () => {\n    try{\n      el.innerHTML = `${styles}<div class=\"blog-wrap\"><p>\u0141adowanie wpis\u00f3w\u2026<\/p><\/div>`;\n      let posts = [];\n      try{\n        const r = await fetch(API_REST, {mode:\"cors\", credentials:\"omit\"});\n        if(r.ok){\n          const json = await r.json();\n          if(Array.isArray(json) && json.length){ posts = normalizeFromREST(json); }\n        }\n      }catch(_e){}\n      if(!posts.length){\n        const r2 = await fetch(API_RSS, {mode:\"cors\", credentials:\"omit\"});\n        if(!r2.ok) throw new Error(`REST i RSS nieosi\u0105galne (HTTP ${r2.status}).`);\n        const txt = await r2.text();\n        const xml = new window.DOMParser().parseFromString(txt, \"text\/xml\");\n        const rssPosts = normalizeFromRSS(xml);\n        if(!rssPosts.length) throw new Error(\"Brak wpis\u00f3w do wy\u015bwietlenia.\");\n        posts = rssPosts;\n      }\n      posts.sort((a,b)=> new Date(b.date) - new Date(a.date));\n      el.innerHTML = render(posts);\n    }catch(err){\n      showError(err.message);\n      console.error(\"BLOG widget error:\", err);\n    }\n  });\n})(); <\/script>\n        <\/div>\n      <\/div>\n    <\/section>\n    \n    \n    \n  \n","protected":false},"excerpt":{"rendered":"<p>Blog<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"_links":{"self":[{"href":"https:\/\/british.edu.pl\/lowicz\/wp-json\/wp\/v2\/pages\/1341"}],"collection":[{"href":"https:\/\/british.edu.pl\/lowicz\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/british.edu.pl\/lowicz\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/british.edu.pl\/lowicz\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/british.edu.pl\/lowicz\/wp-json\/wp\/v2\/comments?post=1341"}],"version-history":[{"count":6,"href":"https:\/\/british.edu.pl\/lowicz\/wp-json\/wp\/v2\/pages\/1341\/revisions"}],"predecessor-version":[{"id":1517,"href":"https:\/\/british.edu.pl\/lowicz\/wp-json\/wp\/v2\/pages\/1341\/revisions\/1517"}],"wp:attachment":[{"href":"https:\/\/british.edu.pl\/lowicz\/wp-json\/wp\/v2\/media?parent=1341"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}