@@ -31,6 +31,7 @@ const index = await fetch(import.meta.resolve("observablehq:minisearch.json"))
31
31
input . addEventListener ( "input" , ( ) => {
32
32
if ( currentValue === input . value ) return ;
33
33
currentValue = input . value ;
34
+ sessionStorage . setItem ( "search-query" , currentValue ) ;
34
35
if ( ! currentValue . length ) {
35
36
container . setAttribute ( "data-shortcut" , shortcut ) ;
36
37
sidebar . classList . remove ( "observablehq-search-results" ) ;
@@ -43,22 +44,40 @@ input.addEventListener("input", () => {
43
44
resultsContainer . innerHTML =
44
45
results . length === 0
45
46
? "<div>no results</div>"
46
- : `<div>${ results . length . toLocaleString ( "en-US" ) } result${ results . length === 1 ? "" : "s" } </div><ol>${ results
47
- . map ( renderResult )
48
- . join ( "" ) } </ol>`;
47
+ : `<div>${ results . length . toLocaleString ( "en-US" ) } result${
48
+ results . length === 1 ? "" : "s"
49
+ } </div><ol>${ renderResults ( results ) } </ol>`;
50
+ resultsContainer . querySelector ( `.${ activeClass } ` ) ?. scrollIntoView ( { block : "nearest" } ) ;
49
51
} ) ;
50
52
53
+ function renderResults ( results ) {
54
+ const me = document . location . href . replace ( / [ ? # ] .* / , "" ) ;
55
+ let found ;
56
+ results = results . map ( ( { id, score, title} ) => {
57
+ const external = / ^ \w + : / . test ( id ) ;
58
+ const href = external ? id : import . meta. resolve ( `..${ id } ` ) ;
59
+ return {
60
+ title : String ( title ?? "—" ) ,
61
+ href,
62
+ external,
63
+ score : Math . min ( 5 , Math . round ( 0.6 * score ) ) ,
64
+ active : me === href && ( found = true )
65
+ } ;
66
+ } ) ;
67
+ if ( ! found ) results [ 0 ] . active = true ;
68
+ return results . map ( renderResult ) . join ( "" ) ;
69
+ }
70
+
51
71
function isExternal ( id ) {
52
72
return / ^ \w + : / . test ( id ) ;
53
73
}
54
74
55
- function renderResult ( { id, score, title} , i ) {
56
- const external = / ^ \w + : / . test ( id ) ;
57
- return `<li data-score="${ Math . min ( 5 , Math . round ( 0.6 * score ) ) } " class="observablehq-link${
58
- i === 0 ? ` ${ activeClass } ` : ""
59
- } "><a href="${ escapeDoubleQuote ( external ? id : import . meta. resolve ( `..${ id } ` ) ) } "${
60
- external ? ' target="_blank"' : ""
61
- } ><span>${ escapeText ( String ( title ?? "—" ) ) } </span></a></li>`;
75
+ function renderResult ( { href, score, external, title, active} ) {
76
+ return `<li data-score="${ score } " class="observablehq-link${
77
+ active ? ` ${ activeClass } ` : ""
78
+ } "><a href="${ escapeDoubleQuote ( href ) } "${ external ? ' target="_blank"' : "" } ><span>${ escapeText (
79
+ title
80
+ ) } </span></a></li>`;
62
81
}
63
82
64
83
function escapeDoubleQuote ( text ) {
0 commit comments