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;
var finePointer = matchMedia("(pointer: fine)").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: generic, built from any [data-rail] section on the page ---------- */
(function(){
var rail = document.getElementById("rail"), track = document.getElementById("railTrack");
if(!rail || !track) return;
var car = document.getElementById("railCar"), read = document.getElementById("railRead");
var secs = [].slice.call(document.querySelectorAll("[data-rail]")).map(function(el){
return { el: el, label: el.getAttribute("data-rail") };
});
if(!secs.length) return;
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);
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"); });
}
/* ---------- card tilt physics (spring, with glare tracking) ---------- */
if(finePointer && !reduced){
[].slice.call(document.querySelectorAll(".risk-card,.founder-card,.feat,.terms-card")).forEach(function(el){
var rx=0,ry=0,tx=0,ty=0,vx=0,vy=0,raf=null,over=false;
function frame(){
vx+=(tx-rx)*.16; vy+=(ty-ry)*.16; vx*=.72; vy*=.72;
rx+=vx; ry+=vy;
if(!over && Math.abs(rx)<.02 && Math.abs(ry)<.02 && Math.abs(vx)<.02 && Math.abs(vy)<.02){
el.style.transform=""; raf=null; return;
}
el.style.transform="perspective(900px) rotateX("+rx.toFixed(2)+"deg) rotateY("+ry.toFixed(2)+"deg) translateY(-2px)";
raf=requestAnimationFrame(frame);
}
el.addEventListener("pointerenter",function(){
over=true; el.classList.add("tilting");
if(!raf) raf=requestAnimationFrame(frame);
});
el.addEventListener("pointermove",function(e){
var r=el.getBoundingClientRect();
var px=(e.clientX-r.left)/r.width, py=(e.clientY-r.top)/r.height;
ty=(px-.5)*5; tx=(.5-py)*5;
el.style.setProperty("--gx",(px*100)+"%");
el.style.setProperty("--gy",(py*100)+"%");
});
el.addEventListener("pointerleave",function(){ over=false; tx=0; ty=0; });
});
}
})();