Luca Perullo
Components

Component

LiveNew

Command Palette

Modal portal-rendered, hotkey Cmd/Ctrl+K, ↑/↓/Enter/Esc, raggruppamento per `group`, filtro fuzzy su label/hint/keywords/group. Zero dipendenze (no @radix dialog). Power-user signal.

Power UserSearchModalClient
Open in ClaudeSorgente

Esempio01

command-palette.tsx

Note Il portal renderizza solo client-side (controllo typeof document !== "undefined"). triggerKey è case-insensitive. Per nascondere il trigger e aprire programmaticamente, usa showTrigger={false} e gestisci open via ref/parent state.

Prompt LLM02

Incolla in Claude o ChatGPT per generare la tua variante. Include il contesto del brand, i token e i vincoli del progetto.

Prompt · command-palette
Open in Claude
Sei un senior frontend engineer. Stai lavorando su un sito Next.js 16 + React 19 + Tailwind v4 in italiano, look chanhdai-inspired: colonna stretta 672px, Geist Sans + Geist Mono, hairline 1px, divisori a stripe diagonale, palette zinc.

Token CSS disponibili: --bg, --bg-alt, --fg, --fg-muted, --fg-soft, --border, --border-strong, --accent. Usa SEMPRE queste variabili tramite le utility tailwind generate (bg-bg, text-fg-muted, border-border, ecc.). Helper "cn" da "@/lib/utils". Niente librerie UI extra: solo lucide-react e tailwind-merge.

Genera un componente <CommandPalette> Cmd+K.
Type:
- CommandItem = { id, label, hint?, icon?, group?, keywords?, onSelect: () => void }
Props:
- items: CommandItem[].
- triggerKey?: string (default "k").
- placeholder?: string.
- showTrigger?: boolean (default true).
- className?: string.

Implementazione:
- "use client".
- useEffect window keydown: meta+triggerKey → toggle open, Esc → close.
- Modal via createPortal(document.body), backdrop con backdrop-blur-sm + bg color-mix.
- Input di ricerca focused on open. Filtro fuzzy: includes su label+hint+group+keywords.
- Gruppi: Map<string, CommandItem[]>, sticky header per ogni gruppo.
- Keyboard: ArrowUp/Down su flat index, Enter chiama onSelect + close.
- Active item highlighted, scrollIntoView({ block: "nearest" }).
- Footer con kbd hint (↑↓ nav · ↵ apri) e count risultati.

Output: file completo src/components/command-palette.tsx.

Uso tipico03

tsx
<CommandPalette
  items={[{ id, label, group?, hint?, icon?, onSelect }]}
  triggerKey="k"
/>

Dipendenze04

npm
  • tailwind-merge
  • clsx
  • lucide-react
Interno
  • @/lib/utils#cn
  • react-dom (portal)

Ti è servito? Dimmelo, oppure proponi il prossimo componente.