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();
}());
|