@@ -1,39 +1,4 @@
2− // styling of input fields
5−var inputElements = document.querySelectorAll('input.tlon-input');
6−for (var i = 0; i < inputElements.length; i++) {
7− //listen for changes in input
8− inputElements[i].addEventListener('input', function() {
9− // if input has a value do this
11− var inputContainer = this.parentNode;
12− var validInputs = inputContainer.querySelectorAll('input.tlon-input:valid');
13− var inputs = inputContainer.querySelectorAll('input.tlon-input');
14− if (validInputs.length !== 0) {
16− for (var i = 0; i < validInputs.length; i++) {
17− if (this.classList.contains('is-valid') == false ) {
18− validInputs[i].parentNode.classList.add('has-valid-input');
22− // doesn't have valid input
23− for (var i = 0; i < inputs.length; i++) {
24− inputs[i].parentNode.classList.remove('has-valid-input');
28− this.parentNode.classList.remove('has-valid-input');
34− // toggling of navigation menus
1+// toggling of navigation menus
37var toggleMainNav = document.getElementById('js-main-nav-toggle');
2var toggleMainNav = document.getElementById('js-main-nav-toggle');
38if (toggleMainNav !== null) {
3if (toggleMainNav !== null) {
39 toggleMainNav.onclick = function() {
4 toggleMainNav.onclick = function() {
@@ -84,10 +49,8 @@ function initHotKeys() {
88− // search functionality
53+// search functionality
91function debounce(func, wait) {
54function debounce(func, wait) {
92 var timeout;
55 var timeout;
@@ -122,6 +85,7 @@ function makeTeaser(body, terms) {
122 var stemmedTerms = terms.map(function (w) {
85 var stemmedTerms = terms.map(function (w) {
123 return elasticlunr.stemmer(w.toLowerCase());
86 return elasticlunr.stemmer(w.toLowerCase());
125 var termFound = false;
89 var termFound = false;
126 var index = 0;
90 var index = 0;
127 var weighted = []; // contains elements of ["word", weight, index_in_document]
91 var weighted = []; // contains elements of ["word", weight, index_in_document]
@@ -206,48 +170,49 @@ function makeTeaser(body, terms) {
206 startIndex = word[2];
170 startIndex = word[2];
209− // add <em/> around search terms
210− if (word[1] === TERM_WEIGHT) {
213 startIndex = word[2] + word[0].length;
173 startIndex = word[2] + word[0].length;
214 teaser.push(body.substring(word[2], startIndex));
174 teaser.push(body.substring(word[2], startIndex));
216− if (word[1] === TERM_WEIGHT) {
217− teaser.push("</b>");
220 teaser.push("…");
177 teaser.push("…");
221 return teaser.join("");
178 return teaser.join("");
224−function formatSearchResultTitle(path) {
181+function formatSearchResultTitle(item) {
225− var pathArray = path.split( 'docs/' );
182+ var pathArray = item.ref.split( '/' );
184+ // first directory is in 4th element of split path array
226− var slug = pathArray[1];
185+ var firstPartTitle = pathArray[3];
227− var slugArray = slug.split( '/' );
186+
228− var lastPartTitle = slugArray.splice(slugArray.length - 2, slugArray.length).join('');
187+ // last directory is in 2nd to last element of array
229− var firstPartTitle = slugArray.join(' / ');
188+ var lastPartTitle = item.doc.title;
231− var fullTitle = firstPartTitle + ' / ' + '<span class="search-results__item__title__slug-end">' + lastPartTitle + '</span>';
190+ var fullTitle = firstPartTitle + '<span class="gray90 inline-block pl2">' + ' / ' + lastPartTitle + '</span>';
233 return fullTitle;
192 return fullTitle;
236function formatSearchResultItem(item, terms) {
195function formatSearchResultItem(item, terms) {
237 var li = document.createElement("li");
197 var li = document.createElement("li");
238 var createA = document.createElement("a");
198 var createA = document.createElement("a");
239 li.appendChild(createA);
199 li.appendChild(createA);
240− var teaserTitle = formatSearchResultTitle(item.ref);
200+ var teaserTitle = formatSearchResultTitle(item);
241 li.classList.add("search-results__item");
201 li.classList.add("search-results__item");
202+ li.classList.add("ph3");
242 var hrefA = item.ref;
203 var hrefA = item.ref;
243 createA.setAttribute('href', hrefA);
204 createA.setAttribute('href', hrefA);
205+ createA.setAttribute('class','no-underline block pl6 pv3');
244− createA.innerHTML = `<span class="search-results__item__title">${teaserTitle}</span>`;
206+ createA.innerHTML = `<span class="fs45 capitalize">${teaserTitle}</span>`;
207+ createA.innerHTML += `<span class='pr7 fs5 none float-right'>→</span>`;
245− createA.innerHTML += `<div class="search-results__teaser">${makeTeaser(item.doc.body, terms)}</div>`;
208+ createA.innerHTML += `<div class="fs35 truncate mr10">${makeTeaser(item.doc.body, terms)}</div>`;
246 return li;
209 return li;
249function initSearch() {
212function initSearch() {
250 var searchInput = document.getElementById("search");
213 var searchInput = document.getElementById("search");
214+ var searchForm = document.getElementById("search-form");
215+ var inputReset = searchForm.nextElementSibling;
252 if (!searchInput) {
217 if (!searchInput) {
@@ -257,9 +222,9 @@ function initSearch() {
257 var searchResultsHeader = document.querySelector(".search-results__header");
222 var searchResultsHeader = document.querySelector(".search-results__header");
258 var searchResultsItems = document.querySelector(".search-results__items");
223 var searchResultsItems = document.querySelector(".search-results__items");
259 var MAX_ITEMS = 200;
224 var MAX_ITEMS = 200;
261 var options = {
225 var options = {
262 bool: "AND",
226 bool: "AND",
227+ expand: true, // turn on partial word search
263 fields: {
228 fields: {
264 title: {boost: 2},
229 title: {boost: 2},
265 body: {boost: 1},
230 body: {boost: 1},
@@ -267,19 +232,22 @@ function initSearch() {
268 var currentTerm = "";
233 var currentTerm = "";
269 var index = elasticlunr.Index.load(window.searchIndex);
234 var index = elasticlunr.Index.load(window.searchIndex);
271 // toggle search window
235 // toggle search window
272 var toggleSearchWindow = document.getElementById('js-search-window-toggle');
236 var toggleSearchWindow = document.getElementById('js-search-window-toggle');
273 var bodyEl = document.body;
237 var bodyEl = document.body;
274 var searchOverlay = document.getElementById('search-overlay');
238 var searchOverlay = document.getElementById('search-overlay');
275 var searchWindow = document.getElementById('search-window');
239 var searchWindow = document.getElementById('search-window');
276 var searchActive = bodyEl.classList.contains('has-active-search-window');
240 var searchActive = bodyEl.classList.contains('has-active-search-window');
277 if (toggleSearchWindow !== null) {
242 if (toggleSearchWindow !== null) {
278 toggleSearchWindow.onclick = function() {
243 toggleSearchWindow.onclick = function() {
244+ inputReset.style.display="none";
279 //activate search
246 //activate search
280 bodyEl.classList.toggle('has-active-search-window');
247 bodyEl.classList.toggle('has-active-search-window');
281 //put input in focus when activating search
248 //put input in focus when activating search
282 searchInput.focus();
249 searchInput.focus();
283 searchInput.value = "";
251 searchInput.value = "";
284 searchResultsHeader.value = "";
252 searchResultsHeader.value = "";
285 searchResults.style.display = searchInput.value.trim() === "" ? "none" : "block";
253 searchResults.style.display = searchInput.value.trim() === "" ? "none" : "block";
@@ -291,12 +259,12 @@ function initSearch() {
295 searchInput.addEventListener("keyup", debounce(function() {
263 searchInput.addEventListener("keyup", debounce(function() {
296− searchResultsHeader.value = "";
264+ inputReset.style.display="block";
266+ searchResultsHeader.value = "";
298 var term = searchInput.value.trim();
267 var term = searchInput.value.trim();
301 //removed to fix: a state where there’s a valid search term, but no results
269 //removed to fix: a state where there’s a valid search term, but no results
@@ -308,19 +276,21 @@ function initSearch() {
308 searchResults.style.overflowY = term === "" ? "hidden" : "scroll";
276 searchResults.style.overflowY = term === "" ? "hidden" : "scroll";
309 searchResultsItems.innerHTML = "";
277 searchResultsItems.innerHTML = "";
310 if (term === "") {
278 if (term === "") {
279+ inputReset.style.display="none";
314 var results = index.search(term, options).filter(function (r) {
283 var results = index.search(term, options).filter(function (r) {
315 return r.doc.body !== "";
284 return r.doc.body !== "";
317 if (results.length === 0) {
287 if (results.length === 0) {
318 searchResultsHeader.innerText = `No search results for '${term}'.`;
288 searchResultsHeader.innerText = `No search results for '${term}'.`;
322 currentTerm = term;
292 currentTerm = term;
323− searchResultsHeader.innerText = `${results.length} search results for '${term}':`;
293+ searchResultsHeader.innerText = `${results.length} search results for '${term}':`;
324 for (var i = 0; i < Math.min(results.length, MAX_ITEMS); i++) {
294 for (var i = 0; i < Math.min(results.length, MAX_ITEMS); i++) {
325 if (!results[i].doc.body) {
295 if (!results[i].doc.body) {
326 continue;
296 continue;
@@ -328,6 +298,17 @@ function initSearch() {
328 searchResultsItems.appendChild(formatSearchResultItem(results[i], term.split(" ")));
298 searchResultsItems.appendChild(formatSearchResultItem(results[i], term.split(" ")));
330 }, 150));
300 }, 150));
302+ // reset input button
303+ inputReset.onclick=function(){
304+ document.getElementById('search-form').reset();
306+ searchForm.addEventListener("reset", function(event){
307+ var e = document.createEvent('KeyboardEvent');
308+ e.initEvent("keyup", false, true);
309+ searchInput.dispatchEvent(e);
333if (document.readyState === "complete" ||
314if (document.readyState === "complete" ||