Files
ejercicio-forks-ramas-pr/script.js

74 lines
2.4 KiB
JavaScript

const menuButton = document.querySelector('.menu-toggle');
const navLinks = document.querySelector('.nav-links');
if (menuButton && navLinks) {
menuButton.addEventListener('click', () => {
const isOpen = navLinks.dataset.open === 'true';
navLinks.dataset.open = String(!isOpen);
menuButton.setAttribute('aria-expanded', String(!isOpen));
});
navLinks.querySelectorAll('a').forEach((link) => {
link.addEventListener('click', () => {
navLinks.dataset.open = 'false';
menuButton.setAttribute('aria-expanded', 'false');
});
const highlightTarget = () => {
const targetId = link.getAttribute('href');
if (!targetId || !targetId.startsWith('#')) {
return;
}
const targetCard = document.querySelector(targetId);
if (targetCard) {
targetCard.classList.add('is-linked-hover');
link.classList.add('is-linked');
}
};
const clearTarget = () => {
const targetId = link.getAttribute('href');
if (!targetId || !targetId.startsWith('#')) {
return;
}
const targetCard = document.querySelector(targetId);
if (targetCard) {
targetCard.classList.remove('is-linked-hover');
link.classList.remove('is-linked');
}
};
link.addEventListener('mouseenter', highlightTarget);
link.addEventListener('mouseleave', clearTarget);
link.addEventListener('focus', highlightTarget);
link.addEventListener('blur', clearTarget);
});
}
const revealElements = document.querySelectorAll('.reveal');
if ('IntersectionObserver' in window && revealElements.length > 0) {
const observer = new IntersectionObserver(
(entries, currentObserver) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add('is-visible');
currentObserver.unobserve(entry.target);
}
});
},
{ threshold: 0.2 }
);
revealElements.forEach((element) => observer.observe(element));
} else {
revealElements.forEach((element) => element.classList.add('is-visible'));
}
const yearElement = document.getElementById('currentYear');
if (yearElement) {
yearElement.textContent = new Date().getFullYear();
}