Skip to content

Commit dab8db7

Browse files
committed
rebased
1 parent 1b821c9 commit dab8db7

File tree

2 files changed

+35
-10
lines changed

2 files changed

+35
-10
lines changed

src/client/search-init.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ const input = container.querySelector<HTMLInputElement>("input")!;
88
const load = () => import("observablehq:search");
99
input.addEventListener("focus", load, {once: true});
1010
input.addEventListener("keydown", load, {once: true});
11+
input.addEventListener("focus", () => {
12+
if (input.value) return; // only restore the query if empty
13+
input.value = sessionStorage.getItem("search-query") ?? "";
14+
input.select();
15+
});
1116

1217
// Focus on meta-K and /
1318
const toggle = document.querySelector<HTMLInputElement>("#observablehq-sidebar-toggle")!;
@@ -22,6 +27,7 @@ addEventListener("keydown", (event) => {
2227
// open until the user blurs the input.
2328
if (toggle.checked) input.focus();
2429
else toggle.click(), input.focus(), toggle.click();
30+
input.value = sessionStorage.getItem("search-query") ?? "";
2531
input.select();
2632
event.preventDefault();
2733
}

src/client/search.js

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const index = await fetch(import.meta.resolve("observablehq:minisearch.json"))
3131
input.addEventListener("input", () => {
3232
if (currentValue === input.value) return;
3333
currentValue = input.value;
34+
sessionStorage.setItem("search-query", currentValue);
3435
if (!currentValue.length) {
3536
container.setAttribute("data-shortcut", shortcut);
3637
sidebar.classList.remove("observablehq-search-results");
@@ -43,22 +44,40 @@ input.addEventListener("input", () => {
4344
resultsContainer.innerHTML =
4445
results.length === 0
4546
? "<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"});
4951
});
5052

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+
5171
function isExternal(id) {
5272
return /^\w+:/.test(id);
5373
}
5474

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>`;
6281
}
6382

6483
function escapeDoubleQuote(text) {

0 commit comments

Comments
 (0)