diff --git a/.eslintrc.json b/.eslintrc.json
index 32efe898a0..c97f384cf5 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -10,7 +10,7 @@
"require": "readonly"
},
"parserOptions": {
- "ecmaVersion": 2018,
+ "ecmaVersion": 2021,
"requireConfigFile": false,
"sourceType": "module"
},
diff --git a/src/theme/book.js b/src/theme/book.js
index 327c09fb51..160ee93700 100644
--- a/src/theme/book.js
+++ b/src/theme/book.js
@@ -1,6 +1,6 @@
'use strict';
-/* global default_theme, hljs, ClipboardJS */
+/* global default_theme, default_dark_theme, default_light_theme, hljs, ClipboardJS */
// Fix back button cache problem
window.onunload = function() { };
@@ -329,7 +329,13 @@ aria-label="Show hidden lines">';
themePopup.querySelectorAll('.theme-selected').forEach(function(el) {
el.classList.remove('theme-selected');
});
- themePopup.querySelector('button#' + get_theme()).classList.add('theme-selected');
+ const selected = get_saved_theme() ?? 'default_theme';
+ let element = themePopup.querySelector('button#' + selected);
+ if (element === null) {
+ // Fall back in case there is no "Default" item.
+ element = themePopup.querySelector('button#' + get_theme());
+ }
+ element.classList.add('theme-selected');
}
function hideThemes() {
@@ -338,20 +344,37 @@ aria-label="Show hidden lines">';
themeToggleButton.focus();
}
- function get_theme() {
- let theme;
+ function get_saved_theme() {
+ let theme = null;
try {
theme = localStorage.getItem('mdbook-theme');
} catch (e) {
// ignore error.
}
+ return theme;
+ }
+
+ function delete_saved_theme() {
+ localStorage.removeItem('mdbook-theme');
+ }
+
+ function get_theme() {
+ const theme = get_saved_theme();
if (theme === null || theme === undefined || !themeIds.includes(theme)) {
- return default_theme;
+ if (typeof default_dark_theme === 'undefined') {
+ // A customized index.hbs might not define this, so fall back to
+ // old behavior of determining the default on page load.
+ return default_theme;
+ }
+ return window.matchMedia('(prefers-color-scheme: dark)').matches
+ ? default_dark_theme
+ : default_light_theme;
} else {
return theme;
}
}
+ let previousTheme = default_theme;
function set_theme(theme, store = true) {
let ace_theme;
@@ -383,8 +406,6 @@ aria-label="Show hidden lines">';
});
}
- const previousTheme = get_theme();
-
if (store) {
try {
localStorage.setItem('mdbook-theme', theme);
@@ -395,13 +416,17 @@ aria-label="Show hidden lines">';
html.classList.remove(previousTheme);
html.classList.add(theme);
+ previousTheme = theme;
updateThemeSelected();
}
- // Set theme
- const theme = get_theme();
+ const query = window.matchMedia('(prefers-color-scheme: dark)');
+ query.onchange = function() {
+ set_theme(get_theme(), false);
+ };
- set_theme(theme, false);
+ // Set theme.
+ set_theme(get_theme(), false);
themeToggleButton.addEventListener('click', function() {
if (themePopup.style.display === 'block') {
@@ -420,7 +445,12 @@ aria-label="Show hidden lines">';
} else {
return;
}
- set_theme(theme);
+ if (theme === 'default_theme' || theme === null) {
+ delete_saved_theme();
+ set_theme(get_theme(), false);
+ } else {
+ set_theme(theme);
+ }
});
themePopup.addEventListener('focusout', function(e) {
diff --git a/src/theme/index.hbs b/src/theme/index.hbs
index eade5ec7c2..98f3b886c9 100644
--- a/src/theme/index.hbs
+++ b/src/theme/index.hbs
@@ -53,10 +53,11 @@
{{/if}}
-
+
@@ -81,6 +82,7 @@