94f6e749a0
Recovers original JS from git history and ports it into proper El source files under src/js/. Each file wraps the original JS in a native_js call inside a main() function, making it valid El that compiles to a self-contained IIFE via elc --target=js --bundle. Files added: src/js/account-auth.el - Supabase OTP magic-link (sendMagicLink) src/js/account-dashboard.el - Account dashboard: session, plan card, family src/js/chat-widget.el - Demo chat widget (neuronDemoToggle/Send/Reset) src/js/checkout-auth.el - Checkout auth: OAuth, email sign-in/up src/js/checkout-free.el - Free plan: auth-badge watch -> payment reveal src/js/checkout-stripe.el - Stripe Payment Element (reads NEURON_CFG) src/js/enterprise.el - Enterprise inquiry form + headcount filter src/js/environmental.el - Efficiency calculator slider src/js/gallery.el - Gallery nav, search/sort, Supabase voting src/js/main.el - Share page voting + copyForPlatform src/js/marketplace.el - Developer interest form src/js/nav.el - Nav hamburger + Mission dropdown src/js/styles.el - Landing: nav scroll, reveal, founding counter
57 lines
1.7 KiB
EmacsLisp
57 lines
1.7 KiB
EmacsLisp
// nav.el -- Navigation hamburger menu and Mission dropdown.
|
|
// Compiled with: elc --target=js --bundle --minify --obfuscate
|
|
|
|
fn main() -> Void {
|
|
native_js("(function() {
|
|
var btn = document.getElementById('nav-hamburger');
|
|
var menu = document.getElementById('nav-mobile');
|
|
var nav = document.getElementById('nav');
|
|
if (!btn || !menu) return;
|
|
|
|
function close() {
|
|
menu.classList.remove('open');
|
|
btn.setAttribute('aria-expanded', 'false');
|
|
}
|
|
function open() {
|
|
menu.classList.add('open');
|
|
btn.setAttribute('aria-expanded', 'true');
|
|
}
|
|
function toggle() {
|
|
if (menu.classList.contains('open')) { close(); } else { open(); }
|
|
}
|
|
|
|
btn.addEventListener('click', function(e) { e.stopPropagation(); toggle(); });
|
|
|
|
var ddBtn = document.querySelector('.nav-dropdown-btn');
|
|
var dd = document.querySelector('.nav-dropdown');
|
|
if (ddBtn && dd) {
|
|
ddBtn.addEventListener('click', function(e) {
|
|
e.stopPropagation();
|
|
var isOpen = dd.classList.contains('open');
|
|
dd.classList.toggle('open');
|
|
ddBtn.setAttribute('aria-expanded', isOpen ? 'false' : 'true');
|
|
});
|
|
dd.querySelectorAll('.nav-dropdown-item').forEach(function(a) {
|
|
a.addEventListener('click', function() { dd.classList.remove('open'); });
|
|
});
|
|
document.addEventListener('click', function() { dd.classList.remove('open'); });
|
|
}
|
|
|
|
menu.querySelectorAll('a').forEach(function(a) {
|
|
a.addEventListener('click', close);
|
|
});
|
|
|
|
document.addEventListener('click', function(e) {
|
|
if (!nav.contains(e.target)) { close(); }
|
|
});
|
|
|
|
document.addEventListener('keydown', function(e) {
|
|
if (e.key === 'Escape') { close(); }
|
|
});
|
|
|
|
window.addEventListener('resize', function() {
|
|
if (window.innerWidth > 1060) { close(); }
|
|
});
|
|
})()")
|
|
}
|