[FEAT] Menu improvements

This commit is contained in:
2026-01-02 01:09:23 +01:00
parent 79f9e3f7b2
commit 68d15721ea
4 changed files with 81 additions and 20 deletions

View File

@@ -44,7 +44,16 @@
</div> </div>
<!-- Mobile Menu --> <!-- Mobile Menu -->
<NavbarMobileMenu :is-open="isMobileMenuOpen" @close="isMobileMenuOpen = false" @open-help="$emit('open-help')" @save-project="handleQuickSave" @open-save-modal="openSaveModal" @open-new-project-modal="isNewProjectModalOpen = true" @open-project-list="isProjectListOpen = true" /> <NavbarMobileMenu
:is-open="isMobileMenuOpen"
@close="isMobileMenuOpen = false"
@open-help="$emit('open-help')"
@save-project="handleQuickSave"
@open-save-modal="openSaveModal"
@open-new-project-modal="isNewProjectModalOpen = true"
@open-project-list="isProjectListOpen = true"
@open-auth-modal="isAuthModalOpen = true"
/>
</nav> </nav>
<AuthModal :is-open="isAuthModalOpen" @close="isAuthModalOpen = false" /> <AuthModal :is-open="isAuthModalOpen" @close="isAuthModalOpen = false" />
<ProjectList :is-open="isProjectListOpen" @close="isProjectListOpen = false" @open-project="handleOpenProject" /> <ProjectList :is-open="isProjectListOpen" @close="isProjectListOpen = false" @open-project="handleOpenProject" />

View File

@@ -1,6 +1,6 @@
<template> <template>
<div class="flex items-center gap-4 text-sm font-medium text-gray-600 dark:text-gray-400"> <div class="flex items-center gap-4 text-sm font-medium text-gray-600 dark:text-gray-400">
<router-link to="/" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors">Generator</router-link> <router-link to="/" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors">Home</router-link>
<router-link to="/blog" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors">Blog</router-link> <router-link to="/blog" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors">Blog</router-link>
<router-link to="/about" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors">About</router-link> <router-link to="/about" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors">About</router-link>
<router-link to="/faq" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors">FAQ</router-link> <router-link to="/faq" class="hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors">FAQ</router-link>

View File

@@ -9,15 +9,47 @@
> >
<div v-show="isOpen" class="md:hidden border-t border-gray-200 dark:border-gray-800 bg-white/95 dark:bg-gray-950/95 backdrop-blur-xl absolute top-16 left-0 w-full z-40 shadow-lg"> <div v-show="isOpen" class="md:hidden border-t border-gray-200 dark:border-gray-800 bg-white/95 dark:bg-gray-950/95 backdrop-blur-xl absolute top-16 left-0 w-full z-40 shadow-lg">
<div class="px-2 pt-2 pb-3 space-y-1"> <div class="px-2 pt-2 pb-3 space-y-1">
<router-link to="/" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-800 hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors" @click="$emit('close')">Generator</router-link> <!-- User Profile (Mobile) -->
<router-link to="/blog" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-800 hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors" @click="$emit('close')">Blog</router-link> <div v-if="authStore.user" class="px-3 py-3 mb-2 border-b border-gray-200 dark:border-gray-800">
<router-link to="/about" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-800 hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors" @click="$emit('close')">About</router-link> <div class="flex items-center gap-3 mb-3">
<router-link to="/faq" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-800 hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors" @click="$emit('close')">FAQ</router-link> <div class="w-10 h-10 rounded-full bg-gradient-to-br from-indigo-500 to-purple-600 text-white font-bold text-base flex items-center justify-center shadow-md">
<router-link to="/faq" class="block px-3 py-2 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-800 hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors" @click="$emit('close')">FAQ</router-link> {{ userInitials }}
</div>
<div class="overflow-hidden">
<p class="text-xs text-gray-500 dark:text-gray-400 uppercase font-semibold tracking-wider mb-0.5">Signed in as</p>
<p class="text-sm font-medium text-gray-900 dark:text-white truncate">{{ authStore.user.email }}</p>
</div>
</div>
<button @click="handleLogout" class="w-full text-left flex items-center gap-3 px-3 py-2 rounded-md text-base font-medium text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors"><i class="fas fa-sign-out-alt w-5 text-center"></i> Sign out</button>
</div>
<div v-else class="px-3 py-3 mb-2 border-b border-gray-200 dark:border-gray-800">
<button
@click="
$emit('open-auth-modal');
$emit('close');
"
class="w-full btn btn-primary flex justify-center items-center gap-2"
>
Login / Register
</button>
</div>
<router-link to="/" class="flex items-center gap-3 px-3 py-3 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-800 hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors" @click="$emit('close')">
<i class="fas fa-home w-5 text-center"></i> Home
</router-link>
<router-link to="/blog" class="flex items-center gap-3 px-3 py-3 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-800 hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors" @click="$emit('close')">
<i class="fas fa-newspaper w-5 text-center"></i> Blog
</router-link>
<router-link to="/about" class="flex items-center gap-3 px-3 py-3 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-800 hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors" @click="$emit('close')">
<i class="fas fa-info-circle w-5 text-center"></i> About
</router-link>
<router-link to="/faq" class="flex items-center gap-3 px-3 py-3 rounded-md text-base font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-800 hover:text-indigo-600 dark:hover:text-indigo-400 transition-colors" @click="$emit('close')">
<i class="fas fa-question-circle w-5 text-center"></i> FAQ
</router-link>
<!-- Project Actions --> <!-- Project Actions -->
<div class="border-t border-gray-200 dark:border-gray-800 my-2 pt-2 px-3"> <div v-if="authStore.user" class="border-t border-gray-200 dark:border-gray-800 my-2 pt-2">
<p class="text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2">Project</p> <p class="px-3 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2">Project</p>
<button <button
v-if="isEditorActive" v-if="isEditorActive"
@@ -62,7 +94,7 @@
</button> </button>
</div> </div>
<div class="border-t border-gray-200 dark:border-gray-800 my-2 pt-2 flex gap-4 px-3"> <div class="border-t border-gray-200 dark:border-gray-800 my-2 pt-5 flex gap-4 px-3">
<a href="https://gitea.adhd.sh/root/spritesheet-generator" target="_blank" class="text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white"> <a href="https://gitea.adhd.sh/root/spritesheet-generator" target="_blank" class="text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white">
<i class="fab fa-github text-xl"></i> <i class="fab fa-github text-xl"></i>
</a> </a>
@@ -95,5 +127,18 @@
isOpen: boolean; isOpen: boolean;
}>(); }>();
defineEmits(['close', 'open-help', 'save-project', 'open-save-modal', 'open-new-project-modal', 'open-project-list']); defineEmits(['close', 'open-help', 'save-project', 'open-save-modal', 'open-new-project-modal', 'open-project-list', 'open-auth-modal']);
import { useAuthStore } from '@/stores/useAuthStore';
const authStore = useAuthStore();
const userInitials = computed(() => {
if (!authStore.user?.email) return '??';
return authStore.user.email.substring(0, 2).toUpperCase();
});
const handleLogout = () => {
authStore.logout();
// emit('close'); // Optional: close menu on logout? Maybe better to keep open so they can login again if they want.
};
</script> </script>

View File

@@ -1,20 +1,27 @@
<template> <template>
<div class="flex items-center gap-3"> <div class="flex items-center gap-3">
<a href="https://gitea.adhd.sh/root/spritesheet-generator" target="_blank" rel="noopener noreferrer" class="text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white transition-colors" title="Source Code"> <Tooltip text="Source Code">
<i class="fab fa-github text-lg"></i> <a href="https://gitea.adhd.sh/root/spritesheet-generator" target="_blank" rel="noopener noreferrer" class="text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white transition-colors">
</a> <i class="fab fa-github text-lg"></i>
<a href="https://discord.gg/JTev3nzeDa" target="_blank" rel="noopener noreferrer" class="text-gray-500 hover:text-[#5865F2] dark:text-gray-400 dark:hover:text-[#5865F2] transition-colors" title="Discord Community"> </a>
<i class="fab fa-discord text-lg"></i> </Tooltip>
</a> <Tooltip text="Discord Community">
<button @click="$emit('open-help')" class="text-gray-500 hover:text-indigo-600 dark:text-gray-400 dark:hover:text-indigo-400 transition-colors" title="Help"> <a href="https://discord.gg/JTev3nzeDa" target="_blank" rel="noopener noreferrer" class="text-gray-500 hover:text-[#5865F2] dark:text-gray-400 dark:hover:text-[#5865F2] transition-colors">
<i class="fas fa-question-circle text-lg"></i> <i class="fab fa-discord text-lg"></i>
</button> </a>
</Tooltip>
<Tooltip text="Help">
<button @click="$emit('open-help')" class="text-gray-500 hover:text-indigo-600 dark:text-gray-400 dark:hover:text-indigo-400 transition-colors">
<i class="fas fa-question-circle text-lg"></i>
</button>
</Tooltip>
<DarkModeToggle /> <DarkModeToggle />
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import DarkModeToggle from '../../utilities/DarkModeToggle.vue'; import DarkModeToggle from '../../utilities/DarkModeToggle.vue';
import Tooltip from '../../utilities/Tooltip.vue';
defineEmits(['open-help']); defineEmits(['open-help']);
</script> </script>