Skip to content

Commit 0a76707

Browse files
authored
feat: Emit custom event when theme changes (#723)
* Emit custom event when theme changes * Type themechange custom event * Update darkmode docs
1 parent 1ce12fc commit 0a76707

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

docs/features/darkmode.md

+9
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,12 @@ Quartz supports darkmode out of the box that respects the user's theme preferenc
1212
- Component: `quartz/components/Darkmode.tsx`
1313
- Style: `quartz/components/styles/darkmode.scss`
1414
- Script: `quartz/components/scripts/darkmode.inline.ts`
15+
16+
You can also listen to the `themechange` event to perform any custom logic when the theme changes.
17+
18+
```js
19+
document.addEventListener("themechange", (e) => {
20+
console.log("Theme changed to " + e.detail.theme) // either "light" or "dark"
21+
// your logic here
22+
})
23+
```

index.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ declare module "*.scss" {
66
// dom custom event
77
interface CustomEventMap {
88
nav: CustomEvent<{ url: FullSlug }>
9+
themechange: CustomEvent<{ theme: "light" | "dark" }>
910
}
1011

1112
declare const fetchData: Promise<ContentIndex>

quartz/components/scripts/darkmode.inline.ts

+12-7
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,19 @@ const userPref = window.matchMedia("(prefers-color-scheme: light)").matches ? "l
22
const currentTheme = localStorage.getItem("theme") ?? userPref
33
document.documentElement.setAttribute("saved-theme", currentTheme)
44

5+
const emitThemeChangeEvent = (theme: "light" | "dark") => {
6+
const event: CustomEventMap["themechange"] = new CustomEvent("themechange", {
7+
detail: { theme },
8+
})
9+
document.dispatchEvent(event)
10+
}
11+
512
document.addEventListener("nav", () => {
613
const switchTheme = (e: any) => {
7-
if (e.target.checked) {
8-
document.documentElement.setAttribute("saved-theme", "dark")
9-
localStorage.setItem("theme", "dark")
10-
} else {
11-
document.documentElement.setAttribute("saved-theme", "light")
12-
localStorage.setItem("theme", "light")
13-
}
14+
const newTheme = e.target.checked ? "dark" : "light"
15+
document.documentElement.setAttribute("saved-theme", newTheme)
16+
localStorage.setItem("theme", newTheme)
17+
emitThemeChangeEvent(newTheme)
1418
}
1519

1620
// Darkmode toggle
@@ -28,5 +32,6 @@ document.addEventListener("nav", () => {
2832
document.documentElement.setAttribute("saved-theme", newTheme)
2933
localStorage.setItem("theme", newTheme)
3034
toggleSwitch.checked = e.matches
35+
emitThemeChangeEvent(newTheme)
3136
})
3237
})

0 commit comments

Comments
 (0)