Skip to content

Commit f2b53bf

Browse files
committed
feat(ui): add command palette for quick navigation and actions
1 parent 4294ada commit f2b53bf

35 files changed

+3590
-19
lines changed

app/app.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ if (import.meta.client) {
144144
<NuxtPage />
145145
</div>
146146

147+
<CommandPalette />
148+
147149
<AppFooter />
148150

149151
<ScrollToTop />

app/components/AppFooter.vue

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const route = useRoute()
55
const isHome = computed(() => route.name === 'index')
66
77
const discord = useDiscordLink()
8+
const { commandPaletteShortcutLabel } = usePlatformModifierKey()
89
const modalRef = useTemplateRef('modalRef')
910
const showModal = () => modalRef.value?.showModal?.()
1011
const closeModal = () => modalRef.value?.close?.()
@@ -52,10 +53,17 @@ const closeModal = () => modalRef.value?.close?.()
5253
:modalTitle="$t('footer.keyboard_shortcuts')"
5354
class="w-auto max-w-lg"
5455
>
56+
<p class="mb-4 text-sm leading-relaxed text-fg-muted">
57+
{{ $t('shortcuts.command_palette_description') }}
58+
</p>
5559
<p class="mb-2 font-mono text-fg-subtle">
5660
{{ $t('shortcuts.section.global') }}
5761
</p>
5862
<ul class="mb-6 flex flex-col gap-2">
63+
<li class="flex gap-2 items-center">
64+
<kbd class="kbd">{{ commandPaletteShortcutLabel }}</kbd>
65+
<span>{{ $t('shortcuts.command_palette') }}</span>
66+
</li>
5967
<li class="flex gap-2 items-center">
6068
<kbd class="kbd">/</kbd>
6169
<span>{{ $t('shortcuts.focus_search') }}</span>

app/components/AppHeader.vue

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { NPMX_DOCS_SITE } from '#shared/utils/constants'
66
77
const keyboardShortcuts = useKeyboardShortcuts()
88
const discord = useDiscordLink()
9+
const { open: openCommandPalette } = useCommandPalette()
10+
const { commandPaletteShortcutLabel } = usePlatformModifierKey()
911
1012
withDefaults(
1113
defineProps<{
@@ -258,6 +260,24 @@ onKeyStroke(
258260
<!-- Spacer when logo is hidden on desktop -->
259261
<span v-else class="hidden sm:block w-1" />
260262

263+
<ButtonBase
264+
type="button"
265+
variant="secondary"
266+
class="hidden lg:inline-flex shrink-0 gap-2 px-2.5 me-3"
267+
:aria-label="$t('shortcuts.command_palette')"
268+
:title="$t('shortcuts.command_palette_description')"
269+
@click="openCommandPalette"
270+
>
271+
<span>{{ $t('command_palette.quick_actions') }}</span>
272+
<span class="inline-flex items-center gap-1 text-xs text-fg-subtle">
273+
<kbd
274+
class="inline-flex items-center justify-center rounded border border-border bg-bg-muted px-1.5 py-0.5 font-mono text-[0.7rem] text-fg-muted"
275+
>
276+
{{ commandPaletteShortcutLabel }}
277+
</kbd>
278+
</span>
279+
</ButtonBase>
280+
261281
<!-- Center: Search bar + nav items -->
262282
<div
263283
class="flex-1 flex items-center md:gap-6"
@@ -293,7 +313,7 @@ onKeyStroke(
293313
</div>
294314

295315
<!-- End: Desktop nav items + Mobile menu button -->
296-
<div class="hidden sm:flex flex-shrink-0">
316+
<div class="hidden sm:flex flex-shrink-0 items-center gap-2">
297317
<!-- Desktop: Explore link -->
298318
<LinkBase
299319
v-for="link in desktopLinks"

0 commit comments

Comments
 (0)