Frontend: global ⌘K command-palette / omnibox search #33

Open
opened 2026-06-04 10:54:36 +00:00 by logaritmisk · 0 comments
Owner

Context

Milestone 5 shipped the dedicated /search two-pane screen. During M5 brainstorming we chose "both" for the search entry point: the dedicated route now, and a global omnibox later. This issue is that follow-up.

Ask

A ⌘K (Cmd/Ctrl-K) command palette, available from any route in the authenticated app shell, that:

  • opens a modal with a query input (reusing the existing useSearch infinite-query hook + useDebouncedValue),
  • shows a compact results dropdown (object name + number + visibility badge; the rich two-line snippet rows from /search are probably too tall for a palette — a one-line variant),
  • navigates to the object on select (/search/:id or /objects/:id — decide which), and
  • is keyboard-driven (↑/↓ to move, Enter to open, Esc to close).

Notes

  • The data layer already exists (web/src/api/queries.ts useSearch, backend GET /api/admin/search) — this is purely a new presentation surface, no backend work.
  • shadcn (Base UI "base-nova" registry) has a Command/Dialog primitive — check mcp__shadcn for an existing palette component before hand-rolling.
  • Consider whether the palette and the /search page should share a results-row component (a compact vs rich variant of SearchResultRow).
  • Reuse the existing search.* i18n namespace; add palette-specific keys at en/sv parity.
## Context Milestone 5 shipped the dedicated `/search` two-pane screen. During M5 brainstorming we chose **"both"** for the search entry point: the dedicated route now, and a global omnibox later. This issue is that follow-up. ## Ask A ⌘K (Cmd/Ctrl-K) command palette, available from any route in the authenticated app shell, that: - opens a modal with a query input (reusing the existing `useSearch` infinite-query hook + `useDebouncedValue`), - shows a compact results dropdown (object name + number + visibility badge; the rich two-line snippet rows from `/search` are probably too tall for a palette — a one-line variant), - navigates to the object on select (`/search/:id` or `/objects/:id` — decide which), and - is keyboard-driven (↑/↓ to move, Enter to open, Esc to close). ## Notes - The data layer already exists (`web/src/api/queries.ts` `useSearch`, backend `GET /api/admin/search`) — this is purely a new presentation surface, no backend work. - shadcn (Base UI "base-nova" registry) has a Command/Dialog primitive — check `mcp__shadcn` for an existing palette component before hand-rolling. - Consider whether the palette and the `/search` page should share a results-row component (a compact vs rich variant of `SearchResultRow`). - Reuse the existing `search.*` i18n namespace; add palette-specific keys at en/sv parity.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: logaritmisk/biggus-dickus#33