-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
149 lines (127 loc) · 4.38 KB
/
script.js
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
document.addEventListener('DOMContentLoaded', function() {
// DOM Elements
const hamburger = document.getElementById('hamburger-menu');
const navMenu = document.getElementById('nav-menu');
const body = document.body;
const navLinks = document.querySelectorAll('.nav-menu a');
const internalLinks = document.querySelectorAll('a[href^="#"]');
const ctaButtons = document.querySelectorAll('.cta-button');
const themeToggle = document.getElementById('themeToggle');
// Navigation Menu Functions
function toggleMenu() {
// First add the squeezing class
hamburger.classList.add('squeezing');
// After the squeeze animation, add the active class
setTimeout(() => {
hamburger.classList.remove('squeezing');
hamburger.classList.toggle('active');
if (navMenu) {
navMenu.classList.add('opening');
}
body.classList.toggle('menu-open');
// Wait for the menu to finish opening
setTimeout(() => {
if (navMenu) {
navMenu.classList.remove('opening');
navMenu.classList.toggle('active');
}
}, 50);
}, 100); // This timing matches the squeeze animation duration
}
function closeMenu() {
// First add the squeezing class
hamburger.classList.add('squeezing');
// After the squeeze animation, remove active class
setTimeout(() => {
hamburger.classList.remove('squeezing');
hamburger.classList.remove('active');
if (navMenu) {
navMenu.classList.remove('active');
navMenu.classList.remove('opening');
}
body.classList.remove('menu-open');
}, 200);
}
function smoothScroll(targetElement) {
if (targetElement) {
closeMenu();
targetElement.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
}
function handleNavLinkClick() {
closeMenu();
}
function handleOutsideClick(event) {
if (navMenu && hamburger) {
const isClickInsideMenu = navMenu.contains(event.target);
const isClickOnHamburger = hamburger.contains(event.target);
if (!isClickInsideMenu && !isClickOnHamburger && navMenu.classList.contains('active')) {
closeMenu();
}
}
}
function handleWindowResize() {
if (navMenu && window.innerWidth > 768 && navMenu.classList.contains('active')) {
closeMenu();
}
}
function handleInternalLinkClick(e) {
e.preventDefault();
const targetId = this.getAttribute('href');
const target = document.querySelector(targetId);
smoothScroll(target);
}
// Theme Toggle Functionality
if (themeToggle) {
const toggleText = themeToggle.querySelector('.toggle-text');
const root = document.documentElement;
// Function to update theme
function setTheme(theme) {
if (theme === 'dark' || theme === 'light') {
root.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
if (toggleText) {
toggleText.textContent = `${theme} mode`;
}
}
}
// Check for saved theme preference
const savedTheme = localStorage.getItem('theme') || 'dark';
setTheme(savedTheme);
// Listen for theme toggle clicks
themeToggle.addEventListener('click', function() {
const currentTheme = root.getAttribute('data-theme');
setTheme(currentTheme === 'light' ? 'dark' : 'light');
});
// Listen for system theme changes
const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
darkModeMediaQuery.addEventListener('change', function(e) {
if (!localStorage.getItem('theme')) {
setTheme(e.matches ? 'dark' : 'light');
}
});
}
// Event Listeners
if (hamburger) {
hamburger.addEventListener('click', toggleMenu);
}
if (navLinks) {
navLinks.forEach(link => link.addEventListener('click', handleNavLinkClick));
}
document.addEventListener('click', handleOutsideClick);
window.addEventListener('resize', handleWindowResize);
if (internalLinks) {
internalLinks.forEach(anchor => anchor.addEventListener('click', handleInternalLinkClick));
}
if (ctaButtons) {
ctaButtons.forEach(button => button.addEventListener('click', handleInternalLinkClick));
}
// Add event listener removal on page unload
window.addEventListener('unload', function() {
document.removeEventListener('click', handleOutsideClick);
window.removeEventListener('resize', handleWindowResize);
});
});