Files
site-portfolio/public/js/modules/ui/skills-intro.js
T

62 lines
1.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { prefersReducedMotion } from "../shared/media.js";
function bindSkillsIntroRoot(root) {
const msgs = Array.from(root.querySelectorAll("[data-skills-msg]"));
if (!msgs.length) return;
const reduceMotion = prefersReducedMotion();
function localDatetimeMinute(d) {
const pad = (n) => String(n).padStart(2, "0");
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}`;
}
function setTime(el, date) {
const timeEl = el.querySelector("[data-skills-msg-time]");
if (!timeEl) return;
timeEl.textContent = date.toLocaleTimeString("ru-RU", { hour: "2-digit", minute: "2-digit" });
timeEl.setAttribute("datetime", localDatetimeMinute(date));
}
function revealAll() {
msgs.forEach((el, i) => {
window.setTimeout(() => {
setTime(el, new Date());
el.classList.add("is-visible");
el.removeAttribute("aria-hidden");
}, i * 420);
});
}
if (reduceMotion) {
const now = new Date();
msgs.forEach((el) => {
setTime(el, now);
el.classList.add("is-visible");
});
return;
}
root.setAttribute("data-skills-anim", "1");
msgs.forEach((m) => m.setAttribute("aria-hidden", "true"));
let done = false;
const obs = new IntersectionObserver(
(entries) => {
for (const e of entries) {
if (!e.isIntersecting || done) continue;
done = true;
obs.disconnect();
revealAll();
break;
}
},
{ threshold: 0.22, rootMargin: "0px 0px -10% 0px" },
);
obs.observe(root);
}
/** Чат-вступления с `data-skills-intro`: может быть несколько на странице (например, навыки и мини-проекты). */
export function initSkillsIntroMessages() {
document.querySelectorAll("[data-skills-intro]").forEach((root) => bindSkillsIntroRoot(root));
}