/* boot splash — a short systemd/Arch-Linux-style boot, shown once per session (first visit + every new tab). pjax means it never replays on navigation. click or press any key to skip. safe: head fallback timeout clears it. */ (function () { var html = document.documentElement; if (!html.classList.contains("booting")) return; var boot = document.getElementById("boot"); var log = boot && boot.querySelector(".boot__log"); var ended = false; function done() { if (ended) return; ended = true; document.removeEventListener("keydown", skip, true); document.removeEventListener("click", skip, true); try { sessionStorage.setItem("kgv_booted", "1"); } catch (e) {} if (!boot) { html.classList.remove("booting"); return; } boot.style.transition = "opacity .3s ease"; boot.style.opacity = "0"; setTimeout(function () { html.classList.remove("booting"); if (boot.parentNode) boot.parentNode.removeChild(boot); }, 300); } function skip() { done(); } if (!log) { done(); return; } document.addEventListener("keydown", skip, true); document.addEventListener("click", skip, true); // [type, text, delay-after-ms]. type: 'k' plain kernel/info, 'ok' green [ OK ], // 'st' "Starting…", 'b' blank, 'd' dim. var L = [ ["k", "karimgabrielevarano.xyz 1.0 (tty1)", 90], ["d", "kgv-sh · hugo static runtime · pjax router", 320], ["b", "", 60], ["k", "Welcome to karimgabrielevarano.xyz", 120], ["ok", "Loaded index.html", 70], ["ok", "Loaded css/bundle.css", 60], ["ok", "Loaded fonts/iosevka-curly-slab.woff2", 90], ["ok", "Loaded js/bundle.js", 80], ["ok", "Parsed DOM — 0 errors", 120], ["st", "Mounting routes...", 240], ["ok", "Mounted /", 50], ["ok", "Mounted /portfolio", 50], ["ok", "Mounted /about", 50], ["ok", "Mounted /studio", 50], ["ok", "Mounted /openbureau", 50], ["ok", "Mounted /cv", 50], ["ok", "Mounted /colophon", 110], ["st", "Prerendering portfolio...", 220], ["ok", "rendered portfolio/textilsteinwerk", 60], ["ok", "rendered portfolio/the-shadow-over-emmen", 60], ["ok", "rendered portfolio/studytrip-trieste", 60], ["ok", "rendered portfolio/dojo", 60], ["ok", "rendered portfolio/museo", 110], ["ok", "Hydrated shell · cursor · theme", 100], ["ok", "Reached target Interactive.", 260], ["b", "", 110], ["k", "karimgabrielevarano login: karim (automatic)", 180], ["k", "welcome_", 500] ]; function render(item) { var type = item[0], text = item[1]; var line = document.createElement("div"); line.className = "boot__line"; if (type === "ok") { var s = document.createElement("span"); s.className = "boot__ok"; s.textContent = "[ OK ] "; line.appendChild(s); line.appendChild(document.createTextNode(text)); } else if (type === "st") { line.className += " boot__dim"; line.appendChild(document.createTextNode("[ ] " + text)); } else if (type === "d") { line.className += " boot__dim"; line.textContent = text; } else if (type === "b") { line.innerHTML = " "; } else { line.textContent = text; } log.appendChild(line); boot.scrollTop = boot.scrollHeight; // keep the newest line in view } var reduce = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches; if (reduce) { L.forEach(render); setTimeout(done, 700); return; } var i = 0; (function next() { if (ended) return; if (i >= L.length) { setTimeout(done, 450); return; } var item = L[i]; render(item); i++; setTimeout(next, item[2] || 110); })(); })();