diff --git a/app/assets/css/main.css b/app/assets/css/main.css index 9577ba9..9b39686 100644 --- a/app/assets/css/main.css +++ b/app/assets/css/main.css @@ -5,6 +5,7 @@ --text-tertiary: #6e7681; --text-link: #2f81f7; --text-link-hover: #539bf5; + --text-slate: #57606a; --border-primary: #30363d; --border-hover: #8d96a0; @@ -56,7 +57,6 @@ body { h1, h2, h3, h4, h5, h6 { font-weight: 600; line-height: 1.25; - color: var(--text-primary); } p { diff --git a/app/layouts/default.vue b/app/layouts/default.vue index 018d133..deb6553 100644 --- a/app/layouts/default.vue +++ b/app/layouts/default.vue @@ -2,68 +2,212 @@ import { useAuthStore } from "~/stores/auth-store.js"; const authStore = useAuthStore(); -const isDark = ref(false); const router = useRouter(); +// State (No more isScrolled) +const isDark = ref(false); +const isUserMenuOpen = ref(false); +const isMobileMenuOpen = ref(false); +const userMenuRef = ref(null); + +// Toggle Dark Mode function toggleDark() { - isDark.value = !isDark.value; - if (isDark.value) { - document.documentElement.classList.add('dark'); - localStorage.theme = 'dark'; - } else { - document.documentElement.classList.remove('dark'); - localStorage.theme = 'light'; - } + isDark.value = !isDark.value; + if (isDark.value) { + document.documentElement.classList.add('dark'); + localStorage.theme = 'dark'; + } else { + document.documentElement.classList.remove('dark'); + localStorage.theme = 'light'; + } } -function logout() { - authStore.logout() - router.push("/auth/login"); +// Navigation Links +const navLinks = [ + { name: 'Dashboard', path: '/' }, + { name: 'Courses', path: '/courses' }, + { name: 'Students', path: '/students' }, + { name: 'Schedule', path: '/schedule' }, +]; + +function handleLogout() { + isUserMenuOpen.value = false; + isMobileMenuOpen.value = false; + authStore.logout(); + router.push("/auth/login"); +} + +function navigateTo(path) { + isUserMenuOpen.value = false; + isMobileMenuOpen.value = false; + router.push(path); +} + +function closeDropdowns(event) { + if (userMenuRef.value && !userMenuRef.value.contains(event.target)) { + isUserMenuOpen.value = false; + } } onMounted(() => { - if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) { - isDark.value = true; - document.documentElement.classList.add('dark'); - } + // Initialize Theme + if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) { + isDark.value = true; + document.documentElement.classList.add('dark'); + } + + // Click listener for closing dropdowns + window.addEventListener('click', closeDropdowns); +}); + +onUnmounted(() => { + window.removeEventListener('click', closeDropdowns); }); + diff --git a/app/pages/profile/index.vue b/app/pages/profile/index.vue index 5ececc7..0ce60e7 100644 --- a/app/pages/profile/index.vue +++ b/app/pages/profile/index.vue @@ -1,160 +1,175 @@