diff --git a/src/components/layout/CommandPalette.tsx b/src/components/layout/CommandPalette.tsx
index 19976da..10e9db8 100644
--- a/src/components/layout/CommandPalette.tsx
+++ b/src/components/layout/CommandPalette.tsx
@@ -40,10 +40,17 @@ export function CommandPalette({ open, onOpenChange, initialQuery }: CommandPale
const navigate = useNavigate();
const [q, setQ] = useState('');
- useHotkeys('mod+k', () => onOpenChange(!open), {
- enableOnFormTags: true,
- preventDefault: true,
- });
+ useHotkeys(
+ 'mod+k',
+ () => onOpenChange(!open),
+ {
+ enableOnFormTags: true,
+ preventDefault: true,
+ },
+ // Without deps the callback keeps the first render's `open` (false), so
+ // the shortcut could open the palette but never toggle it closed.
+ [open, onOpenChange],
+ );
// Seed (or clear) the query whenever the palette opens; typing in the
// sidebar input while open appends through the same channel.
diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx
index 9be7797..43e89a0 100644
--- a/src/components/layout/Sidebar.tsx
+++ b/src/components/layout/Sidebar.tsx
@@ -1,6 +1,4 @@
-import { Search } from 'lucide-react';
import { useMe } from '../../features/auth/hooks/useAuth';
-import { NotificationBell } from '../../features/notifications/components/NotificationBell';
import { Logo } from '../brand/Logo';
import { SidebarNav } from './SidebarNav';
import { UserFooter } from './UserFooter';
@@ -9,17 +7,16 @@ import { WorkspaceSwitcher } from './WorkspaceSwitcher';
interface SidebarProps {
/** Called after a nav link is activated (closes the mobile drawer). */
onNavigate?: () => void;
- /** Opens the command palette, optionally seeded with typed text. */
- onSearch: (seed?: string) => void;
}
/**
* The persistent navigation frame: workspace identity + switcher fixed at the
* top, an independently scrollable nav list in the middle, and the user
* footer fixed at the bottom. Rendered both as the desktop rail and inside
- * the mobile drawer.
+ * the mobile drawer. Search and the notification bell live in the shell's
+ * top bar (TopBar on desktop, MobileTopBar below lg), not here.
*/
-export function Sidebar({ onNavigate, onSearch }: SidebarProps) {
+export function Sidebar({ onNavigate }: SidebarProps) {
const { data: me } = useMe();
if (!me?.workspace) return null; // guarded by WorkspaceRoute; satisfies types
@@ -29,34 +26,6 @@ export function Sidebar({ onNavigate, onSearch }: SidebarProps) {
- {/* Operational inbox: right edge of the shell header, before the
- user's own controls — the "top of the app" position. */}
-
- {/* Real search input, centered at the top of the sidebar. Focusing
- or typing hands off to the floating palette (seeded with the
- typed text) — one search surface, so the input itself stays
- empty and the palette owns the query. */}
-
-
-
-
-
- onSearch()}
- onChange={(event) => onSearch(event.target.value)}
- className="w-full rounded border border-steel/20 bg-canvas py-1.5 pl-8 pr-14 text-sm text-charcoal transition-colors placeholder:text-steel hover:border-steel/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary"
- />
-
- Ctrl K
-