11<script setup lang="ts">
2- import { debounce } from ' perfect-debounce'
3-
42withDefaults (
53 defineProps <{
64 showLogo? : boolean
@@ -21,23 +19,7 @@ const buildInfo = useAppConfig().buildInfo
2119const searchQuery = ref (' ' )
2220const isSearchFocused = ref (false )
2321
24- const showSearchBar = computed (() => {
25- return route .name !== ' search' && route .name !== ' index'
26- })
27-
28- const debouncedNavigate = debounce (async () => {
29- const query = searchQuery .value .trim ()
30- await router .push ({
31- name: ' search' ,
32- query: query ? { q: query } : undefined ,
33- })
34- // allow time for the navigation to occur before resetting searchQuery
35- setTimeout (() => (searchQuery .value = ' ' ), 1000 )
36- }, 100 )
37-
38- async function handleSearchInput() {
39- debouncedNavigate ()
40- }
22+ const showFullSearch = ref (false )
4123
4224onKeyStroke (' ,' , e => {
4325 // Don't trigger if user is typing in an input
@@ -58,8 +40,8 @@ onKeyStroke(',', e => {
5840 class =" container h-14 flex items-center justify-start"
5941 >
6042 <!-- Start: Logo -->
61- <div class =" flex-shrink-0" >
62- <div v-if =" showLogo" class = " " >
43+ <div :class = " { 'hidden sm:block': showFullSearch } " class =" flex-shrink-0" >
44+ <div v-if =" showLogo" >
6345 <NuxtLink
6446 to =" /"
6547 :aria-label =" $t('header.home')"
@@ -76,41 +58,17 @@ onKeyStroke(',', e => {
7658 </div >
7759
7860 <!-- Center: Search bar + nav items -->
79- <div class =" flex-1 flex items-center justify-center gap-4 sm:gap-6" >
80- <!-- Search bar (shown on all pages except home and search) -->
81- <search v-if =" showSearchBar" class =" hidden sm:block flex-1 max-w-md" >
82- <form method =" GET" action =" /search" class =" relative" @submit.prevent =" handleSearchInput" >
83- <label for =" header-search" class =" sr-only" >
84- {{ $t('search.label') }}
85- </label >
86-
87- <div class =" relative group" :class =" { 'is-focused': isSearchFocused }" >
88- <div class =" search-box relative flex items-center" >
89- <span
90- class =" absolute inset-is-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"
91- >
92- /
93- </span >
94-
95- <input
96- id =" header-search"
97- v-model =" searchQuery"
98- type =" search"
99- name =" q"
100- :placeholder =" $t('search.placeholder')"
101- v-bind =" noCorrect"
102- class =" w-full bg-bg-subtle border border-border rounded-md ps-7 pe-3 py-1.5 font-mono text-sm text-fg placeholder:text-fg-subtle transition-border-color duration-300 motion-reduce:transition-none focus:border-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50"
103- @input =" handleSearchInput"
104- @focus =" isSearchFocused = true"
105- @blur =" isSearchFocused = false"
106- />
107- <button type =" submit" class =" sr-only" >{{ $t('search.button') }}</button >
108- </div >
109- </div >
110- </form >
111- </search >
112-
113- <ul class =" flex items-center gap-4 sm:gap-6 list-none m-0 p-0" >
61+ <div class =" flex-1 flex items-center justify-center md:gap-6 mx-2" >
62+ <!-- Search bar (shown on all pages except home) -->
63+ <SearchBox
64+ :inputClass =" showFullSearch ? '' : 'max-w[6rem]'"
65+ @focus =" showFullSearch = true"
66+ @blur =" showFullSearch = false"
67+ />
68+ <ul
69+ :class =" { 'hidden sm:flex': showFullSearch }"
70+ class =" flex items-center gap-4 sm:gap-6 list-none m-0 p-0"
71+ >
11472 <!-- Packages dropdown (when connected) -->
11573 <li v-if =" isConnected && npmUser" class =" flex items-center" >
11674 <HeaderPackagesDropdown :username =" npmUser" />
@@ -124,7 +82,10 @@ onKeyStroke(',', e => {
12482 </div >
12583
12684 <!-- End: User status + GitHub -->
127- <div class =" flex-shrink-0 flex items-center gap-4 sm:gap-6 ms-auto sm:ms-0" >
85+ <div
86+ :class =" { 'hidden sm:flex': showFullSearch }"
87+ class =" flex-shrink-0 flex items-center gap-4 sm:gap-6 ms-auto sm:ms-0"
88+ >
12889 <NuxtLink
12990 to =" /about"
13091 class =" sm:hidden link-subtle font-mono text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent/50 rounded"
0 commit comments