Add hamburger menu for mobile nav
This commit is contained in:
@@ -237,34 +237,34 @@ try {
|
|||||||
id="admin-jobs-badge"
|
id="admin-jobs-badge"
|
||||||
style="display:none"
|
style="display:none"
|
||||||
title=""
|
title=""
|
||||||
class="text-xs px-2 py-0.5 rounded-full bg-amber-900/60 text-amber-300 border border-amber-700/50 animate-pulse cursor-default"
|
class="hidden sm:flex text-xs px-2 py-0.5 rounded-full bg-amber-900/60 text-amber-300 border border-amber-700/50 animate-pulse cursor-default"
|
||||||
></span>
|
></span>
|
||||||
<!-- Settings link — hidden until logged in -->
|
<!-- Settings link — hidden until logged in -->
|
||||||
<a
|
<a
|
||||||
id="nav-settings"
|
id="nav-settings"
|
||||||
href={`${baseUrl}settings/`}
|
href={`${baseUrl}settings/`}
|
||||||
style="display:none"
|
style="display:none"
|
||||||
class="text-xs text-zinc-500 hover:text-white transition-colors px-1"
|
class="hidden sm:inline text-xs text-zinc-500 hover:text-white transition-colors px-1"
|
||||||
>Settings</a>
|
>Settings</a>
|
||||||
<!-- Admin link — hidden until confirmed admin -->
|
<!-- Admin link — hidden until confirmed admin -->
|
||||||
<a
|
<a
|
||||||
id="nav-admin"
|
id="nav-admin"
|
||||||
href={`${baseUrl}admin/`}
|
href={`${baseUrl}admin/`}
|
||||||
style="display:none"
|
style="display:none"
|
||||||
class="text-xs text-zinc-500 hover:text-white transition-colors px-1"
|
class="hidden sm:inline text-xs text-zinc-500 hover:text-white transition-colors px-1"
|
||||||
>Admin</a>
|
>Admin</a>
|
||||||
|
|
||||||
<!-- Logout button — hidden until logged in -->
|
<!-- Logout button — hidden until logged in -->
|
||||||
<button
|
<button
|
||||||
id="nav-logout"
|
id="nav-logout"
|
||||||
style="display:none"
|
style="display:none"
|
||||||
class="text-xs text-zinc-500 hover:text-white transition-colors px-2 h-8"
|
class="hidden sm:inline text-xs text-zinc-500 hover:text-white transition-colors px-2 h-8"
|
||||||
aria-label="Log out"
|
aria-label="Log out"
|
||||||
>Log out</button>
|
>Log out</button>
|
||||||
{editEnabled && (
|
{editEnabled && (
|
||||||
<button
|
<button
|
||||||
id="upload-btn"
|
id="upload-btn"
|
||||||
class="text-zinc-400 hover:text-white transition-colors w-8 h-8 flex items-center justify-center rounded-md hover:bg-zinc-800 text-base"
|
class="hidden sm:flex text-zinc-400 hover:text-white transition-colors w-8 h-8 items-center justify-center rounded-md hover:bg-zinc-800 text-base"
|
||||||
aria-label="Upload activity"
|
aria-label="Upload activity"
|
||||||
title="Upload activity"
|
title="Upload activity"
|
||||||
>↑</button>
|
>↑</button>
|
||||||
@@ -276,8 +276,32 @@ try {
|
|||||||
class="text-zinc-400 hover:text-white transition-colors w-8 h-8 flex items-center justify-center rounded-md hover:bg-zinc-800 text-base"
|
class="text-zinc-400 hover:text-white transition-colors w-8 h-8 flex items-center justify-center rounded-md hover:bg-zinc-800 text-base"
|
||||||
aria-label="Toggle theme"
|
aria-label="Toggle theme"
|
||||||
>☀</button>
|
>☀</button>
|
||||||
|
{!isPublicPage && (
|
||||||
|
<button
|
||||||
|
id="nav-hamburger"
|
||||||
|
style="display:none"
|
||||||
|
class="sm:hidden text-zinc-400 hover:text-white w-8 h-8 flex items-center justify-center rounded-md hover:bg-zinc-800 text-base"
|
||||||
|
aria-label="Menu"
|
||||||
|
>☰</button>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{!isPublicPage && (
|
||||||
|
<div id="nav-menu" class="hidden border-t sm:hidden"
|
||||||
|
style="border-color: var(--border); background: var(--bg-card)">
|
||||||
|
<div class="max-w-7xl mx-auto px-4 py-2 flex flex-col">
|
||||||
|
<a href={`${baseUrl}settings/`}
|
||||||
|
class="text-sm px-2 py-1.5 rounded hover:bg-zinc-800 transition-colors"
|
||||||
|
style="color: var(--text-4)">Settings</a>
|
||||||
|
<a id="nav-admin-m" href={`${baseUrl}admin/`}
|
||||||
|
style="display:none; color: var(--text-4)"
|
||||||
|
class="text-sm px-2 py-1.5 rounded hover:bg-zinc-800 transition-colors">Admin</a>
|
||||||
|
<button id="nav-logout-m"
|
||||||
|
class="text-sm px-2 py-1.5 rounded hover:bg-zinc-800 transition-colors text-left"
|
||||||
|
style="color: var(--text-4)">Log out</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
{editEnabled && (
|
{editEnabled && (
|
||||||
@@ -550,6 +574,8 @@ try {
|
|||||||
if (settingsEl) settingsEl.style.display = '';
|
if (settingsEl) settingsEl.style.display = '';
|
||||||
const logoutEl = document.getElementById('nav-logout');
|
const logoutEl = document.getElementById('nav-logout');
|
||||||
if (logoutEl) logoutEl.style.display = '';
|
if (logoutEl) logoutEl.style.display = '';
|
||||||
|
const hamburgerEl = document.getElementById('nav-hamburger');
|
||||||
|
if (hamburgerEl) hamburgerEl.style.display = '';
|
||||||
|
|
||||||
// Pre-populate the "keep original" checkbox from the instance default
|
// Pre-populate the "keep original" checkbox from the instance default
|
||||||
const chk = document.getElementById('upload-keep-original');
|
const chk = document.getElementById('upload-keep-original');
|
||||||
@@ -584,6 +610,8 @@ try {
|
|||||||
if (user.is_admin) {
|
if (user.is_admin) {
|
||||||
const adminLink = document.getElementById('nav-admin');
|
const adminLink = document.getElementById('nav-admin');
|
||||||
if (adminLink) adminLink.style.display = '';
|
if (adminLink) adminLink.style.display = '';
|
||||||
|
const adminLinkM = document.getElementById('nav-admin-m');
|
||||||
|
if (adminLinkM) adminLinkM.style.display = '';
|
||||||
const badge = document.getElementById('admin-jobs-badge');
|
const badge = document.getElementById('admin-jobs-badge');
|
||||||
async function pollJobs() {
|
async function pollJobs() {
|
||||||
try {
|
try {
|
||||||
@@ -609,9 +637,25 @@ try {
|
|||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
})();
|
})();
|
||||||
|
|
||||||
document.getElementById('nav-logout')?.addEventListener('click', async () => {
|
async function doLogout() {
|
||||||
try { await fetch('/api/auth/logout', { method: 'POST', credentials: 'include' }); } catch (_) {}
|
try { await fetch('/api/auth/logout', { method: 'POST', credentials: 'include' }); } catch (_) {}
|
||||||
window.location.href = baseUrl + 'login/';
|
window.location.href = baseUrl + 'login/';
|
||||||
|
}
|
||||||
|
document.getElementById('nav-logout')?.addEventListener('click', doLogout);
|
||||||
|
document.getElementById('nav-logout-m')?.addEventListener('click', doLogout);
|
||||||
|
|
||||||
|
const hamburger = document.getElementById('nav-hamburger');
|
||||||
|
const navMenu = document.getElementById('nav-menu');
|
||||||
|
hamburger?.addEventListener('click', () => {
|
||||||
|
const open = navMenu?.classList.toggle('hidden') === false;
|
||||||
|
hamburger.textContent = open ? '✕' : '☰';
|
||||||
|
});
|
||||||
|
document.addEventListener('click', (e) => {
|
||||||
|
if (navMenu && !navMenu.classList.contains('hidden') &&
|
||||||
|
!navMenu.contains(e.target) && !hamburger?.contains(e.target)) {
|
||||||
|
navMenu.classList.add('hidden');
|
||||||
|
if (hamburger) hamburger.textContent = '☰';
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
)}
|
)}
|
||||||
|
|||||||
Reference in New Issue
Block a user