|
2 | 2 | <script async src="{{{uiRootPath}}}/js/vendor/highlight.js"></script> |
3 | 3 | <script async src="{{{uiRootPath}}}/js/vendor/tabs.js" data-sync-storage-key="preferred-tab"></script> |
4 | 4 | <script> |
5 | | - // This script block loads the pagefind search UI. |
| 5 | + // Loads the pagefind search UI on first use (see 07-search.js); the |
| 6 | + // assets stay off the critical rendering path of every page. |
6 | 7 | // Some styling is customized, these classes are found in search.css. |
7 | | - window.addEventListener('DOMContentLoaded', (event) => { |
8 | | - const instance = new PagefindModularUI.Instance({ |
9 | | - // customized rank tuning - see https://pagefind.app/docs/ranking/ |
10 | | - ranking: { |
11 | | - termSaturation: 0.4, |
12 | | - termSimilarity: 10.0 |
13 | | - }}); |
14 | | - instance.add(new PagefindModularUI.Input({ |
15 | | - containerElement: "#search-input" |
16 | | - })); |
17 | | - instance.add(new PagefindModularUI.ResultList({ |
18 | | - containerElement: "#search-results", |
19 | | - resultTemplate: (result) => { |
20 | | - const el = document.createElement("li"); |
21 | | - el.classList.add("pagefind-modular-list-result"); |
| 8 | + window.loadSearch = (function () { |
| 9 | + let ready |
22 | 10 |
|
23 | | - const innerEl = document.createElement("div"); |
24 | | - innerEl.classList.add("pagefind-modular-list-inner"); |
25 | | - el.appendChild(innerEl); |
| 11 | + function initSearch () { |
| 12 | + const instance = new PagefindModularUI.Instance({ |
| 13 | + // customized rank tuning - see https://pagefind.app/docs/ranking/ |
| 14 | + ranking: { |
| 15 | + termSaturation: 0.4, |
| 16 | + termSimilarity: 10.0 |
| 17 | + }}); |
| 18 | + instance.add(new PagefindModularUI.Input({ |
| 19 | + containerElement: "#search-input" |
| 20 | + })); |
| 21 | + instance.add(new PagefindModularUI.ResultList({ |
| 22 | + containerElement: "#search-results", |
| 23 | + resultTemplate: (result) => { |
| 24 | + const el = document.createElement("li"); |
| 25 | + el.classList.add("pagefind-modular-list-result"); |
26 | 26 |
|
27 | | - // Create the child element for the breadcrumbs |
28 | | - const bcEl = document.createElement("p"); |
29 | | - bcEl.classList.add("pagefind-modular-list-breadcrumbs"); |
30 | | - parts = (result.meta.breadcrumbs ?? '').split('.').map(part => part.trim()).filter(part => part.length > 0); |
31 | | - parts.shift(); |
32 | | - parts.pop(); |
33 | | - bcEl.innerText = parts.join(' / '); |
34 | | - innerEl.appendChild(bcEl); |
| 27 | + // the whole result card is one link |
| 28 | + const linkEl = document.createElement("a"); |
| 29 | + linkEl.classList.add("pagefind-modular-list-link", "pagefind-modular-list-inner"); |
| 30 | + linkEl.href = result.url; |
| 31 | + el.appendChild(linkEl); |
35 | 32 |
|
36 | | - // Create the child element for the title |
37 | | - const titleEl = document.createElement("p"); |
38 | | - titleEl.classList.add("pagefind-modular-list-title"); |
39 | | - innerEl.appendChild(titleEl); |
| 33 | + const bcEl = document.createElement("p"); |
| 34 | + bcEl.classList.add("pagefind-modular-list-breadcrumbs"); |
| 35 | + const parts = (result.meta.breadcrumbs ?? '').split('.').map(part => part.trim()).filter(part => part.length > 0); |
| 36 | + parts.shift(); |
| 37 | + parts.pop(); |
| 38 | + bcEl.innerText = parts.join(' / '); |
| 39 | + linkEl.appendChild(bcEl); |
40 | 40 |
|
41 | | - // Create the anchor element |
42 | | - const linkEl = document.createElement("a"); |
43 | | - linkEl.classList.add("pagefind-modular-list-link"); |
44 | | - linkEl.href = result.url; |
45 | | - linkEl.innerText = result.meta.title; |
46 | | - titleEl.appendChild(linkEl); |
| 41 | + const titleEl = document.createElement("p"); |
| 42 | + titleEl.classList.add("pagefind-modular-list-title"); |
| 43 | + titleEl.innerText = result.meta.title; |
| 44 | + linkEl.appendChild(titleEl); |
47 | 45 |
|
48 | | - // Create the child element for the excerpt |
49 | | - const textEl = document.createElement("p"); |
50 | | - textEl.classList.add("pagefind-modular-list-excerpt"); |
51 | | - textEl.innerHTML = result.excerpt; |
52 | | - innerEl.appendChild(textEl); |
| 46 | + const textEl = document.createElement("p"); |
| 47 | + textEl.classList.add("pagefind-modular-list-excerpt"); |
| 48 | + textEl.innerHTML = result.excerpt; |
| 49 | + linkEl.appendChild(textEl); |
53 | 50 |
|
54 | | - return el; |
| 51 | + return el; |
| 52 | + } |
| 53 | + })); |
| 54 | + } |
| 55 | +
|
| 56 | + return function () { |
| 57 | + if (!ready) { |
| 58 | + const css = document.createElement("link"); |
| 59 | + css.rel = "stylesheet"; |
| 60 | + css.href = "/pagefind/pagefind-modular-ui.css"; |
| 61 | + document.head.appendChild(css); |
| 62 | + ready = new Promise((resolve, reject) => { |
| 63 | + const script = document.createElement("script"); |
| 64 | + script.src = "/pagefind/pagefind-modular-ui.js"; |
| 65 | + script.onload = () => { initSearch(); resolve(); }; |
| 66 | + script.onerror = reject; |
| 67 | + document.head.appendChild(script); |
| 68 | + }); |
55 | 69 | } |
56 | | - })); |
57 | | - }); |
| 70 | + return ready; |
| 71 | + }; |
| 72 | + })(); |
58 | 73 | </script> |
0 commit comments