From 8f2eae425cb47cbfb07a84665c4e70b3a211e0ad Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Fri, 27 Feb 2026 00:02:43 -0500 Subject: [PATCH] feat(ui): replace sidebar with slim top navigation bar Co-Authored-By: Claude Opus 4.6 --- TaskTracker.Web/src/components/Layout.tsx | 111 +++++++++++++++------- 1 file changed, 75 insertions(+), 36 deletions(-) diff --git a/TaskTracker.Web/src/components/Layout.tsx b/TaskTracker.Web/src/components/Layout.tsx index 0aef1e5..7b9a3f5 100644 --- a/TaskTracker.Web/src/components/Layout.tsx +++ b/TaskTracker.Web/src/components/Layout.tsx @@ -1,7 +1,7 @@ -import { useState } from 'react' import { NavLink, Outlet, useNavigate } from 'react-router-dom' -import { LayoutGrid, BarChart3, Link, PanelLeftClose, PanelLeftOpen } from 'lucide-react' -import SearchBar from './SearchBar.tsx' +import { LayoutGrid, BarChart3, Link, Plus, Search } from 'lucide-react' +import { useState, useEffect, useCallback } from 'react' +import SearchModal from './SearchModal.tsx' const navItems = [ { to: '/board', label: 'Board', icon: LayoutGrid }, @@ -10,60 +10,99 @@ const navItems = [ ] export default function Layout() { - const [collapsed, setCollapsed] = useState(false) const navigate = useNavigate() + const [searchOpen, setSearchOpen] = useState(false) + const [showCreateHint, setShowCreateHint] = useState(false) + + // Global Cmd+K handler + const handleGlobalKeyDown = useCallback((e: KeyboardEvent) => { + if ((e.metaKey || e.ctrlKey) && e.key === 'k') { + e.preventDefault() + setSearchOpen(true) + } + }, []) + + useEffect(() => { + document.addEventListener('keydown', handleGlobalKeyDown) + return () => document.removeEventListener('keydown', handleGlobalKeyDown) + }, [handleGlobalKeyDown]) return ( -
- {/* Sidebar */} - - {/* Main area */} -
- {/* Top bar */} -
-

TaskTracker

- navigate(`/board?task=${taskId}`)} /> -
+ {/* New task button */} + + - {/* Content */} -
- -
-
+ {/* Content */} +
+ +
+ + {/* Search modal */} + {searchOpen && ( + { + setSearchOpen(false) + navigate(`/board?task=${taskId}`) + }} + onClose={() => setSearchOpen(false)} + /> + )}
) }