import { fromEvent, merge, timer, zip } from "rxjs"; import { tap, exhaustMap, map, mapTo, mergeMap, pairwise, share, startWith, switchMap, takeUntil, filter, } from "rxjs/operators"; import { webComponentsReady, importTemplate, stylesheetReady } from "./common"; (async () => { await Promise.all([ ...("customElements" in window ? [] : [ import( /* webpackChunkName: "webcomponents" */ "./polyfills/webcomponents.js" ).then( () => import( /* webpackChunkName: "shadydom" */ "./polyfills/shadydom.js" ), ), ]), ]); await webComponentsReady; await stylesheetReady; const SEL_NAVBAR_BTN_BAR = "#_navbar > .content > .nav-btn-bar"; const search = importTemplate("_search-template"); const pushStateEl = document.querySelector("hy-push-state"); if (!pushStateEl || !search) return; await import(/* webpackMode: "eager" */ "@honeymachine/search"); const navbarEl = document.querySelector(SEL_NAVBAR_BTN_BAR); navbarEl?.insertBefore(search, navbarEl.querySelector(".nav-insert-marker")); const searchBtn = document.getElementById("_search"); const searchEl = document.querySelector("hm-search"); const documents = await fetch("/search.json").then((r) => r.json()); searchEl.setAttribute("documents", JSON.stringify(documents)); searchEl.setAttribute( "fields", JSON.stringify(["title", "description", "category", "tags"]), ); const start$ = fromEvent(pushStateEl, "hy-push-state-start"); const ready$ = fromEvent(pushStateEl, "hy-push-state-after"); const search$ = fromEvent(searchEl, "search"); const click$ = fromEvent(searchBtn, "click"); let articles = (" " + document.getElementById("_main").innerHTML).slice(1); const reset = () => { const result = document.getElementById("_main"); result.classList.remove("search-results"); result.innerHTML = articles; result.querySelectorAll("img, h1").forEach((article) => { article.setAttribute("style", "opacity: 1;"); }); }; start$.subscribe(() => { searchEl.clear(); reset(); }); ready$.subscribe(() => { const result = document.getElementById("_main"); if (result.innerHTML) { articles = (" " + result.innerHTML).slice(1); } }); search$.subscribe((e) => { const result = document.getElementById("_main"); const hits = e.detail; if (hits.length === 0) { reset(); } else { result.classList.add("search-results"); result.innerHTML = ""; hits.forEach((hit) => { const item = documents.find((doc) => doc.id === hit.ref); const articleEl = document.createElement("article"); articleEl.classList.add("search-result", "page", "post", "mb6"); articleEl.setAttribute("role", "article"); articleEl.setAttribute("id", "post-" + item.id); articleEl.innerHTML = `

${item.title}

${item.title}

${item.description}

`; result.appendChild(articleEl); }); } }); click$.subscribe(() => { searchEl.hidden = !searchEl.hidden; !searchEl.active ? searchEl.focus() : searchEl.clear(); searchEl.setAttribute("aria-expanded", !searchEl.hidden); }); })();