11<template >
2- <div class =" min-h-screen bg-gray-50 dark:bg-gray-900" >
2+ <div class =" min-h-screen bg-gray-50 dark:bg-gray-900 flex flex-col " >
33 <!-- Header -->
4- <header class =" bg-white dark:bg-gray-800 shadow-sm border-b border-gray-200 dark:border-gray-700" >
4+ <header class =" bg-white dark:bg-gray-800 shadow-sm border-b border-gray-200 dark:border-gray-700 z-10 " >
55 <div class =" px-4 sm:px-6 lg:px-8" >
66 <div class =" flex items-center justify-between h-16" >
7- <div class =" flex items-center" >
7+ <div class =" flex items-center space-x-4 " >
88 <img src =" /mcphawk_logo.png" alt =" MCPHawk Logo" class =" h-[62px]" >
9- <ConnectionStatus class =" ml-4" />
9+ <div class =" h-8 w-px bg-gray-300 dark:bg-gray-600" ></div >
10+ <button
11+ @click =" toggleSidebar"
12+ class =" flex items-center gap-2 px-3 py-1.5 rounded-lg text-gray-600 dark:text-gray-300 hover:text-gray-900 dark:hover:text-gray-100 hover:bg-gray-100 dark:hover:bg-gray-700 transition-all duration-200"
13+ :title =" sidebarOpen ? 'Hide filters' : 'Show filters'"
14+ >
15+ <ViewColumnsIcon class =" h-5 w-5" />
16+ <span class =" text-sm font-medium hidden sm:inline" >
17+ {{ sidebarOpen ? 'Hide' : 'Show' }} Filters
18+ </span >
19+ </button >
20+ <ConnectionStatus />
1021 </div >
1122 <div class =" flex items-center space-x-4" >
1223 <StatsPanel />
1627 </div >
1728 </header >
1829
19- <!-- Main Content -->
20- <main class =" flex-1" >
21- <div class =" px-4 sm:px-6 lg:px-8 py-4" >
22- <!-- Filters -->
23- <div class =" mb-4" >
24- <LogFilters />
30+ <!-- Main Content Area -->
31+ <div class =" flex-1 flex overflow-hidden" >
32+ <!-- Sidebar -->
33+ <aside
34+ :class =" [
35+ 'w-64 flex-shrink-0 overflow-hidden transition-all duration-300',
36+ windowWidth < 1024
37+ ? 'fixed inset-y-0 left-0 z-40'
38+ : 'relative',
39+ sidebarOpen
40+ ? 'translate-x-0'
41+ : '-translate-x-full lg:hidden'
42+ ]"
43+ >
44+ <div class =" h-full lg:h-full" :class =" {'mt-16': true, 'lg:mt-0': true}" >
45+ <LogFiltersSidebar />
2546 </div >
47+ </aside >
48+
49+ <!-- Mobile sidebar backdrop -->
50+ <div
51+ v-if =" sidebarOpen && windowWidth < 1024"
52+ @click =" sidebarOpen = false"
53+ class =" fixed inset-0 bg-black/50 z-30 mt-16"
54+ ></div >
2655
27- <!-- Log Table -->
28- <div class =" bg-white dark:bg-gray-800 shadow rounded-lg" >
29- <LogTable />
56+ <!-- Main Content -->
57+ <main class =" flex-1 overflow-auto" >
58+ <div class =" px-4 sm:px-6 lg:px-8 py-6" >
59+ <!-- Search Bar and Actions -->
60+ <div class =" mb-6" >
61+ <LogSearchBar />
62+ </div >
63+
64+ <!-- Log Table -->
65+ <div class =" bg-white dark:bg-gray-800 shadow-xl rounded-xl overflow-hidden" >
66+ <LogTable />
67+ </div >
3068 </div >
31- </div >
32- </main >
69+ </main >
70+ </div >
3371
3472 <!-- Message Detail Modal -->
3573 <MessageDetailModal />
3674 </div >
3775</template >
3876
3977<script setup>
40- import { onMounted , onUnmounted } from ' vue'
78+ import { onMounted , onUnmounted , ref } from ' vue'
4179import { useLogStore } from ' @/stores/logs'
4280import { useWebSocketStore } from ' @/stores/websocket'
4381import ConnectionStatus from ' @/components/common/ConnectionStatus.vue'
4482import ThemeToggle from ' @/components/common/ThemeToggle.vue'
4583import StatsPanel from ' @/components/Stats/StatsPanel.vue'
46- import LogFilters from ' @/components/LogTable/LogFilters.vue'
84+ import LogFiltersSidebar from ' @/components/LogTable/LogFiltersSidebar.vue'
85+ import LogSearchBar from ' @/components/LogTable/LogSearchBar.vue'
4786import LogTable from ' @/components/LogTable/LogTable.vue'
4887import MessageDetailModal from ' @/components/MessageDetail/MessageDetailModal.vue'
88+ import { ViewColumnsIcon } from ' @heroicons/vue/24/outline'
4989
5090const logStore = useLogStore ()
5191const wsStore = useWebSocketStore ()
92+ const sidebarOpen = ref (true ) // Default to open on desktop
93+ const windowWidth = ref (window .innerWidth )
94+
95+ // Handle window resize
96+ const handleResize = () => {
97+ windowWidth .value = window .innerWidth
98+ }
99+
100+ // Toggle sidebar
101+ const toggleSidebar = () => {
102+ sidebarOpen .value = ! sidebarOpen .value
103+ }
52104
53105onMounted (() => {
54106 // Load initial logs
55107 logStore .fetchLogs ()
56108
57109 // Connect WebSocket
58110 wsStore .connect ()
111+
112+ // Add resize listener
113+ window .addEventListener (' resize' , handleResize)
114+ handleResize () // Initial check
59115})
60116
61117onUnmounted (() => {
62118 wsStore .disconnect ()
119+ window .removeEventListener (' resize' , handleResize)
63120})
64121 </script >
0 commit comments