{"id":2489,"date":"2026-04-12T12:02:26","date_gmt":"2026-04-12T09:02:26","guid":{"rendered":"https:\/\/www.kaksik.ee\/?page_id=2489"},"modified":"2026-06-11T12:02:45","modified_gmt":"2026-06-11T09:02:45","slug":"blogi","status":"publish","type":"page","link":"https:\/\/kaksik.ee\/en\/blogi\/","title":{"rendered":"Blogi"},"content":{"rendered":"<div class=\"brz brz-root__container brz-reset-all brz-root__container-page\">\n<section id=\"fVA6U5mbGrJV_fVA6U5mbGrJV\" class=\"brz-section brz-css-d-section brz-css-dbafxc\">\n<div class=\"brz-section__content brz-section--boxed brz-css-d-sectionitem-bg brz-css-1mawg1s\" data-brz-custom-id=\"smmuaOhp2jj_\">\n<div class=\"brz-container brz-css-d-sectionitem-container brz-css-1780kc\">\n<div id=\"\" class=\"brz-css-d-wrapper brz-css-1nlbwqx brz-wrapper\">\n<div class=\"brz-embed-code brz-css-d-embedcode brz-css-864qrg\" data-brz-custom-id=\"iJcXjaGGujsc\">\n<div class=\"brz-embed-content\">\n<div>\n<div id=\"kk-blog-wrap\">\n<div id=\"kk-blog-grid\" class=\"kk-blog-grid\">\n<div class=\"kk-blog-loading\">Laen postitusi&#8230;<\/div>\n<\/p><\/div>\n<\/div>\n<p>#kk-blog-wrap {<br \/>\n  max-width: 1100px;<br \/>\n  margin: 40px auto;<br \/>\n  padding: 0 20px;<br \/>\n  font-family: &#8216;DM Sans&#8217;, system-ui, sans-serif;<br \/>\n  box-sizing: border-box;<br \/>\n}<br \/>\n.kk-blog-grid {<br \/>\n  display: grid;<br \/>\n  grid-template-columns: repeat(3, 1fr);<br \/>\n  gap: 28px;<br \/>\n}<br \/>\n.kk-blog-loading {<br \/>\n  grid-column: 1 \/ -1;<br \/>\n  text-align: center;<br \/>\n  padding: 60px 20px;<br \/>\n  color: #888;<br \/>\n  font-size: 14px;<br \/>\n}<br \/>\n.kk-blog-card {<br \/>\n  background: #fff;<br \/>\n  border: 1.5px solid #f0f0f0;<br \/>\n  border-top: 3px solid #C63160;<br \/>\n  border-radius: 8px;<br \/>\n  overflow: hidden;<br \/>\n  display: flex;<br \/>\n  flex-direction: column;<br \/>\n  transition: border-color .25s, box-shadow .25s, transform .25s;<br \/>\n  text-decoration: none;<br \/>\n  color: inherit;<br \/>\n}<br \/>\n.kk-blog-card:hover {<br \/>\n  border-color: #C63160;<br \/>\n  box-shadow: 0 6px 24px rgba(198,49,96,0.10);<br \/>\n  transform: translateY(-3px);<br \/>\n}<br \/>\n.kk-blog-card:hover .kk-blog-title { color: #C63160; }<br \/>\n.kk-blog-card:hover .kk-blog-btn {<br \/>\n  background: #C63160;<br \/>\n  color: #fff;<br \/>\n}<br \/>\n.kk-blog-img-wrap {<br \/>\n  width: 100%;<br \/>\n  aspect-ratio: 16 \/ 10;<br \/>\n  overflow: hidden;<br \/>\n  background: #faf8f6;<br \/>\n}<br \/>\n.kk-blog-img-wrap img {<br \/>\n  width: 100%;<br \/>\n  height: 100%;<br \/>\n  object-fit: cover;<br \/>\n  display: block;<br \/>\n  transition: transform .4s ease;<br \/>\n}<br \/>\n.kk-blog-card:hover .kk-blog-img-wrap img { transform: scale(1.05); }<br \/>\n.kk-blog-img-placeholder {<br \/>\n  width: 100%;<br \/>\n  height: 100%;<br \/>\n  background: linear-gradient(135deg, #faf8f6 0%, #F9E0E8 100%);<br \/>\n  display: flex;<br \/>\n  align-items: center;<br \/>\n  justify-content: center;<br \/>\n  color: #C63160;<br \/>\n  font-family: &#8216;DM Serif Display&#8217;, serif;<br \/>\n  font-size: 32px;<br \/>\n  font-style: italic;<br \/>\n  opacity: 0.5;<br \/>\n}<br \/>\n.kk-blog-body {<br \/>\n  padding: 22px 22px 24px;<br \/>\n  display: flex;<br \/>\n  flex-direction: column;<br \/>\n  flex: 1;<br \/>\n}<br \/>\n.kk-blog-date {<br \/>\n  font-size: 11px;<br \/>\n  font-weight: 700;<br \/>\n  letter-spacing: 0.12em;<br \/>\n  text-transform: uppercase;<br \/>\n  color: #C63160;<br \/>\n  margin-bottom: 10px;<br \/>\n}<br \/>\n.kk-blog-title {<br \/>\n  font-family: &#8216;DM Serif Display&#8217;, serif;<br \/>\n  font-size: 22px;<br \/>\n  line-height: 1.25;<br \/>\n  color: #081b76;<br \/>\n  margin: 0 0 12px;<br \/>\n  transition: color .2s;<br \/>\n}<br \/>\n.kk-blog-excerpt {<br \/>\n  font-size: 14px;<br \/>\n  line-height: 1.6;<br \/>\n  color: #666;<br \/>\n  margin: 0 0 18px;<br \/>\n  flex: 1;<br \/>\n}<br \/>\n.kk-blog-btn {<br \/>\n  display: inline-flex;<br \/>\n  align-items: center;<br \/>\n  gap: 6px;<br \/>\n  align-self: flex-start;<br \/>\n  padding: 9px 18px;<br \/>\n  border: 1.5px solid #C63160;<br \/>\n  border-radius: 8px;<br \/>\n  background: #fff;<br \/>\n  color: #C63160;<br \/>\n  font-family: &#8216;DM Sans&#8217;, sans-serif;<br \/>\n  font-size: 13px;<br \/>\n  font-weight: 600;<br \/>\n  letter-spacing: 0.03em;<br \/>\n  text-decoration: none;<br \/>\n  transition: background .2s, color .2s, transform .15s;<br \/>\n}<br \/>\n.kk-blog-btn .arrow { transition: transform .2s; }<br \/>\n.kk-blog-card:hover .kk-blog-btn .arrow { transform: translateX(3px); }<br \/>\n.kk-blog-error {<br \/>\n  grid-column: 1 \/ -1;<br \/>\n  text-align: center;<br \/>\n  padding: 40px 20px;<br \/>\n  color: #c0254f;<br \/>\n  font-size: 14px;<br \/>\n}<br \/>\n@media (max-width: 900px) {<br \/>\n  .kk-blog-grid { grid-template-columns: repeat(2, 1fr); gap: 22px; }<br \/>\n  .kk-blog-title { font-size: 20px; }<br \/>\n}<br \/>\n@media (max-width: 600px) {<br \/>\n  .kk-blog-grid { grid-template-columns: 1fr; gap: 20px; }<br \/>\n  #kk-blog-wrap { margin: 24px auto; padding: 0 16px; }<br \/>\n}<\/p>\n<p>(function () {<br \/>\n  \/\/ \u2500\u2500 CONFIG \u2500\u2500<br \/>\n  const POSTS_PER_PAGE = 6;<br \/>\n  const EXCERPT_WORDS  = 18;<br \/>\n  const CATEGORY_ID    = null; \/\/ set to a category ID (number) to filter, or null for all<\/p>\n<p>  \/\/ \u2500\u2500 LANG DETECTION \u2500\u2500<br \/>\n  const LANG = window.location.pathname.startsWith(&#8216;\/en\/&#8217;) ? &#8216;en&#8217; : &#8216;et&#8217;;<br \/>\n  const T = {<br \/>\n    et: { read: &#8216;Loe edasi&#8217;, loading: &#8216;Laen postitusi&#8230;&#8217;, error: &#8216;Postituste laadimine eba\u00f5nnestus.&#8217;, empty: &#8216;Postitusi ei leitud.&#8217; },<br \/>\n    en: { read: &#8216;Read more&#8217;, loading: &#8216;Loading posts&#8230;&#8217;,  error: &#8216;Failed to load posts.&#8217;,              empty: &#8216;No posts found.&#8217; }<br \/>\n  }[LANG];<\/p>\n<p>  const months = {<br \/>\n    et: [&#8216;jaanuar&#8217;,&#8217;veebruar&#8217;,&#8217;m\u00e4rts&#8217;,&#8217;aprill&#8217;,&#8217;mai&#8217;,&#8217;juuni&#8217;,&#8217;juuli&#8217;,&#8217;august&#8217;,&#8217;september&#8217;,&#8217;oktoober&#8217;,&#8217;november&#8217;,&#8217;detsember&#8217;],<br \/>\n    en: [&#8216;January&#8217;,&#8217;February&#8217;,&#8217;March&#8217;,&#8217;April&#8217;,&#8217;May&#8217;,&#8217;June&#8217;,&#8217;July&#8217;,&#8217;August&#8217;,&#8217;September&#8217;,&#8217;October&#8217;,&#8217;November&#8217;,&#8217;December&#8217;]<br \/>\n  }[LANG];<\/p>\n<p>  function formatDate(iso) {<br \/>\n    const d = new Date(iso);<br \/>\n    return `${d.getDate()}. ${months[d.getMonth()]} ${d.getFullYear()}`;<br \/>\n  }<\/p>\n<p>  function stripHtml(html) {<br \/>\n    const tmp = document.createElement(&#8217;div&#8217;);<br \/>\n    tmp.innerHTML = html;<br \/>\n    return (tmp.textContent || tmp.innerText || &#8221;).replace(\/s+\/g, &#8216; &#8216;).trim();<br \/>\n  }<\/p>\n<p>  function truncate(text, words) {<br \/>\n    const arr = text.split(&#8216; &#8216;);<br \/>\n    if (arr.length &lt;= words) return text;<br \/>\n    return arr.slice(0, words).join(&#039; &#039;) + &#039;\u2026&#039;;<br \/>\n  }<\/p>\n<p>  function escapeHtml(s) {<br \/>\n    return s.replace(\/[&amp;&#8221;&#8216;]\/g, c =&gt; ({&#8216;&amp;&#8217;:&#8217;&amp;&#8217;,&#8221;:&#8217;&gt;&#8217;,'&#8221;&#8216;:&#8217;&quot;&#8217;,&#8221;&#8216;&#8221;:&#8217;&#039;&#8217;}[c]));<br \/>\n  }<\/p>\n<p>  \/\/ \u2500\u2500 FETCH \u2500\u2500<br \/>\n  let url = `${window.location.origin}\/wp-json\/wp\/v2\/posts?per_page=${POSTS_PER_PAGE}&amp;_embed=wp:featuredmedia`;<br \/>\n  if (CATEGORY_ID) url += `&amp;categories=${CATEGORY_ID}`;<\/p>\n<p>  const grid = document.getElementById(&#8216;kk-blog-grid&#8217;);<\/p>\n<p>  fetch(url)<br \/>\n    .then(r =&gt; {<br \/>\n      if (!r.ok) throw new Error(&#8216;HTTP &#8216; + r.status);<br \/>\n      return r.json();<br \/>\n    })<br \/>\n    .then(posts =&gt; {<br \/>\n      if (!posts.length) {<br \/>\n        grid.innerHTML = `<\/p>\n<div class=\"kk-blog-error\">${T.empty}<\/div>\n<p>`;<br \/>\n        return;<br \/>\n      }<\/p>\n<p>      grid.innerHTML = posts.map(p =&gt; {<br \/>\n        const title    = stripHtml(p.title.rendered);<br \/>\n        const excerpt  = truncate(stripHtml(p.excerpt.rendered), EXCERPT_WORDS);<br \/>\n        const date     = formatDate(p.date);<br \/>\n        const link     = p.link;<br \/>\n        const media    = p._embedded &amp;&amp; p._embedded[&#8216;wp:featuredmedia&#8217;] &amp;&amp; p._embedded[&#8216;wp:featuredmedia&#8217;][0];<br \/>\n        const imgUrl   = media &amp;&amp; (media.media_details?.sizes?.medium_large?.source_url || media.source_url);<br \/>\n        const imgAlt   = media &amp;&amp; media.alt_text ? media.alt_text : title;<\/p>\n<p>        const imgBlock = imgUrl<br \/>\n          ? `<\/p>\n<div class=\"kk-blog-img-wrap\"><img decoding=\"async\" src=\"${escapeHtml(imgUrl)}\" alt=\"${escapeHtml(imgAlt)}\" loading=\"lazy\"><\/div>\n<p>`<br \/>\n          : `<\/p>\n<div class=\"kk-blog-img-wrap\">\n<div class=\"kk-blog-img-placeholder\">Kaksik<\/div>\n<\/div>\n<p>`;<\/p>\n<p>        return `<br \/>\n          <a class=\"kk-blog-card\" href=\"${escapeHtml(link)}\"><br \/>\n            ${imgBlock}<\/p>\n<div class=\"kk-blog-body\">\n<h3 class=\"kk-blog-title\">${escapeHtml(title)}<\/h3>\n<p class=\"kk-blog-excerpt\">${escapeHtml(excerpt)}<\/p>\n<p>              <span class=\"kk-blog-btn\">${T.read} <span class=\"arrow\">\u2192<\/span><\/span>\n            <\/div>\n<p>          <\/a><br \/>\n        `;<br \/>\n      }).join(&#8221;);<br \/>\n    })<br \/>\n    .catch(err =&gt; {<br \/>\n      console.error(&#8216;Kaksik blog embed:&#8217;, err);<br \/>\n      grid.innerHTML = `<\/p>\n<div class=\"kk-blog-error\">${T.error}<\/div>\n<p>`;<br \/>\n    });<br \/>\n})();\n<\/p><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/section><\/div>\n<p><!-- version:1775984383 --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Laen postitusi&#8230; #kk-blog-wrap { max-width: 1100px; margin: 40px auto; padding: 0 20px; font-family: &#8216;DM Sans&#8217;, system-ui, sans-serif; box-sizing: border-box; } .kk-blog-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; } .kk-blog-loading { grid-column: 1 \/ -1; text-align: center; padding: 60px 20px; color: #888; font-size: 14px; } .kk-blog-card { background: #fff; border: 1.5px solid #f0f0f0; border-top: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"brizy-blank-template.php","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"class_list":["post-2489","page","type-page","status-publish","hentry"],"aioseo_notices":[],"brizy_media":[],"_links":{"self":[{"href":"https:\/\/kaksik.ee\/en\/wp-json\/wp\/v2\/pages\/2489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kaksik.ee\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/kaksik.ee\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/kaksik.ee\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kaksik.ee\/en\/wp-json\/wp\/v2\/comments?post=2489"}],"version-history":[{"count":5,"href":"https:\/\/kaksik.ee\/en\/wp-json\/wp\/v2\/pages\/2489\/revisions"}],"predecessor-version":[{"id":2947,"href":"https:\/\/kaksik.ee\/en\/wp-json\/wp\/v2\/pages\/2489\/revisions\/2947"}],"wp:attachment":[{"href":"https:\/\/kaksik.ee\/en\/wp-json\/wp\/v2\/media?parent=2489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}