Repository navigation
Expand file tree
/
Copy pathscript.js
More file actions
67 lines (57 loc) · 2.25 KB
/
Copy pathscript.js
File metadata and controls
67 lines (57 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
const header = document.querySelector('[data-header]');
const menuToggle = document.querySelector('.menu-toggle');
const siteNav = document.querySelector('#site-nav');
const year = document.querySelector('[data-year]');
const currentPage = document.body.dataset.page;
if (year) year.textContent = new Date().getFullYear();
const setHeaderState = () => header?.classList.toggle('is-scrolled', window.scrollY > 12);
setHeaderState();
window.addEventListener('scroll', setHeaderState, { passive: true });
document.querySelectorAll('[data-page-link]').forEach((link) => {
const isCurrent = link.dataset.pageLink === currentPage;
link.classList.toggle('is-current', isCurrent);
if (isCurrent) link.setAttribute('aria-current', 'page');
});
const setMobileNavState = (open) => {
header?.classList.toggle('nav-open', open);
document.body.classList.toggle('nav-is-open', open);
menuToggle?.setAttribute('aria-expanded', String(open));
menuToggle?.setAttribute('aria-label', open ? 'Chiudi navigazione' : 'Apri navigazione');
};
const closeMobileNav = () => {
setMobileNavState(false);
};
menuToggle?.addEventListener('click', () => {
setMobileNavState(!header?.classList.contains('nav-open'));
});
siteNav?.querySelectorAll('a').forEach((link) => link.addEventListener('click', () => {
closeMobileNav();
}));
document.addEventListener('click', (event) => {
if (header?.classList.contains('nav-open') && !event.target.closest('[data-header]')) closeMobileNav();
});
document.addEventListener('keydown', (event) => {
if (event.key === 'Escape') closeMobileNav();
});
window.addEventListener('resize', () => {
if (window.innerWidth > 980) closeMobileNav();
});
const setAccordionIcon = (detail) => {
const icon = detail.querySelector('summary i');
if (icon) icon.textContent = detail.open ? '\u00d7' : '+';
};
document.querySelectorAll('[data-accordion-group] details').forEach((detail) => {
setAccordionIcon(detail);
detail.addEventListener('toggle', () => {
if (detail.open) {
const group = detail.closest('[data-accordion-group]');
group?.querySelectorAll('details').forEach((other) => {
if (other !== detail) {
other.open = false;
setAccordionIcon(other);
}
});
}
setAccordionIcon(detail);
});
});