summaryrefslogtreecommitdiff
path: root/source/js/script.ts
blob: e6a2155d2b66e365c6b60f6865124b430dbf6f54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/* Add elements listener */
window.addEventListener("load", () => {

    // Menubar burgers click listenr
    const burgers: Element[] = Array.prototype.slice.call(
        document.querySelectorAll(".navbar-burger"), 0);
    if (burgers.length > 0) {
        burgers.forEach((element) => {
            element.addEventListener("click", () => {
                const idstr = element.getAttribute("data-target");
                element.classList.toggle("is-active");
                if (!idstr) return;
                const target = document.getElementById(idstr);
                target?.classList.toggle("is-active");
            }, false);
        });
    }

    // Add header hover page class changer
    const colorman = (mode: SystemDarkmodePrefrence) => {
        let clsname: string = ".auto-dark";
        const elements: Element[] = Array.prototype.slice.call(
            document.querySelectorAll(clsname), 0);
        elements.forEach((element) => {
            if (mode === SystemDarkmodePrefrence.dark) {
                element?.classList.add("is-dark");
                element?.classList.remove("is-light");
            } else {
                element?.classList.add("is-light");
                element?.classList.remove("is-dark");
            }
        })
    }
    darklistener.add(colorman);
});

/* 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 {
        callback(this._mode);
        this._handlers.push(callback);
    }

    public mode(): SystemDarkmodePrefrence {
        return this._mode;
    }
};

var darklistener = new DarkmodeListener();