mirror of
https://github.com/tiennm99/HugoBlox-kit.git
synced 2026-10-11 12:11:45 +00:00
- 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.
79 lines
2.1 KiB
JavaScript
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");
|
|
}
|
|
});
|