@@ -184,8 +184,21 @@ function ShellComponent({ children }: { children: React.ReactNode }) {
184184 select : ( s ) => s . location ?. pathname || '/' ,
185185 } )
186186
187+ const canonicalSearchStr = useRouterState ( {
188+ select : ( s ) => s . location ?. searchStr || '' ,
189+ } )
190+
191+ const includeSearchInCanonical = useMatches ( {
192+ select : ( s ) =>
193+ s . some ( ( d ) => d . staticData ?. includeSearchInCanonical === true ) ,
194+ } )
195+
187196 const preferredCanonicalPath = getCanonicalPath ( canonicalPath )
188- const pageUrl = canonicalUrl ( preferredCanonicalPath ?? canonicalPath )
197+ const canonicalSearch = includeSearchInCanonical ? canonicalSearchStr : ''
198+ const pageUrl = canonicalUrl (
199+ preferredCanonicalPath ?? canonicalPath ,
200+ canonicalSearch ,
201+ )
189202
190203 const showDevtools = import . meta. env . DEV && canShowDevtools
191204
@@ -199,7 +212,10 @@ function ShellComponent({ children }: { children: React.ReactNode }) {
199212 < html lang = "en" className = { htmlClass } suppressHydrationWarning >
200213 < head >
201214 { preferredCanonicalPath ? (
202- < link rel = "canonical" href = { canonicalUrl ( preferredCanonicalPath ) } />
215+ < link
216+ rel = "canonical"
217+ href = { canonicalUrl ( preferredCanonicalPath , canonicalSearch ) }
218+ />
203219 ) : null }
204220 < meta property = "og:url" content = { pageUrl } />
205221 < meta name = "twitter:url" content = { pageUrl } />
@@ -259,18 +275,23 @@ function SearchHotkeyController() {
259275
260276 React . useEffect ( ( ) => {
261277 const handleGlobalKeyDown = ( event : KeyboardEvent ) => {
262- if ( event . defaultPrevented ) return
263278 if ( ! ( event . metaKey || event . ctrlKey ) ) return
264- if ( event . key . toLowerCase ( ) !== 'k' ) return
279+ if ( event . altKey || event . shiftKey ) return
280+ // Match both `key` and `code` so the shortcut works on non-QWERTY layouts.
281+ const isK = event . key . toLowerCase ( ) === 'k' || event . code === 'KeyK'
282+ if ( ! isK ) return
265283
266284 event . preventDefault ( )
285+ event . stopPropagation ( )
267286 setHasOpenedSearch ( true )
268287 openSearch ( )
269288 }
270289
271- window . addEventListener ( 'keydown' , handleGlobalKeyDown )
290+ document . addEventListener ( 'keydown' , handleGlobalKeyDown , { capture : true } )
272291 return ( ) => {
273- window . removeEventListener ( 'keydown' , handleGlobalKeyDown )
292+ document . removeEventListener ( 'keydown' , handleGlobalKeyDown , {
293+ capture : true ,
294+ } )
274295 }
275296 } , [ openSearch ] )
276297
0 commit comments