Files
hermes-config/skills/software-development/local-business-website/templates/main.js
T
2026-07-12 10:17:17 -04:00

75 lines
2.6 KiB
JavaScript

/* ============================================================
Local Business Website — Base JavaScript Template
Mobile nav toggle, header scroll shrink, active page detection.
Copy as js/main.js — zero dependencies, vanilla JS.
============================================================ */
document.addEventListener('DOMContentLoaded', function () {
/* ---- Elements ---- */
var hamburger = document.querySelector('.hamburger');
var mobileNav = document.querySelector('.mobile-nav');
var header = document.querySelector('.site-header');
/* ---- Mobile Nav Toggle ---- */
if (hamburger && mobileNav) {
hamburger.addEventListener('click', function () {
var isOpen = mobileNav.classList.toggle('open');
hamburger.classList.toggle('active');
hamburger.setAttribute('aria-expanded', isOpen);
document.body.style.overflow = isOpen ? 'hidden' : '';
});
/* Close nav when a link is tapped */
var navLinks = mobileNav.querySelectorAll('a');
navLinks.forEach(function (link) {
link.addEventListener('click', function () {
mobileNav.classList.remove('open');
hamburger.classList.remove('active');
hamburger.setAttribute('aria-expanded', 'false');
document.body.style.overflow = '';
});
});
}
/* ---- Header Shrink on Scroll ---- */
if (header) {
window.addEventListener('scroll', function () {
if (window.scrollY > 80) {
header.classList.add('scrolled');
} else {
header.classList.remove('scrolled');
}
}, { passive: true });
}
/* ---- Active Nav Link Highlighting ---- */
(function () {
var currentPath = window.location.pathname.replace(/\/$/, '') || '/';
var navLinks = document.querySelectorAll('.main-nav a, .footer-nav a');
navLinks.forEach(function (link) {
var href = link.getAttribute('href');
if (!href) return;
var linkPath = href.replace(/\/$/, '') || '/';
if (linkPath === '/' && currentPath !== '/') return;
if (currentPath.startsWith(linkPath) && linkPath !== '/') {
link.classList.add('active');
} else if (currentPath === '/' && linkPath === '/') {
link.classList.add('active');
}
});
})();
/* ---- Smooth Scroll for Anchor Links ---- */
document.querySelectorAll('a[href^="#"]').forEach(function (anchor) {
anchor.addEventListener('click', function (e) {
var target = document.querySelector(this.getAttribute('href'));
if (target) {
e.preventDefault();
target.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
});
});
});