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);
})();
})();