Design system
Docs
Surfaces

Command palette and search

⌘K: sessions, files, actions, and settings in one modal menu, and the client action table it draws from

HostImplementationNote
Primitive@nyte-ai/ui/menu, /tabs
Desktopchrome/search-palette.tsxSearchPalette on CommandMenu
Terminalcomposer-actions.ts openActionPaletteCtrl+K via selectChoice (later pass)

SearchPalette

File: packages/desktop/src/renderer/src/chrome/search-palette.tsx.

PropTypeDescription
openbooleanControlled.
platformNodeJS.Platform | undefinedFor shortcut glyphs.
sessionQueriesAvailablebooleanGate for session queries (host state loaded).
onOpenChange(open: boolean) => void
onOpenSession(sessionId) => void
onNewChat, onOpenFolder, onOpenCustomize() => void
onOpenHome(() => void) | undefinedUndefined hides the "Open home" action.
onOpenSettings(section: SettingsSection) => void

Anatomy

CommandMenu label="Search" (modal, viewport-anchored)
└─ <search>
   ├─ input aria-label="Search" aria-controls="{id}-{tab}"     focused via rAF on open
   ├─ Tabs.Root › Tabs.List aria-label="Search categories"     all · Chats · files · actions · settings
   ├─ Tabs.Panel per tab
   │  └─ MenuItem itemStyle=result leading=<StatusDot> meta=formatTimeAgo | <Kbd plain>
   └─ srOnly role="status"   result count; "One stable node the whole time the palette is open"

Actions come from shared/client-actions.ts entries that declare a palette field.

Keyboard

KeyWhereEffect
⌘K / Ctrl+KwindowToggle (global keydown, resolved through resolveClientAction)
ArrowDowninputFocus first [role="menuitem"]:not([data-disabled])
ArrowUpinputFocus last
Arrows, typeahead, Enter, EscapelistBase UI menu

Rules

  • The live region is one node that stays mounted; replacing it per result set would re-announce from scratch.
  • Results are MenuItems so the keyboard model is the menu's; the input only hands off focus.
  • Session rows show state through StatusDot (a labelled role="img"), never through color alone.

Client actions

packages/desktop/src/shared/client-actions.ts is the single table of window-level shortcuts. Kbd displays them, aria-keyshortcuts advertises them, and resolveClientAction(event, mac, scope) decides which one an event is.

idmacOSOtherScopeHandled in
new-chat⌘NCtrl+Nwindowshell / main process
search⌘KCtrl+KwindowSearchPalette
settings⌘,Ctrl+,outside-settingsshell
back⌘[Ctrl+[windowshell
forward⌘]Ctrl+]windowshell
sidebar⌘BCtrl+Boutside-settingsshell
split-right⌘DCtrl+Dworkspacepane controller
split-down⇧⌘DShift+Ctrl+Dworkspacepane controller
workbench⌥⌘BAlt+Ctrl+BworkspaceTitlebar
terminal⌃`Ctrl+`workspaceTitlebar
new-terminal⇧⌃`Shift+Ctrl+`workspaceTitlebar
focus-paneF6F6workspacepane controller

Add a shortcut there, not in a component. A component that wants to react to one calls resolveClientAction with its scope.