feat: support non-singleton darkmode
This commit is contained in:
		@@ -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 @@ import { classNames } from "../util/lang"
 | 
			
		||||
 | 
			
		||||
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 @@ const Darkmode: QuartzComponent = ({ displayClass, cfg }: QuartzComponentProps)
 | 
			
		||||
        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"
 | 
			
		||||
 
 | 
			
		||||
@@ -25,12 +25,11 @@ document.addEventListener("nav", () => {
 | 
			
		||||
    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user