import "@fontsource-variable/inter"; import "@fontsource/jetbrains-mono/400.css"; import "@fontsource/jetbrains-mono/500.css"; import "@fontsource/jetbrains-mono/600.css"; import "./styles.css"; console.log("%cCreated by Sarthak", "font-size:14px;font-weight:700;color:#F2A83B;"); (function(){ var reduced = matchMedia("(prefers-reduced-motion: reduce)").matches; /* ---------- scrollbar materialises only while scrolling ---------- */ (function(){ var to = null; addEventListener("scroll", function(){ document.documentElement.classList.add("scrolling"); clearTimeout(to); to = setTimeout(function(){ document.documentElement.classList.remove("scrolling"); }, 900); }, { passive: true, capture: true }); })(); /* ---------- mobile scroll progress bar ---------- */ (function(){ var bar = document.getElementById("mprogBar"); if(!bar) return; var raf = null; function upd(){ raf = null; var doc = document.scrollingElement || document.documentElement; var max = Math.max(1, doc.scrollHeight - innerHeight); bar.style.transform = "scaleX(" + Math.min(1, window.scrollY / max).toFixed(4) + ")"; } addEventListener("scroll", function(){ if(raf == null) raf = requestAnimationFrame(upd); }, { passive: true }); upd(); })(); /* ---------- mobile nav ---------- */ (function(){ var mb = document.getElementById("menuBtn"); if(!mb) return; mb.addEventListener("click", function(){ var open = document.body.classList.toggle("nav-open"); mb.setAttribute("aria-expanded", open ? "true" : "false"); }); [].slice.call(document.querySelectorAll(".nav-links a")).forEach(function(a){ a.addEventListener("click", function(){ document.body.classList.remove("nav-open"); mb.setAttribute("aria-expanded", "false"); }); }); })(); /* ---------- footer: hail alerts by ZIP ---------- */ (function(){ var form = document.getElementById("zipForm"); if(!form) return; var zin = document.getElementById("zipInput"); form.addEventListener("submit", function(e){ e.preventDefault(); var v = zin.value.trim(); if(!/^\d{5}$/.test(v)){ zin.focus(); zin.select(); return; } form.innerHTML = "
⚑ WATCHING " + v + "" + "First alert lands after the next radar-verified swath. No spam, only storms.
"; }); })(); /* ---------- station rail: section index ---------- */ (function(){ var rail = document.getElementById("rail"), track = document.getElementById("railTrack"); if(!rail || !track) return; var car = document.getElementById("railCar"), read = document.getElementById("railRead"); var defs = [ ["intro","01 · FAQ"], ["ov","02 · OVERVIEW"], ["sales","03 · SALES"], ["canvas","04 · PROCANVAS"], ["projects","05 · PROJECTS"], ["ownersbox","06 · OWNERS BOX"], ["ai","07 · AI"], ["reporting","08 · REPORTING"], ["fit","09 · FIT"], ["roadmap","10 · ROADMAP"], ["founders","11 · FOUNDERS"], ["about","12 · ABOUT"], ["cta","13 · BOOK"] ]; var secs = defs.map(function(d){ return {el:document.getElementById(d[0]), label:d[1]}; }) .filter(function(s){ return s.el; }); var nodes = secs.map(function(s){ var b = document.createElement("button"); b.className = "rail-node"; b.type = "button"; b.title = s.label; b.setAttribute("aria-label", s.label); b.addEventListener("click", function(){ scrollTo({top:s.el.offsetTop - 52, behavior:reduced ? "auto" : "smooth"}); }); track.appendChild(b); return b; }); var tops = [], maxScroll = 1; function layout(){ var doc = document.scrollingElement || document.documentElement; maxScroll = Math.max(1, doc.scrollHeight - innerHeight); /* nodes live in the SAME space as the carriage: clamped scroll position / max scroll */ tops = secs.map(function(s){ return Math.max(0, Math.min(s.el.offsetTop - 52, maxScroll)); }); tops.forEach(function(tp, i){ nodes[i].style.top = (tp / maxScroll * 100) + "%"; }); } var carP = 0, target = 0, actLabel = "", raf = null, lastT = 0; function frame(now){ var rawDt = lastT ? now - lastT : 16; var dt = Math.min(rawDt, 50); lastT = now; var k = rawDt > 400 ? 1 : 1 - Math.exp(-dt / 110); carP += (target - carP) * k; if(Math.abs(target - carP) < .0005) carP = target; car.style.top = (carP * 100) + "%"; read.textContent = actLabel + " · " + Math.round(carP * 100) + "%"; if(carP === target){ raf = null; lastT = 0; return; } raf = requestAnimationFrame(frame); } function upd(){ var doc = document.scrollingElement || document.documentElement; if(Math.abs(doc.scrollHeight - innerHeight - maxScroll) > 2) layout(); var y = window.scrollY; target = Math.max(0, Math.min(1, y / maxScroll)); var act = 0; tops.forEach(function(tp, i){ if(y >= tp - innerHeight * .35) act = i; }); if(maxScroll - y < 4) act = secs.length - 1; nodes.forEach(function(n, i){ n.classList.toggle("on", i === act); }); actLabel = secs[act].label; if(raf == null){ lastT = 0; raf = requestAnimationFrame(frame); } } addEventListener("scroll", upd, {passive:true}); addEventListener("resize", function(){ layout(); upd(); }); addEventListener("load", function(){ layout(); upd(); }); layout(); upd(); })(); /* ---------- scroll reveals: 150ms, 60ms stagger ---------- */ var revealEls = [].slice.call(document.querySelectorAll(".reveal")); if(!reduced && "IntersectionObserver" in window){ var groups = new Map(); var io = new IntersectionObserver(function(entries){ entries.forEach(function(e){ if(!e.isIntersecting && e.boundingClientRect.top >= 0) return; io.unobserve(e.target); var parent = e.target.parentElement; var idx = groups.get(parent) || 0; groups.set(parent, idx + 1); setTimeout(function(){ e.target.classList.add("in"); }, idx * 60); setTimeout(function(){ groups.set(parent, Math.max(0,(groups.get(parent)||1)-1)); }, 400); }); }, {threshold:.15}); revealEls.forEach(function(el){ io.observe(el); }); } else { revealEls.forEach(function(el){ el.classList.add("in"); }); } /* ---------- FAQ search filter ---------- */ (function(){ var input = document.getElementById("faqSearch"); if(!input) return; var count = document.getElementById("faqCount"); var groups = [].slice.call(document.querySelectorAll(".faq-cat")).map(function(cat){ return { cat: cat, rows: [].slice.call(cat.querySelectorAll(".faq details")).map(function(d){ return { el: d, text: d.textContent.toLowerCase() }; }) }; }); function run(){ var q = input.value.trim().toLowerCase(); var shown = 0; groups.forEach(function(group){ var visible = 0; group.rows.forEach(function(row){ var match = !q || row.text.indexOf(q) !== -1; row.el.classList.toggle("hide", !match); if(match) visible++; }); group.cat.classList.toggle("hide", visible === 0); shown += visible; }); if(count) count.textContent = q ? shown + " match" + (shown === 1 ? "" : "es") + " for “" + input.value.trim() + "”" : ""; dispatchEvent(new Event("resize")); } input.addEventListener("input", run); })(); })();