From dcaf806190efe1dde3d8392292555b76ace07bdb Mon Sep 17 00:00:00 2001
From: Jacky Zhao <j.zhao2k19@gmail.com>
Date: Mon, 10 Mar 2025 18:44:47 +0000
Subject: [PATCH] feat: support non-singleton darkmode

---
 quartz/components/Darkmode.tsx               |   10 ++++------
 quartz/components/scripts/darkmode.inline.ts |    9 ++++-----
 quartz/components/styles/darkmode.scss       |    8 ++++----
 3 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/quartz/components/Darkmode.tsx b/quartz/components/Darkmode.tsx
index f64aad6..afc23d7 100644
--- a/quartz/components/Darkmode.tsx
+++ b/quartz/components/Darkmode.tsx
@@ -1,6 +1,4 @@
-// @ts-ignore: this is safe, we don't want to actually make darkmode.inline.ts a module as
-// modules are automatically deferred and we don't want that to happen for critical beforeDOMLoads
-// see: https://v8.dev/features/modules#defer
+// @ts-ignore
 import darkmodeScript from "./scripts/darkmode.inline"
 import styles from "./styles/darkmode.scss"
 import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types"
@@ -9,12 +7,12 @@
 
 const Darkmode: QuartzComponent = ({ displayClass, cfg }: QuartzComponentProps) => {
   return (
-    <button class={classNames(displayClass, "darkmode")} id="darkmode">
+    <button class={classNames(displayClass, "darkmode")}>
       <svg
         xmlns="http://www.w3.org/2000/svg"
         xmlnsXlink="http://www.w3.org/1999/xlink"
         version="1.1"
-        id="dayIcon"
+        class="dayIcon"
         x="0px"
         y="0px"
         viewBox="0 0 35 35"
@@ -29,7 +27,7 @@
         xmlns="http://www.w3.org/2000/svg"
         xmlnsXlink="http://www.w3.org/1999/xlink"
         version="1.1"
-        id="nightIcon"
+        class="nightIcon"
         x="0px"
         y="0px"
         viewBox="0 0 100 100"
diff --git a/quartz/components/scripts/darkmode.inline.ts b/quartz/components/scripts/darkmode.inline.ts
index 56009a3..871eb24 100644
--- a/quartz/components/scripts/darkmode.inline.ts
+++ b/quartz/components/scripts/darkmode.inline.ts
@@ -25,12 +25,11 @@
     emitThemeChangeEvent(newTheme)
   }
 
-  // Darkmode toggle
-  const themeButton = document.querySelector("#darkmode") as HTMLButtonElement
-  if (themeButton) {
-    themeButton.addEventListener("click", switchTheme)
-    window.addCleanup(() => themeButton.removeEventListener("click", switchTheme))
+  for (const darkmodeButton of document.getElementsByClassName("darkmode")) {
+    darkmodeButton.addEventListener("click", switchTheme)
+    window.addCleanup(() => darkmodeButton.removeEventListener("click", switchTheme))
   }
+
   // Listen for changes in prefers-color-scheme
   const colorSchemeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)")
   colorSchemeMediaQuery.addEventListener("change", themeChange)
diff --git a/quartz/components/styles/darkmode.scss b/quartz/components/styles/darkmode.scss
index 4295282..5d1e078 100644
--- a/quartz/components/styles/darkmode.scss
+++ b/quartz/components/styles/darkmode.scss
@@ -29,19 +29,19 @@
 }
 
 :root[saved-theme="dark"] .darkmode {
-  & > #dayIcon {
+  & > .dayIcon {
     display: none;
   }
-  & > #nightIcon {
+  & > .nightIcon {
     display: inline;
   }
 }
 
 :root .darkmode {
-  & > #dayIcon {
+  & > .dayIcon {
     display: inline;
   }
-  & > #nightIcon {
+  & > .nightIcon {
     display: none;
   }
 }

--
Gitblit v1.10.0