---
title: "Posts"
---

My thoughts and opinions on whatever.

{{< rawhtml >}}
<noscript>
  <div class="announcement">
    JavaScript is required for search. You can still read articles without it.
  </div>
</noscript>
<div class="search js-only">
  <input type="text" id="search" placeholder="Search ALL Posts...">
  <button id="clear-search">
    <svg xmlns="http://www.w3.org/2000/svg" class="ionicon" viewBox="0 0 512 512"><title>Backspace</title><path d="M135.19 390.14a28.79 28.79 0 0021.68 9.86h246.26A29 29 0 00432 371.13V140.87A29 29 0 00403.13 112H156.87a28.84  28.84 0 00-21.67 9.84v0L46.33 256l88.86 134.11z" fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="32"></path><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="M336.67 192.33L206.66 322.34M336.67 322.34L206.66 192.33M336.67 192.33L206.66 322.34M336.67 322.34L206.66 192.33"></path></svg>
  </button>
</div>

<script>
document.addEventListener("DOMContentLoaded", () => {
  for (e of document.getElementsByClassName("js-only")) {
    e.classList.remove("js-only");
  }

  const articles = document.querySelectorAll("#artlist li");
  const search = document.getElementById("search");
  const clearSearch = document.getElementById("clear-search");
  const artlist = document.getElementById("artlist");

  search.addEventListener("input", () => {
    // grab search input value
    const searchText = search.value.toLowerCase().trim().normalize('NFD').replace(/\p{Diacritic}/gu, "");
    const searchTerms = searchText.split(" ");
    const hasFilter = searchText.length > 0;

    artlist.classList.toggle("list-searched", hasFilter);

    // for each article hide all but matched
    articles.forEach(article => {
      const searchString = `${article.textContent} ${article.dataset.tags}`.toLowerCase().normalize('NFD').replace(/\p{Diacritic}/gu, "");
      const isMatch = searchTerms.every(term => searchString.includes(term));

      article.hidden = !isMatch;
      article.classList.toggle("matched-article", hasFilter && isMatch);
    })
  })

  clearSearch.addEventListener("click", () => {
    search.value = "";
    articles.forEach(article => {
      article.hidden = false;
      article.classList.remove("matched-article");
    })

    artlist.classList.remove("list-searched");
  })
})
</script>
{{< /rawhtml >}}