import { useEffect, useId, useMemo, useState } from 'react' import { useNavigate } from '@tanstack/react-router' import { Search } from 'lucide-react' import { Button } from '@evobgp/ui/components/button' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '@evobgp/ui/components/dialog' import { Input } from '@evobgp/ui/components/input' import { Kbd } from '@evobgp/ui/components/kbd' import { SidebarGroup, SidebarGroupContent, } from '@evobgp/ui/components/sidebar' export type CommandPaletteItem = { id: string label: string description?: string to: string search?: Record keywords?: string[] } interface CommandPaletteProps { items: CommandPaletteItem[] className?: string /** Hotkey-only: no sidebar search trigger (chrome parity with CFDM). */ hotkeyOnly?: boolean } export function CommandPalette({ items, hotkeyOnly = false }: CommandPaletteProps) { const [open, setOpen] = useState(false) const [query, setQuery] = useState('') const searchInputId = useId() const navigate = useNavigate() useEffect(() => { function onKeyDown(event: KeyboardEvent) { if (event.key.toLowerCase() === 'k' && (event.metaKey || event.ctrlKey)) { event.preventDefault() setOpen(true) } } window.addEventListener('keydown', onKeyDown) return () => window.removeEventListener('keydown', onKeyDown) }, []) const filtered = useMemo(() => { const q = query.trim().toLowerCase() if (!q) return items return items.filter((item) => { const haystack = [item.label, item.description, ...(item.keywords ?? [])] .filter(Boolean) .join(' ') .toLowerCase() return haystack.includes(q) }) }, [items, query]) function go(item: CommandPaletteItem) { setOpen(false) setQuery('') void navigate({ to: item.to, search: item.search }) } return ( <> {!hotkeyOnly ? ( ⌘K ) : null} { setOpen(next) if (!next) setQuery('') }} > Быстрый переход Навигация по разделам EvoBGP
setQuery(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter' && filtered[0]) go(filtered[0]) }} />
    {filtered.length === 0 ? (
  • Ничего не найдено
  • ) : ( filtered.map((item) => (
  • )) )}
) }