-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathscript.js
More file actions
126 lines (104 loc) · 3.54 KB
/
script.js
File metadata and controls
126 lines (104 loc) · 3.54 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
document.querySelectorAll('a[href^="#"]').forEach((anchor) => {
anchor.addEventListener("click", function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute("href"));
if (target) {
target.scrollIntoView({
behavior: "smooth",
block: "start",
});
}
const navbar = document.querySelector(".navbar");
const toggle = navbar?.querySelector(".nav-toggle");
if (navbar?.classList.contains("menu-open")) {
navbar.classList.remove("menu-open");
toggle?.setAttribute("aria-expanded", "false");
document.body.style.overflow = "";
}
});
});
(function setupNavbar() {
const navbar = document.querySelector(".navbar");
if (!navbar) return;
const toggle = navbar.querySelector(".nav-toggle");
const links = navbar.querySelector(".nav-links");
const dropdown = navbar.querySelector(".nav-dropdown");
const dropdownToggle = dropdown?.querySelector(".nav-dropdown-toggle");
const isMobile = () => window.matchMedia("(max-width: 768px)").matches;
const closeDropdown = () => {
if (!dropdown) return;
dropdown.classList.remove("open");
dropdownToggle?.setAttribute("aria-expanded", "false");
};
const closeMenu = () => {
navbar.classList.remove("menu-open");
toggle?.setAttribute("aria-expanded", "false");
document.body.style.overflow = "";
closeDropdown();
};
const openMenu = () => {
navbar.classList.add("menu-open");
toggle?.setAttribute("aria-expanded", "true");
document.body.style.overflow = "hidden";
};
toggle?.addEventListener("click", () => {
if (!isMobile()) return;
if (navbar.classList.contains("menu-open")) closeMenu();
else openMenu();
});
dropdownToggle?.addEventListener("click", () => {
if (!dropdown) return;
const isOpen = dropdown.classList.toggle("open");
dropdownToggle.setAttribute("aria-expanded", isOpen ? "true" : "false");
});
document.addEventListener("click", (e) => {
const target = e.target;
if (!(target instanceof HTMLElement)) return;
if (dropdown?.classList.contains("open") && !dropdown.contains(target)) {
closeDropdown();
}
if (navbar.classList.contains("menu-open") && !navbar.contains(target)) {
closeMenu();
}
});
document.addEventListener("keydown", (e) => {
if (e.key !== "Escape") return;
closeMenu();
});
window.addEventListener("resize", () => {
if (!isMobile()) closeMenu();
});
links?.addEventListener("click", (e) => {
const target = e.target;
if (!(target instanceof HTMLElement)) return;
if (target.closest(".nav-dropdown-menu a")) closeDropdown();
if (isMobile() && target.closest("a")) closeMenu();
});
})();
const demoButton = document.querySelector(".demo-button");
if (demoButton) {
demoButton.addEventListener("click", () => {
demoButton.textContent = "Clicked!";
setTimeout(() => {
demoButton.textContent = "Hover Over Me";
}, 1000);
});
}
function copyCode(button) {
const codeBlock = button.parentElement.querySelector("code");
const code = codeBlock.textContent;
navigator.clipboard.writeText(code).then(() => {
const originalText = button.innerHTML;
button.innerHTML = `
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="20 6 9 17 4 12"></polyline>
</svg>
Copied!
`;
button.classList.add("copied");
setTimeout(() => {
button.innerHTML = originalText;
button.classList.remove("copied");
}, 2000);
});
}