<!DOCTYPE html><html lang="cs" dir="ltr" data-theme="dark" data-theme-locked data-astro-cid-j7pv25f6> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><title>Kerray.cz</title><meta name="description" content="Personal blog with music, technology, and life insights."><meta name="robots" content="index, follow"><!-- Open Graph --><meta property="og:type" content="website"><meta property="og:title" content="Kerray.cz"><meta property="og:description" content="Personal blog with music, technology, and life insights."><meta property="og:url" content="https://kerray.cz/"><meta property="og:image" content="https://kerray.cz/og.png"><!-- Twitter --><meta property="twitter:card" content="summary_large_image"><meta property="twitter:title" content="Kerray.cz"><meta property="twitter:description" content="Personal blog with music, technology, and life insights."><meta property="twitter:image" content="https://kerray.cz/og.png"><!-- JSON-LD Structured Data --><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Kerray.cz","description":"Personal blog with music, technology, and life insights.","url":"https://kerray.cz/"}</script><!-- Redirect returning visitors before paint --><script>(function(){const DEFAULT_LANGUAGE = "cs";

      if (document.cookie.includes('kerray_portal=seen') && !window.location.search.includes('portal')) {
        window.location.replace('/' + DEFAULT_LANGUAGE + '/');
      }
    })();</script><script src="/toggle-theme.js"></script><link rel="stylesheet" href="/_astro/global.Dvkvwv01.css">
<style>body{opacity:0}body{margin:0;background:#000;overflow-x:hidden;transition:opacity .3s ease-in}body.portal-ready{opacity:1}#portal-scroll[data-astro-cid-j7pv25f6]{position:relative;z-index:0}#portal-img[data-astro-cid-j7pv25f6]{will-change:transform}#portal-title[data-astro-cid-j7pv25f6] h1[data-astro-cid-j7pv25f6]{text-shadow:0 1px 2px rgba(0,0,0,.95),0 0 4px rgba(0,0,0,.85),0 0 40px rgba(0,0,0,.7),0 0 40px rgba(255,200,130,.28),0 0 8px rgba(255,220,160,.18)}#portal-recognition[data-astro-cid-j7pv25f6] p[data-astro-cid-j7pv25f6]{text-shadow:0 1px 2px rgba(0,0,0,.9),0 0 4px rgba(0,0,0,.8),0 0 32px rgba(0,0,0,.65),0 0 36px rgba(255,200,130,.22),0 0 6px rgba(255,220,160,.12)}#portal-invitation[data-astro-cid-j7pv25f6] p[data-astro-cid-j7pv25f6]{text-shadow:0 1px 2px rgba(0,0,0,.9),0 0 4px rgba(0,0,0,.8),0 0 32px rgba(0,0,0,.65),0 0 40px rgba(255,200,130,.26),0 0 8px rgba(255,220,160,.16)}#edge-left[data-astro-cid-j7pv25f6],#edge-right[data-astro-cid-j7pv25f6]{transition:background .3s ease}#portal-enter[data-astro-cid-j7pv25f6]:hover{box-shadow:0 0 30px #ffffff1a,inset 0 0 30px #ffffff0d}@keyframes portal-pulse{0%,to{transform:translateY(0) scale(1);opacity:.5}50%{transform:translateY(9px) scale(1.08);opacity:1}}.portal-pulse[data-astro-cid-j7pv25f6]{animation:portal-pulse 3.5s ease-in-out infinite;filter:drop-shadow(0 0 8px rgba(255,255,255,.25))}
</style></head> <body data-astro-cid-j7pv25f6> <!-- Scroll space - this div creates the scrollable height --> <div id="portal-scroll" style="height: 500vh;" data-astro-cid-j7pv25f6></div> <!-- Fixed scene layer: desert image (oversized for vertical pan) --> <div id="portal-scene" class="fixed inset-0 z-0 overflow-hidden" style="background: #1a1000;" data-astro-cid-j7pv25f6> <!-- previous image: /images/2026-02-11-portal-v2.png --> <img id="portal-img" src="/cdn/PzwjbKR1ktq1PyczNYlWtFVkuVrSO8psAX8NeQaHAj8/rs:fit:1696:0/plain/http://kerray-cz:4321/images/2026-03-04-portal-waves-v13-cropped.jpg" srcset="/cdn/a1O_qzfarJ_qWg6a4IFbnRQqROgNuIVPYMqk_4MXQBA/rs:fit:1280:0/plain/http://kerray-cz:4321/images/2026-03-04-portal-waves-v13-cropped.jpg 1280w, /cdn/PzwjbKR1ktq1PyczNYlWtFVkuVrSO8psAX8NeQaHAj8/rs:fit:1696:0/plain/http://kerray-cz:4321/images/2026-03-04-portal-waves-v13-cropped.jpg 1696w" sizes="100vw" alt="" loading="eager" fetchpriority="high" decoding="sync" style="min-width: 100%; min-height: 200%; width: 100vw; height: 200vh; object-fit: cover; object-position: center; transform: translateY(0); will-change: transform;" data-astro-cid-j7pv25f6> </div> <!-- Chromatic edge overlay --> <div id="portal-edges" class="fixed inset-0 z-10 pointer-events-none" style="opacity: 0;" data-astro-cid-j7pv25f6> <div class="absolute inset-0" id="edge-left" data-astro-cid-j7pv25f6></div> <div class="absolute inset-0" id="edge-right" data-astro-cid-j7pv25f6></div> </div> <!-- Text 1: Portal declaration (scrolls through mid-screen) --> <div id="portal-title" class="fixed inset-0 z-20 flex items-center justify-center" style="opacity: 0; pointer-events: none; will-change: transform, opacity; cursor: pointer;" data-astro-cid-j7pv25f6> <h1 class="text-5xl sm:text-6xl lg:text-7xl font-black tracking-tight text-white text-center px-8 drop-shadow-2xl leading-tight" data-astro-cid-j7pv25f6>
Toto není výkladní skříň.<br data-astro-cid-j7pv25f6>Je to portál.
</h1> </div> <!-- Text 2: Pole (scrolls through mid-screen) --> <div id="portal-recognition" class="fixed inset-0 z-20 flex items-center justify-center" style="opacity: 0; pointer-events: none; will-change: transform, opacity; cursor: pointer;" data-astro-cid-j7pv25f6> <p class="text-3xl sm:text-4xl lg:text-5xl font-light text-white/90 text-center max-w-3xl mx-auto px-8 leading-relaxed tracking-wide" data-astro-cid-j7pv25f6>
Nabízím své pole<br data-astro-cid-j7pv25f6>a vítám v něm člověka.
</p> </div> <!-- Text 3: Invitation (centered in viewport, fades in) --> <div id="portal-invitation" class="fixed inset-0 z-25 flex items-center justify-center" style="opacity: 0; pointer-events: none; will-change: opacity;" data-astro-cid-j7pv25f6> <p class="text-3xl sm:text-4xl lg:text-5xl font-light text-white/90 text-center max-w-3xl mx-auto px-8 leading-relaxed tracking-wide italic" data-astro-cid-j7pv25f6>
Pozvi mě dál do své bubliny.
</p> </div> <!-- Enter link (appears at bottom with sphere) --> <div id="portal-enter-zone" class="fixed bottom-16 sm:bottom-20 inset-x-0 z-30 flex justify-center" style="opacity: 0;" data-astro-cid-j7pv25f6> <a id="portal-enter" href="/cs/" class="inline-block text-white/90 hover:text-white text-base sm:text-lg tracking-[0.3em] uppercase transition-all duration-500 cursor-pointer bg-white/10 border-2 border-white/40 hover:border-white/70 rounded-full px-10 py-4 hover:bg-white/20 hover:shadow-[0_0_40px_rgba(200,145,58,0.3)] no-underline" data-astro-cid-j7pv25f6>
vstoupit
</a> </div> <!-- Scroll hint: pulsating down arrow, clickable --> <div id="portal-scroll-hint" class="fixed bottom-32 sm:bottom-40 inset-x-0 z-20 flex justify-center cursor-pointer" style="opacity: 0;" data-astro-cid-j7pv25f6> <svg class="w-32 h-32 sm:w-36 sm:h-36 text-white/60 portal-pulse" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-j7pv25f6> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 14l-7 7m0 0l-7-7" data-astro-cid-j7pv25f6></path> </svg> </div> <!-- Zoom/darkness overlay for transition --> <div id="portal-overlay" class="fixed inset-0 z-50 pointer-events-none bg-black" style="opacity: 0;" data-astro-cid-j7pv25f6></div> <script type="module">document.addEventListener("DOMContentLoaded",()=>{document.body.classList.add("portal-ready");const i=document.getElementById("portal-img"),u=document.getElementById("portal-title"),y=document.getElementById("portal-recognition"),B=document.getElementById("portal-invitation"),l=document.getElementById("portal-enter-zone"),r=document.getElementById("portal-scroll-hint"),f=document.getElementById("portal-edges"),h=document.getElementById("edge-left"),E=document.getElementById("edge-right"),m=document.getElementById("portal-overlay"),p=document.getElementById("portal-enter");let c=!1;setTimeout(()=>{r&&!c&&(r.style.transition="opacity 1.5s ease-in",r.style.opacity="1")},1200);function w(){c||(c=!0,r&&(r.style.transition="opacity 0.4s ease-out",r.style.opacity="0"))}r&&r.addEventListener("click",()=>{w(),window.scrollTo({top:.02*d(),behavior:"smooth"})});function b(e){if(e<=.15){const n=e/.15;return(1-Math.pow(1-n,3))*.45}else if(e>=.85){const n=(e-.85)/.15;return .55+Math.pow(n,3)*.45}else return .45+(e-.15)/.7*.1}function S(e){return`translateY(${40-b(e)*80}vh)`}function M(e){return e<.12?e/.12:e>.88?(1-e)/.12:1}function d(){return document.documentElement.scrollHeight-window.innerHeight}const x=[{el:u,start:.02,end:.3,isButton:!1},{el:y,start:.36,end:.64,isButton:!1},{el:B,start:.7,end:1,isButton:!0},{el:l,start:.85,end:1,isButton:!0}];function v(){const e=d(),n=e>0?Math.min(window.scrollY/e,1):0,a=Math.pow(n,1.4);i&&(i.style.transform=`translateY(${a*-50}%)`),!c&&n>.005&&w();for(const t of x){if(!t.el)continue;if(n<t.start||n>t.end){t.el.style.opacity="0",t.el.style.pointerEvents="none";continue}const o=(n-t.start)/(t.end-t.start);if(t.isButton){const s=Math.min(1,o/.25);t.el.style.opacity=String(s),t.el.style.pointerEvents=s>.1?"auto":"none"}else{const s=M(o);t.el.style.opacity=String(Math.max(0,Math.min(1,s))),t.el.style.transform=S(o),t.el.style.pointerEvents=s>.3?"auto":"none"}}if(f){const t=Math.pow(n,2)*.6;f.style.opacity=String(t);const o=Math.sin(n*Math.PI*2)*15,s=20+o,g=220-o;h&&(h.style.background=`linear-gradient(to right, hsla(${s}, 80%, 50%, 0.15) 0%, transparent 15%)`),E&&(E.style.background=`linear-gradient(to left, hsla(${g}, 80%, 50%, 0.15) 0%, transparent 15%)`)}}if(window.addEventListener("scroll",v,{passive:!0}),v(),u&&u.addEventListener("click",()=>{window.scrollTo({top:.36*d(),behavior:"smooth"})}),y&&y.addEventListener("click",()=>{window.scrollTo({top:.72*d(),behavior:"smooth"})}),p){const e=navigator.language?.startsWith("en")?"en":"cs";p.href="/"+e+"/",p.addEventListener("click",n=>{const a=n;if(a.button!==0||a.ctrlKey||a.metaKey||a.shiftKey)return;n.preventDefault();const t=new Date;if(t.setFullYear(t.getFullYear()+1),document.cookie=`kerray_portal=seen;expires=${t.toUTCString()};path=/;SameSite=Lax;Secure`,i){const o=i.getBoundingClientRect(),g=o.top+o.height*.22,L=o.left+o.width*.5,I=window.innerHeight/2,k=I+(g-I)*.15;i.style.transformOrigin=`${L}px ${k}px`,i.style.transition="transform 2s cubic-bezier(0.5, 0, 0.85, 0.4), filter 2s ease-in",i.style.transform="scale(6)",i.style.filter="brightness(0) blur(4px)"}l&&(l.style.transition="opacity 0.5s ease-out",l.style.opacity="0"),m&&(m.style.transition="opacity 1.5s cubic-bezier(0.4, 0, 0.2, 1)",setTimeout(()=>{m.style.opacity="1"},600)),setTimeout(()=>{const o=sessionStorage.getItem("kerray_return_url");sessionStorage.removeItem("kerray_return_url");const s=o||"/"+e+"/";window.location.href=s},2e3)})}});</script> </body> </html>