Files
rezayaghobi.ir/assets/app.js
rezayaghobi-dev 56b728dc49 Build personal DevOps portfolio site
Static HTML/CSS/JS site with local fonts and icons, certificate gallery,
work section and homelab diagrams, ready for rezayaghobi.ir.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
2026-10-19 10:19:26 +03:30

64 lines
2.0 KiB
JavaScript

/* Progress line, reveals, diagram draw. No dependencies. */
(function () {
var root = document.documentElement;
root.classList.add("anims");
var reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
var canObserve = "IntersectionObserver" in window;
function reveal(target, threshold) {
var nodes = [].slice.call(
typeof target == "string" ? document.querySelectorAll(target) : target
);
if (!canObserve || reduce) {
nodes.forEach(function (n) { n.classList.add("is-in"); });
return;
}
var io = new IntersectionObserver(function (entries) {
entries.forEach(function (entry) {
if (!entry.isIntersecting) return;
entry.target.classList.add("is-in");
io.unobserve(entry.target);
});
}, { threshold: threshold, rootMargin: "0px 0px -6% 0px" });
nodes.forEach(function (n) { io.observe(n); });
}
var bar = document.querySelector(".progress");
var waiting = false;
var groups = document.querySelectorAll(
".tiles, .chips, .ladder, .courses, .cert-gallery, .work-list, .timeline, .contact-rows"
);
function paint() {
waiting = false;
if (!bar) return;
var max = document.documentElement.scrollHeight - window.innerHeight;
var p = max > 0 ? window.scrollY / max : 0;
bar.style.transform = "scaleX(" + Math.min(1, Math.max(0, p)) + ")";
}
function queue() {
if (waiting) return;
waiting = true;
window.requestAnimationFrame(paint);
}
try {
[].forEach.call(groups, function (group) {
[].forEach.call(group.children, function (item, i) {
item.style.setProperty("--i", Math.min(i, 6));
});
});
reveal(".reveal", 0.08);
reveal(".diagram", 0.22);
reveal(groups, 0.12);
if (bar && !reduce) {
window.addEventListener("scroll", queue, { passive: true });
window.addEventListener("resize", queue, { passive: true });
paint();
}
} catch (err) {
root.classList.remove("anims");
}
})();