diff --git a/components/AppNavbar.vue b/components/AppNavbar.vue
index 38106c5..66776f0 100644
--- a/components/AppNavbar.vue
+++ b/components/AppNavbar.vue
@@ -1,51 +1,99 @@
-
@@ -53,19 +101,314 @@
import { tdeiClient } from '~/services/index'
const auth = tdeiClient.auth
+const mobileMenuOpen = ref(false)
+const isMobileView = ref(false)
+const toggleButtonRef = ref<{ $el: HTMLElement } | null>(null)
+
+watch(mobileMenuOpen, (isOpen) => {
+ if (!isOpen) {
+ nextTick(() => toggleButtonRef.value?.$el?.focus())
+ }
+})
+
+function onKeydown(e: KeyboardEvent) {
+ if (e.key === 'Escape' && mobileMenuOpen.value && isMobileView.value) {
+ mobileMenuOpen.value = false
+ }
+}
+
+function syncMobileView() {
+ if (typeof window === 'undefined') return
+ isMobileView.value = window.innerWidth < 768
+ if (!isMobileView.value) {
+ mobileMenuOpen.value = false
+ }
+}
+
+function closeOnMobile() {
+ if (isMobileView.value) {
+ mobileMenuOpen.value = false
+ }
+}
+
+function logoutFromMobileMenu() {
+ mobileMenuOpen.value = false
+ auth.clear()
+ navigateTo('/')
+}
+
+onMounted(() => {
+ syncMobileView()
+ window.addEventListener('resize', syncMobileView)
+ document.addEventListener('keydown', onKeydown)
+})
+
+onBeforeUnmount(() => {
+ window.removeEventListener('resize', syncMobileView)
+ document.removeEventListener('keydown', onKeydown)
+})
-
diff --git a/components/AppSpinner.vue b/components/AppSpinner.vue
index 0c50a4c..f6b7341 100644
--- a/components/AppSpinner.vue
+++ b/components/AppSpinner.vue
@@ -1,5 +1,8 @@
-