- {{ .Title }} - {{ .Content }} - - - - - Not finding what you're looking for? Try - - Ask AI - - {{ partial "utils/svg.html" "/icons/sparkle.svg" }} - - - - - - - +{{ define "left" }}{{ partial "sidebar/mainnav.html" . }}{{ end }} {{ define +"main" }} + + {{ .Title }} + {{ .Content }} + + + + + + Not finding what you're looking for? Try + + + Ask AI + + {{ partial "utils/svg.html" "/icons/sparkle.svg" }} + + - - + } + + searchPageInput.addEventListener("input", (e) => onPageSearch(e)); + + // Event delegation for tracking link clicks + if (window.heap !== undefined) { + searchPageResults.addEventListener("click", function (event) { + if (event.target.tagName === "A" && event.target.closest(".link")) { + const searchQuery = event.target.getAttribute("data-query"); + const resultIndex = event.target.getAttribute("data-index"); + const url = new URL(event.target.href); + const properties = { + docs_search_target_path: url.pathname, + docs_search_target_title: event.target.textContent, + docs_search_query_text: searchQuery, + docs_search_target_index: resultIndex, + docs_search_source_path: window.location.pathname, + docs_search_source_title: document.title, + }; + heap.track("Docs - Search - Click - Result Link", properties); + } + }); + } + {{ end }} diff --git a/layouts/partials/search-bar.html b/layouts/partials/search-bar.html index a51bc8a82687..5d571e051c5a 100644 --- a/layouts/partials/search-bar.html +++ b/layouts/partials/search-bar.html @@ -1,21 +1,21 @@ - { + x-ref="searchBarRef" + x-data="{ open: false }" + @click.outside="open = false;" + @keyup.escape.window="open = false" + id="search-bar" + class="relative flex w-full max-w-full items-center overflow-visible" +> + { switch(e.key) { case 'k': if (e.metaKey || e.ctrlKey) { @@ -25,108 +25,176 @@ break; } }" - tabindex="0" - /> - - - {{ partial "utils/svg.html" "/icons/search.svg" }} - - - + + + {{ partial "utils/svg.html" "/icons/search.svg" }} + + + - - {{- $emptyState := `Start typing to search or try Ask - AI.` }} - {{- $emptyState | safe.HTML }} - + const dropdownWidth = Math.min(500, window.innerWidth * 0.9); + const viewportWidth = window.innerWidth; + + // Calculate left position + let leftPos = rect.left; + + // Prevent going off right edge + if (leftPos + dropdownWidth > viewportWidth - 20) { + leftPos = viewportWidth - dropdownWidth - 20; + } + + // Prevent going off left edge + if (leftPos < 20) { + leftPos = 20; + } + + $el.style.top = (rect.bottom + 8) + 'px'; + $el.style.left = leftPos + 'px'; + }" + > + + {{- $emptyState := ` + + Start typing to search or try + Ask AI. + ` }} {{- $emptyState | safe.HTML }} + - + const search = await pagefind.debouncedSearch(query); + if (search === null) { + return; + } else { + const resultsLength = search.results.length; + const resultsData = await Promise.all( + search.results.slice(0, 5).map((r) => r.data()), + ); + const results = resultsData.map((item, index) => ({ + ...item, + index: index + 1, + })); + + if (query) { + searchBarResults.classList.remove("hidden"); + } else { + searchBarResults.classList.add("hidden"); + } + +let resultsHTML = `${resultsLength} results`; +resultsHTML += results + .map((item) => { + // Truncate excerpt if it's too long + let excerpt = item.excerpt; + if (excerpt.length > 200) { + excerpt = excerpt.substring(0, 200); + } + return ` + + ${item.meta.title} + …${excerpt}… + +`; + }) + .join(""); + +if (resultsLength > 5) { + resultsHTML += `Show all results`; +} + + searchBarResults.innerHTML = resultsHTML; + } + } + + searchBarInput.addEventListener("input", search); + + // Event delegation for tracking link clicks + if (window.heap !== undefined) { + searchBarResults.addEventListener("click", function (event) { + if (event.target.tagName === "A" && event.target.closest(".link")) { + const searchQuery = event.target.getAttribute("data-query"); + const resultIndex = event.target.getAttribute("data-index"); + const url = new URL(event.target.href); + const properties = { + docs_search_target_path: url.pathname, + docs_search_target_title: event.target.textContent, + docs_search_query_text: searchQuery, + docs_search_target_index: resultIndex, + docs_search_source_path: window.location.pathname, + docs_search_source_title: document.title, + }; + heap.track("Docs - Search - Click - Result Link", properties); + } + }); + } + }); +
+ {{ .Title }} + {{ .Content }} + + + + + + Not finding what you're looking for? Try + + + Ask AI + + {{ partial "utils/svg.html" "/icons/sparkle.svg" }} + + - - + } + + searchPageInput.addEventListener("input", (e) => onPageSearch(e)); + + // Event delegation for tracking link clicks + if (window.heap !== undefined) { + searchPageResults.addEventListener("click", function (event) { + if (event.target.tagName === "A" && event.target.closest(".link")) { + const searchQuery = event.target.getAttribute("data-query"); + const resultIndex = event.target.getAttribute("data-index"); + const url = new URL(event.target.href); + const properties = { + docs_search_target_path: url.pathname, + docs_search_target_title: event.target.textContent, + docs_search_query_text: searchQuery, + docs_search_target_index: resultIndex, + docs_search_source_path: window.location.pathname, + docs_search_source_title: document.title, + }; + heap.track("Docs - Search - Click - Result Link", properties); + } + }); + } + {{ end }} diff --git a/layouts/partials/search-bar.html b/layouts/partials/search-bar.html index a51bc8a82687..5d571e051c5a 100644 --- a/layouts/partials/search-bar.html +++ b/layouts/partials/search-bar.html @@ -1,21 +1,21 @@ - { + x-ref="searchBarRef" + x-data="{ open: false }" + @click.outside="open = false;" + @keyup.escape.window="open = false" + id="search-bar" + class="relative flex w-full max-w-full items-center overflow-visible" +> + { switch(e.key) { case 'k': if (e.metaKey || e.ctrlKey) { @@ -25,108 +25,176 @@ break; } }" - tabindex="0" - /> - - - {{ partial "utils/svg.html" "/icons/search.svg" }} - - - + + + {{ partial "utils/svg.html" "/icons/search.svg" }} + + + - - {{- $emptyState := `Start typing to search or try Ask - AI.` }} - {{- $emptyState | safe.HTML }} - + const dropdownWidth = Math.min(500, window.innerWidth * 0.9); + const viewportWidth = window.innerWidth; + + // Calculate left position + let leftPos = rect.left; + + // Prevent going off right edge + if (leftPos + dropdownWidth > viewportWidth - 20) { + leftPos = viewportWidth - dropdownWidth - 20; + } + + // Prevent going off left edge + if (leftPos < 20) { + leftPos = 20; + } + + $el.style.top = (rect.bottom + 8) + 'px'; + $el.style.left = leftPos + 'px'; + }" + > + + {{- $emptyState := ` + + Start typing to search or try + Ask AI. + ` }} {{- $emptyState | safe.HTML }} + - + const search = await pagefind.debouncedSearch(query); + if (search === null) { + return; + } else { + const resultsLength = search.results.length; + const resultsData = await Promise.all( + search.results.slice(0, 5).map((r) => r.data()), + ); + const results = resultsData.map((item, index) => ({ + ...item, + index: index + 1, + })); + + if (query) { + searchBarResults.classList.remove("hidden"); + } else { + searchBarResults.classList.add("hidden"); + } + +let resultsHTML = `${resultsLength} results`; +resultsHTML += results + .map((item) => { + // Truncate excerpt if it's too long + let excerpt = item.excerpt; + if (excerpt.length > 200) { + excerpt = excerpt.substring(0, 200); + } + return ` + + ${item.meta.title} + …${excerpt}… + +`; + }) + .join(""); + +if (resultsLength > 5) { + resultsHTML += `Show all results`; +} + + searchBarResults.innerHTML = resultsHTML; + } + } + + searchBarInput.addEventListener("input", search); + + // Event delegation for tracking link clicks + if (window.heap !== undefined) { + searchBarResults.addEventListener("click", function (event) { + if (event.target.tagName === "A" && event.target.closest(".link")) { + const searchQuery = event.target.getAttribute("data-query"); + const resultIndex = event.target.getAttribute("data-index"); + const url = new URL(event.target.href); + const properties = { + docs_search_target_path: url.pathname, + docs_search_target_title: event.target.textContent, + docs_search_query_text: searchQuery, + docs_search_target_index: resultIndex, + docs_search_source_path: window.location.pathname, + docs_search_source_title: document.title, + }; + heap.track("Docs - Search - Click - Result Link", properties); + } + }); + } + }); +