@@ -38,20 +38,27 @@ input.addEventListener("input", () => {
38
38
container . setAttribute ( "data-shortcut" , "" ) ; // prevent conflict with close button
39
39
sidebar . classList . add ( "observablehq-search-results" ) ; // hide pages while showing search results
40
40
const results = index . search ( currentValue , { boost : { title : 4 , keywords : 4 } , fuzzy : 0.15 , prefix : true } ) ;
41
+ const previous = sessionStorage . getItem ( "observablehq-search-chosen" ) ;
41
42
resultsContainer . innerHTML =
42
43
results . length === 0
43
44
? "<div>no results</div>"
44
45
: `<div>${ results . length . toLocaleString ( "en-US" ) } result${ results . length === 1 ? "" : "s" } </div><ol>${ results
45
- . map ( renderResult )
46
+ . map ( ( { id, score, title} , i ) => {
47
+ const href = import . meta. resolve ( `../${ id } ` ) ;
48
+ return `<li data-score="${ Math . min ( 5 , Math . round ( 0.6 * score ) ) } " class="observablehq-link${
49
+ ( previous === null ? i === 0 : href === previous ) ? ` ${ activeClass } ` : ""
50
+ } "><a href="${ escapeDoubleQuote (
51
+ href
52
+ ) } " onclick='sessionStorage.setItem("observablehq-search-chosen",this.getAttribute("href"))'
53
+ >${ escapeText ( String ( title ?? "—" ) ) } </a></li>` ;
54
+ } )
46
55
. join ( "" ) } </ol>`;
56
+ if ( previous !== null ) {
57
+ resultsContainer . querySelector ( `.${ activeClass } ` ) . scrollIntoView ( { block : "nearest" } ) ;
58
+ sessionStorage . removeItem ( "observablehq-search-chosen" ) ;
59
+ }
47
60
} ) ;
48
61
49
- function renderResult ( { id, score, title} , i ) {
50
- return `<li data-score="${ Math . min ( 5 , Math . round ( 0.6 * score ) ) } " class="observablehq-link${
51
- i === 0 ? ` ${ activeClass } ` : ""
52
- } "><a href="${ escapeDoubleQuote ( import . meta. resolve ( `../${ id } ` ) ) } ">${ escapeText ( String ( title ?? "—" ) ) } </a></li>`;
53
- }
54
-
55
62
function escapeDoubleQuote ( text ) {
56
63
return text . replace ( / [ " & ] / g, entity ) ;
57
64
}
0 commit comments