@@ -13,6 +13,24 @@ withDefaults(
1313const { isConnected, npmUser } = useConnector ()
1414
1515const router = useRouter ()
16+ const route = useRoute ()
17+
18+ const searchQuery = ref (' ' )
19+ const isSearchFocused = ref (false )
20+
21+ const showSearchBar = computed (() => {
22+ return route .name !== ' search' && route .name !== ' index'
23+ })
24+
25+ async function handleSearchInput() {
26+ const query = searchQuery .value .trim ()
27+ await router .push ({
28+ name: ' search' ,
29+ query: query ? { q: query } : undefined ,
30+ })
31+ searchQuery .value = ' '
32+ }
33+
1634onKeyStroke (' ,' , e => {
1735 // Don't trigger if user is typing in an input
1836 const target = e .target as HTMLElement
@@ -54,28 +72,28 @@ onKeyStroke('.', e => {
5472 <span v-else class =" w-1" />
5573 </div >
5674
57- <!-- Center: Main nav items -->
58- <ul class =" flex-1 flex items-center justify-center gap-4 sm:gap-6 list-none m-0 p-0" >
59- <li class =" flex items-center" >
60- <NuxtLink
61- to =" /search"
62- class =" link-subtle font-mono text-sm inline-flex items-center gap-2"
63- aria-keyshortcuts =" /"
75+ <!-- Center: Search bar + nav items -->
76+ <div class =" flex-1 flex items-center justify-center gap-4 sm:gap-6" >
77+ <!-- Search bar (shown on all pages except home and search) -->
78+ <search v-if =" showSearchBar" class =" hidden sm:block flex-1 max-w-md" >
79+ <form
80+ role =" search"
81+ method =" GET"
82+ action =" /search"
83+ class =" relative"
84+ @submit.prevent =" handleSearchInput"
6485 >
65- {{ $t('nav.search') }}
66- <kbd
67- class =" hidden sm:inline-flex items-center justify-center w-5 h-5 text-xs bg-bg-muted border border-border rounded"
68- aria-hidden =" true"
69- >
70- /
71- </kbd >
72- </NuxtLink >
73- </li >
86+ <label for =" header-search" class =" sr-only" >
87+ {{ $t('search.label') }}
88+ </label >
7489
75- <!-- Packages dropdown (when connected) -->
76- <li v-if =" isConnected && npmUser" class =" flex items-center" >
77- <HeaderPackagesDropdown :username =" npmUser" />
78- </li >
90+ <div class =" relative group" :class =" { 'is-focused': isSearchFocused }" >
91+ <div class =" search-box relative flex items-center" >
92+ <span
93+ class =" absolute left-3 text-fg-subtle font-mono text-sm pointer-events-none transition-colors duration-200 motion-reduce:transition-none group-focus-within:text-accent z-1"
94+ >
95+ /
96+ </span >
7997
8098 <!-- Orgs dropdown (when connected) -->
8199 <li v-if =" isConnected && npmUser" class =" flex items-center" >
@@ -99,11 +117,31 @@ onKeyStroke('.', e => {
99117 </li >
100118 </ul >
101119
120+ <ul class =" flex items-center gap-4 sm:gap-6 list-none m-0 p-0" >
121+ <!-- Packages dropdown (when connected) -->
122+ <li v-if =" isConnected && npmUser" class =" flex items-center" >
123+ <HeaderPackagesDropdown :username =" npmUser" />
124+ </li >
125+
126+ <!-- Orgs dropdown (when connected) -->
127+ <li v-if =" isConnected && npmUser" class =" flex items-center" >
128+ <HeaderOrgsDropdown :username =" npmUser" />
129+ </li >
130+ </ul >
131+ </div >
132+
102133 <!-- Right: User status + GitHub -->
103- <div class =" flex-shrink-0 flex items-center gap-6" >
134+ <div class =" flex-shrink-0 flex items-center gap-4 sm:gap-6 ml-auto sm:ml-0" >
135+ <NuxtLink
136+ to =" /about"
137+ class =" sm:hidden link-subtle font-mono text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50 rounded"
138+ >
139+ {{ $t('footer.about') }}
140+ </NuxtLink >
141+
104142 <NuxtLink
105143 to =" /settings"
106- class =" link-subtle font-mono text-sm inline-flex items-center gap-2"
144+ class =" link-subtle font-mono text-sm inline-flex items-center gap-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50 rounded "
107145 aria-keyshortcuts =" ,"
108146 >
109147 {{ $t('nav.settings') }}
@@ -115,19 +153,9 @@ onKeyStroke('.', e => {
115153 </kbd >
116154 </NuxtLink >
117155
118- <div v-if =" showConnector" >
156+ <div v-if =" showConnector" class = " hidden sm:block " >
119157 <ConnectorStatus />
120158 </div >
121-
122- <a
123- href =" https://github.com/npmx-dev/npmx.dev"
124- target =" _blank"
125- rel =" noopener noreferrer"
126- class =" link-subtle"
127- :aria-label =" $t('header.github')"
128- >
129- <span class =" i-carbon-logo-github w-5 h-5" aria-hidden =" true" />
130- </a >
131159 </div >
132160 </nav >
133161 </header >
0 commit comments