Dark mode toggle

javascript

This floating button toggle that can be used to convert text and images to dark mode on any Squarespace site.

How this works

This is a Javascript code that can be used on any site with a Business or Commerce subscription plan.

This code will alter the background content to be dark, and the text content to light, creating a high contrast commonly referred to as “dark mode”. It’s designed to invert images as well, and is not color theme specific.

How to use this code

This code is designed to work on every page of your site. Copy this code using the copy button on the right.

It’s recommended that you add it to your site wide header code injection.

You’ll find this under Website → Website Tools → Code Injection

<script>
  document.addEventListener("DOMContentLoaded", function () {
  const root = document.documentElement;
  const toggleButton = document.createElement("button");
  toggleButton.id = "darkModeToggle";
  toggleButton.textContent = "🌙"; // Initial moon icon

  // Add the button to the bottom right corner
  toggleButton.style.position = "fixed";
  toggleButton.style.bottom = "20px";
  toggleButton.style.right = "20px";
  toggleButton.style.padding = "10px 15px";
  toggleButton.style.border = "none";
  toggleButton.style.borderRadius = "5px";
  toggleButton.style.backgroundColor = "#444";
  toggleButton.style.color = "#fff";
  toggleButton.style.cursor = "pointer";
  toggleButton.style.zIndex = "1000";
  document.body.appendChild(toggleButton);

  // Hardcoded fallback dark mode variables
  const darkModeStyles = {
    "--white-hsl": "0, 0%, 10%",
    "--black-hsl": "0, 0%, 90%",
    "--safeLightAccent-hsl": "0, 0%, 30%",
    "--safeDarkAccent-hsl": "0, 0%, 80%",
    "--safeInverseAccent-hsl": "0, 0%, 90%",
    "--safeInverseLightAccent-hsl": "0, 0%, 70%",
    "--safeInverseDarkAccent-hsl": "0, 0%, 10%",
    "--accent-hsl": "220, 50%, 50%",
    "--lightAccent-hsl": "220, 40%, 30%",
    "--darkAccent-hsl": "220, 20%, 10%",
  };

  // Original root variables (backup for light mode)
  const originalStyles = {};

  function saveOriginalStyles() {
    for (const key in darkModeStyles) {
      originalStyles[key] = getComputedStyle(root).getPropertyValue(key).trim();
    }
  }

  function applyDarkMode() {
    for (const key in darkModeStyles) {
      root.style.setProperty(key, darkModeStyles[key]);
    }
    // Invert header title
    const headerTitle = document.querySelector(".header-title");
    if (headerTitle) headerTitle.style.filter = "invert(1)";
  }

  function applyLightMode() {
    for (const key in originalStyles) {
      root.style.setProperty(key, originalStyles[key]);
    }
    // Revert header title
    const headerTitle = document.querySelector(".header-title");
    if (headerTitle) headerTitle.style.filter = "none";
  }

  // Toggle dark mode
  toggleButton.addEventListener("click", function () {
    if (root.classList.contains("dark-mode")) {
      root.classList.remove("dark-mode");
      applyLightMode();
      toggleButton.textContent = "🌙";
      localStorage.setItem("darkMode", "disabled");
    } else {
      root.classList.add("dark-mode");
      applyDarkMode();
      toggleButton.textContent = "☀️";
      localStorage.setItem("darkMode", "enabled");
    }
  });

  // Save original styles initially
  saveOriginalStyles();

  // Apply user preference on load
  if (localStorage.getItem("darkMode") === "enabled") {
    root.classList.add("dark-mode");
    applyDarkMode();
    toggleButton.textContent = "☀️";
  }
});
</script>
Next
Next

Countdown Timer