diff --git a/backend/src/routes/stellar.ts b/backend/src/routes/stellar.ts index 9302d4d0..dbd424c4 100644 --- a/backend/src/routes/stellar.ts +++ b/backend/src/routes/stellar.ts @@ -36,4 +36,4 @@ stellarRouter.get('/tx/:hash', cacheControl({ maxAge: CacheTTL.IMMUTABLE }), asy console.error('Stellar tx error:', error); return res.status(500).json({ message: 'Failed to fetch transaction' }); } -}); +}); \ No newline at end of file diff --git a/frontend/components/layout/CommandMenu.tsx b/frontend/components/layout/CommandMenu.tsx new file mode 100644 index 00000000..3dddc1d7 --- /dev/null +++ b/frontend/components/layout/CommandMenu.tsx @@ -0,0 +1,76 @@ +'use client'; + +import { useEffect, useState } from 'react'; +import { Search, X } from 'lucide-react'; +import { Button } from '@/components/ui/button'; + +export function CommandMenu() { + const [open, setOpen] = useState(false); + + // 1. Listen for Cmd+K or Ctrl+K + useEffect(() => { + const down = (e: KeyboardEvent) => { + if (e.key === 'k' && (e.metaKey || e.ctrlKey)) { + e.preventDefault(); + setOpen((open) => !open); + } + }; + document.addEventListener('keydown', down); + return () => document.removeEventListener('keydown', down); + }, []); + + // 2. Listen for Escape to close + useEffect(() => { + const down = (e: KeyboardEvent) => { + if (e.key === 'Escape') setOpen(false); + }; + document.addEventListener('keydown', down); + return () => document.removeEventListener('keydown', down); + }, []); + + return ( + <> + {/* 3. The Visual Search Button with Shortcut Hint */} + + + {/* The Search Modal Overlay */} + {open && ( +
setOpen(false)}> +
e.stopPropagation()}> +
+ + + +
+
+

Start typing to search across your dashboard.

+
+ Navigate with ↑ ↓ + Close with ESC +
+
+
+
+ )} + + ); +} \ No newline at end of file diff --git a/frontend/components/layout/Header.tsx b/frontend/components/layout/Header.tsx index fc4d159e..b413d6ef 100644 --- a/frontend/components/layout/Header.tsx +++ b/frontend/components/layout/Header.tsx @@ -37,6 +37,10 @@ import { ThemeSettingsModal } from '@/components/theme/ThemeSettingsModal'; import { TimezoneSettingsModal } from '@/components/settings/TimezoneSettingsModal'; import { getBrowserTimeZone, isValidTimeZone } from '@/lib/utils'; +// Our new CommandMenu! +import { CommandMenu } from './CommandMenu'; + +// I built the isolated NetworkIndicator component right here /* ---------------- TYPES ---------------- */ type BreadcrumbItemType = { label: string; @@ -152,6 +156,8 @@ export function Header() { {/* RIGHT */}
+ + {/* Notifications */}