File size: 2,606 Bytes
da96562
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*!
 * Matomo - free/libre analytics platform
 *
 * @link    https://matomo.org
 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
 */

(function () {
  /** @type {Function|null|undefined} */
  let autoListener = null;
  const mediaQuery = typeof window.matchMedia === 'function'
    ? window.matchMedia('(prefers-color-scheme: dark)')
    : null
  let currentPreferredThemeMode = document.documentElement.getAttribute('data-theme-mode') || 'light';

  /**
   * Resolves the saved theme mode to the effective active theme.
   *
   * @param {string} preferredThemeMode
   * @returns {string}
   */
  function resolveThemeMode(preferredThemeMode) {
    if (preferredThemeMode === 'dark') {
        return 'dark';
    }

    if (preferredThemeMode === 'auto') {
        return mediaQuery && mediaQuery.matches ? 'dark' : 'light';
    }

    return 'light';
  }

  /**
   * Removes the browser color scheme change listener when one is registered.
   *
   * @returns {void}
   */
  function removeAutoListener() {
    if (!mediaQuery || !autoListener) {
        return;
    }

    if (typeof mediaQuery.removeEventListener === 'function') {
      mediaQuery.removeEventListener('change', autoListener);
    }
  }

  /**
   * Adds a browser color scheme change listener for auto mode.
   *
   * @returns {void}
   */
  function addAutoListener() {
    removeAutoListener();

    if (!mediaQuery || currentPreferredThemeMode !== 'auto') {
        return;
    }

    autoListener = function () {
      emitThemeModeChange();
    };

    if (typeof mediaQuery.addEventListener === 'function') {
        mediaQuery.addEventListener('change', autoListener);
    }
  }

  /**
   * Emits the theme mode change event with the previous resolved theme.
   *
   * @returns {void}
   */
  function emitThemeModeChange() {
    if (typeof piwik.postEvent === 'function') {
      piwik.postEvent('themeModeChange');
      return;
    }

    window.dispatchEvent(new CustomEvent('themeModeChange'));
  }

  /**
   * Gets the resolved active theme mode.
   *
   * @returns {string}
   */
  piwik.getThemeMode = function () {
    return resolveThemeMode(currentPreferredThemeMode);
  };

  /**
   * Sets the saved theme mode on the page and refreshes the active theme.
   *
   * @param {string} preferredThemeMode
   * @returns {void}
   */
  piwik.setThemeMode = function (preferredThemeMode) {
    document.documentElement.setAttribute('data-theme-mode', preferredThemeMode);
    currentPreferredThemeMode = preferredThemeMode;
    addAutoListener()
    emitThemeModeChange();
  };
  addAutoListener();
}());