Files
HugoBlox-kit/modules/blox-tailwind/assets/js/hb-search.js
T
George Cushen d5d2f04c2d chore: adopt Biome + Stylelint, modernize CI/CD, add security/support docs, minor JS fixes
- Linting/format
  - Replace ESLint/Prettier with Biome; remove old configs; add `biome.json`; update scripts
  - Tailwind-friendly `.stylelintrc.yaml`; Stylelint and Biome pass
  - Enable Biome across `modules/**`; prune legacy JS globals; ignore oversized `devicon.json`

- Code fixes
  - `hb-theme.js`: avoid assignment-in-expressions; clearer dataset updates
  - `hugoblox-slides.js`: fix inner var scope (var → let); apply formatting

- CI/CD
  - Split lint/build workflows; add path filters; Node via Corepack (pnpm from package.json)
  - Hugo pinned to env `HUGO_VERSION`; add consistency check vs `starters/academic-cv/hugoblox.yaml`
  - Nightly starters matrix build (academic-cv, landing-page); CodeQL weekly; resource caches

- Workflows/Community
  - Greeter: switch to `pull_request_target`; add Contributor Guide to PR message
  - PR labeler for path-based labels

- Repo policies/docs
  - `CODEOWNERS` for `@gcushen`
  - `SECURITY.md`, `SUPPORT.md`
  - Documented branch protection in `.github/settings.yml`
  - Move `CODE_OF_CONDUCT.md` to `.github/`

- docs(zh): update `README.zh.md` translation

Notes:
- pnpm is sourced from `package.json: packageManager` via Corepack; no hard-coded pnpm versions in CI.
2025-09-17 03:17:38 +01:00

79 lines
2.1 KiB
JavaScript

// Hugo Blox Search functionality
// Initialize search wrapper element globally
let searchWrapper = null;
window.addEventListener("DOMContentLoaded", () => {
const configScript = document.getElementById("search-config");
if (!configScript) {
// No search on this page.
return;
}
const searchConfig = JSON.parse(configScript.textContent);
if (!searchConfig || typeof searchConfig.baseUrl === "undefined") {
console.error(
"Pagefind search config is missing or invalid.",
searchConfig,
);
return;
}
try {
new PagefindUI({
element: "#search",
showSubResults: true,
baseUrl: searchConfig.baseUrl,
bundlePath: searchConfig.baseUrl + "pagefind/",
});
} catch (e) {
console.error("Failed to initialize PagefindUI:", e);
return;
}
// Get search wrapper element
searchWrapper = document.getElementById("search-wrapper");
// Add click handlers to triggers
let triggers = document.querySelectorAll("[data-search-toggle]");
triggers.forEach((trigger) =>
trigger.addEventListener("click", handleSearchToggle),
);
});
function handleSearchToggle() {
if (!searchWrapper) return;
const isHidden = searchWrapper.classList.contains("hidden");
searchWrapper.classList.toggle("hidden");
document.body.style.overflow = isHidden ? "hidden" : "";
const searchInput = searchWrapper.querySelector("input");
if (searchInput) {
searchInput.value = "";
searchInput.focus();
}
if (!searchWrapper.classList.contains("hidden")) {
let clearTrigger = document.querySelector(".pagefind-ui__search-clear");
if (clearTrigger && !clearTrigger.hasAttribute("listenerOnClick")) {
clearTrigger.setAttribute("listenerOnClick", "true");
clearTrigger.addEventListener("click", () => {
searchInput.focus();
});
}
}
}
// Add keyboard shortcut to close search modal with Escape key
document.addEventListener("keydown", (event) => {
if (
event.key === "Escape" &&
searchWrapper &&
!searchWrapper.classList.contains("hidden")
) {
searchWrapper.classList.add("hidden");
}
});