summaryrefslogtreecommitdiff
path: root/source/js/darkmode.ts
diff options
context:
space:
mode:
Diffstat (limited to 'source/js/darkmode.ts')
-rw-r--r--source/js/darkmode.ts37
1 files changed, 37 insertions, 0 deletions
diff --git a/source/js/darkmode.ts b/source/js/darkmode.ts
new file mode 100644
index 0000000..db24d0a
--- /dev/null
+++ b/source/js/darkmode.ts
@@ -0,0 +1,37 @@
+// Darkmode Listener
+enum SystemDarkmodePrefrence {
+ dark = 0,
+ light = 1
+};
+
+class DarkmodeListener {
+ private _mode: SystemDarkmodePrefrence;
+ private _handlers: ((mode: SystemDarkmodePrefrence)=>void)[];
+
+ public constructor() {
+ let darking = window.matchMedia('(prefers-color-scheme: dark)').matches;
+ this._mode = darking ? SystemDarkmodePrefrence.dark : SystemDarkmodePrefrence.light;
+ this._handlers = [];
+ this._listen();
+ }
+
+ private _listen(): void {
+ let media = window.matchMedia('(prefers-color-scheme: dark)');
+ let callback = (event: MediaQueryListEvent) => {
+ let mode = event.matches ? SystemDarkmodePrefrence.dark : SystemDarkmodePrefrence.light;
+ this._handlers.forEach(handler => {
+ handler(mode);
+ });
+ this._mode = mode;
+ };
+ media.addEventListener("change", callback);
+ }
+
+ public add(callback: (mode: SystemDarkmodePrefrence)=>void): void {
+ this._handlers.push(callback);
+ }
+
+ public mode(): SystemDarkmodePrefrence {
+ return this._mode;
+ }
+};