rhombus 0.2.21

Next generation extendable CTF framework with batteries included
Documentation
document.addEventListener("htmx:beforeOnLoad", (e) => {
  if (e.detail.requestConfig.headers["HX-Boosted"]) {
    if (window.deregister) {
      window.deregister();
      window.deregister = undefined;
    }
  }
});
window.onunload = function () {};
window.addEventListener("popstate", (e) => {
  if (window.deregister) {
    window.deregister();
    window.deregister = undefined;
  }
});

window.addEventListener("htmx:oobAfterSwap", (e) => {
  if (e.detail.elt.id === "htmx-toaster") {
    if (e.detail.elt.dataset.toast === "success") {
      rhombus.toast.success(e.detail.elt.innerHTML);
    } else if (e.detail.elt.dataset.toast === "error") {
      rhombus.toast.error(e.detail.elt.innerHTML);
    }
  }
});

const getThemePreference = () => {
  if (
    typeof localStorage !== "undefined" &&
    localStorage.getItem("rhombus-theme")
  ) {
    return localStorage.getItem("rhombus-theme");
  }
  return window.matchMedia("(prefers-color-scheme: dark)").matches
    ? "dark"
    : "light";
};
const setTheme = (isDark) => {
  document.documentElement.classList[isDark ? "add" : "remove"]("dark");
};

window
  .matchMedia("(prefers-color-scheme: dark)")
  .addEventListener("change", (event) => {
    setTheme(event.matches);
  });

setTheme(getThemePreference() === "dark");

if (typeof localStorage !== "undefined") {
  const observer = new MutationObserver(() => {
    const isDark = document.documentElement.classList.contains("dark");
    localStorage.setItem("rhombus-theme", isDark ? "dark" : "light");
  });
  observer.observe(document.documentElement, {
    attributes: true,
    attributeFilter: ["class"],
  });
}