Skip to content

Commit 1097b19

Browse files
Create Shared.js
1 parent 11fafb7 commit 1097b19

1 file changed

Lines changed: 96 additions & 0 deletions

File tree

Shared.js

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// ===== FUTURESTACK INTELLIGENCE — SHARED JS =====
2+
3+
// Hamburger menu
4+
function initNav() {
5+
const ham = document.getElementById('ham');
6+
const menu = document.getElementById('mobileMenu');
7+
if (!ham || !menu) return;
8+
9+
ham.addEventListener('click', () => {
10+
ham.classList.toggle('open');
11+
menu.classList.toggle('open');
12+
document.body.style.overflow = menu.classList.contains('open') ? 'hidden' : '';
13+
});
14+
15+
// Close on outside click
16+
document.addEventListener('click', (e) => {
17+
if (menu.classList.contains('open') && !menu.contains(e.target) && !ham.contains(e.target)) {
18+
ham.classList.remove('open');
19+
menu.classList.remove('open');
20+
document.body.style.overflow = '';
21+
}
22+
});
23+
24+
// Close on link click
25+
menu.querySelectorAll('a').forEach(a => {
26+
a.addEventListener('click', () => {
27+
ham.classList.remove('open');
28+
menu.classList.remove('open');
29+
document.body.style.overflow = '';
30+
});
31+
});
32+
}
33+
34+
// Order modal
35+
function initModal() {
36+
const overlay = document.getElementById('orderModal');
37+
if (!overlay) return;
38+
39+
overlay.addEventListener('click', (e) => {
40+
if (e.target === overlay) closeModal();
41+
});
42+
}
43+
44+
function openModal(name, desc) {
45+
const overlay = document.getElementById('orderModal');
46+
if (!overlay) return;
47+
document.getElementById('mTitle').textContent = name;
48+
document.getElementById('mDesc').textContent = desc;
49+
document.getElementById('mService').value = name;
50+
document.getElementById('mForm').style.display = 'block';
51+
document.getElementById('mSuccess').style.display = 'none';
52+
overlay.classList.add('open');
53+
document.body.style.overflow = 'hidden';
54+
}
55+
56+
function closeModal() {
57+
const overlay = document.getElementById('orderModal');
58+
if (!overlay) return;
59+
overlay.classList.remove('open');
60+
document.body.style.overflow = '';
61+
}
62+
63+
async function submitModal(e) {
64+
e.preventDefault();
65+
const form = e.target;
66+
const btn = form.querySelector('.btn-submit');
67+
const svc = document.getElementById('mService').value;
68+
btn.textContent = 'Sending...';
69+
btn.disabled = true;
70+
try {
71+
const r = await fetch(form.action, {
72+
method: 'POST',
73+
body: new FormData(form),
74+
headers: { 'Accept': 'application/json' }
75+
});
76+
if (r.ok) {
77+
document.getElementById('mForm').style.display = 'none';
78+
document.getElementById('mSuccessService').textContent = svc;
79+
document.getElementById('mSuccess').style.display = 'block';
80+
setTimeout(closeModal, 4000);
81+
} else {
82+
btn.textContent = 'Failed — Try Again';
83+
btn.disabled = false;
84+
}
85+
} catch {
86+
btn.textContent = 'Failed — Try Again';
87+
btn.disabled = false;
88+
}
89+
}
90+
91+
// Init on load
92+
document.addEventListener('DOMContentLoaded', () => {
93+
initNav();
94+
initModal();
95+
});
96+

0 commit comments

Comments
 (0)