diff --git a/frontend/src/components/layout/AppHeader.vue b/frontend/src/components/layout/AppHeader.vue index e432879e..5593c8bb 100644 --- a/frontend/src/components/layout/AppHeader.vue +++ b/frontend/src/components/layout/AppHeader.vue @@ -207,7 +207,7 @@ const pageDescription = computed(() => { }); function toggleMobileSidebar() { - appStore.toggleSidebar(); + appStore.toggleMobileSidebar(); } function toggleDropdown() { diff --git a/frontend/src/components/layout/AppSidebar.vue b/frontend/src/components/layout/AppSidebar.vue index 3ae63abe..7d5cf341 100644 --- a/frontend/src/components/layout/AppSidebar.vue +++ b/frontend/src/components/layout/AppSidebar.vue @@ -36,6 +36,7 @@ class="sidebar-link mb-1" :class="{ 'sidebar-link-active': isActive(item.path) }" :title="sidebarCollapsed ? item.label : undefined" + @click="handleMenuItemClick" > @@ -58,6 +59,7 @@ class="sidebar-link mb-1" :class="{ 'sidebar-link-active': isActive(item.path) }" :title="sidebarCollapsed ? item.label : undefined" + @click="handleMenuItemClick" > @@ -77,6 +79,7 @@ class="sidebar-link mb-1" :class="{ 'sidebar-link-active': isActive(item.path) }" :title="sidebarCollapsed ? item.label : undefined" + @click="handleMenuItemClick" > @@ -142,9 +145,9 @@ const appStore = useAppStore(); const authStore = useAuthStore(); const sidebarCollapsed = computed(() => appStore.sidebarCollapsed); +const mobileOpen = computed(() => appStore.mobileOpen); const isAdmin = computed(() => authStore.isAdmin); const isDark = ref(document.documentElement.classList.contains('dark')); -const mobileOpen = ref(false); // Site settings const siteName = ref('Sub2API'); @@ -303,7 +306,15 @@ function toggleTheme() { } function closeMobile() { - mobileOpen.value = false; + appStore.setMobileOpen(false); +} + +function handleMenuItemClick() { + if (mobileOpen.value) { + setTimeout(() => { + appStore.setMobileOpen(false); + }, 150); + } } function isActive(path: string): boolean { diff --git a/frontend/src/stores/app.ts b/frontend/src/stores/app.ts index 4313cb82..1bf1a6f3 100644 --- a/frontend/src/stores/app.ts +++ b/frontend/src/stores/app.ts @@ -12,6 +12,7 @@ export const useAppStore = defineStore('app', () => { // ==================== State ==================== const sidebarCollapsed = ref(false); + const mobileOpen = ref(false); const loading = ref(false); const toasts = ref([]); @@ -50,6 +51,21 @@ export const useAppStore = defineStore('app', () => { sidebarCollapsed.value = collapsed; } + /** + * Toggle mobile sidebar open state + */ + function toggleMobileSidebar(): void { + mobileOpen.value = !mobileOpen.value; + } + + /** + * Set mobile sidebar open state explicitly + * @param open - Whether mobile sidebar should be open + */ + function setMobileOpen(open: boolean): void { + mobileOpen.value = open; + } + /** * Set global loading state * @param isLoading - Whether app is in loading state @@ -257,6 +273,7 @@ export const useAppStore = defineStore('app', () => { return { // State sidebarCollapsed, + mobileOpen, loading, toasts, @@ -275,6 +292,8 @@ export const useAppStore = defineStore('app', () => { // Actions toggleSidebar, setSidebarCollapsed, + toggleMobileSidebar, + setMobileOpen, setLoading, showToast, showSuccess, diff --git a/frontend/src/views/admin/UsageView.vue b/frontend/src/views/admin/UsageView.vue index 7c3f98aa..d0aec771 100644 --- a/frontend/src/views/admin/UsageView.vue +++ b/frontend/src/views/admin/UsageView.vue @@ -43,13 +43,12 @@ -
+

{{ t('usage.totalCost') }}

-
-

${{ (usageStats?.total_actual_cost || 0).toFixed(4) }}

- ${{ (usageStats?.total_cost || 0).toFixed(4) }} -
-

{{ t('usage.actualCost') }} / {{ t('usage.standardCost') }}

+

${{ (usageStats?.total_actual_cost || 0).toFixed(4) }}

+

+ {{ t('usage.actualCost') }} / ${{ (usageStats?.total_cost || 0).toFixed(4) }} {{ t('usage.standardCost') }} +

diff --git a/frontend/src/views/user/UsageView.vue b/frontend/src/views/user/UsageView.vue index c81f4c87..eda1f021 100644 --- a/frontend/src/views/user/UsageView.vue +++ b/frontend/src/views/user/UsageView.vue @@ -43,13 +43,12 @@ -
+

{{ t('usage.totalCost') }}

-
-

${{ (usageStats?.total_actual_cost || 0).toFixed(4) }}

- ${{ (usageStats?.total_cost || 0).toFixed(4) }} -
-

{{ t('usage.actualCost') }} / {{ t('usage.standardCost') }}

+

${{ (usageStats?.total_actual_cost || 0).toFixed(4) }}

+

+ {{ t('usage.actualCost') }} / ${{ (usageStats?.total_cost || 0).toFixed(4) }} {{ t('usage.standardCost') }} +