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.tsuseSearch, 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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Context
Milestone 5 shipped the dedicated
/searchtwo-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:
useSearchinfinite-query hook +useDebouncedValue),/searchare probably too tall for a palette — a one-line variant),/search/:idor/objects/:id— decide which), andNotes
web/src/api/queries.tsuseSearch, backendGET /api/admin/search) — this is purely a new presentation surface, no backend work.mcp__shadcnfor an existing palette component before hand-rolling./searchpage should share a results-row component (a compact vs rich variant ofSearchResultRow).search.*i18n namespace; add palette-specific keys at en/sv parity.