Rollup merge of #92629 - jsha:theme-picker-local-only-2, r=GuillaumeGomez
Pick themes on settings page, not every page This hides the paintbrush icon on most pages by default, in preference for the settings on the settings page. When loading from a local file, and not in mobile view, continue to show the theme picker. That's because some browsers limit access to localStorage from file:/// URLs, so choosing a theme from settings.html doesn't take effect. Fixes #84539 Part of #59840 r? `@GuillaumeGomez` Demo: https://rustdoc.crud.net/jsha/theme-picker-local-only-2/std/io/trait.Read.html
This commit is contained in:
commit
d501ead009
7 changed files with 59 additions and 22 deletions
|
@ -422,6 +422,12 @@ fn settings(root_path: &str, suffix: &str, theme_names: Vec<String>) -> Result<S
|
||||||
"Theme preferences",
|
"Theme preferences",
|
||||||
vec![
|
vec![
|
||||||
Setting::from(("use-system-theme", "Use system theme", true)),
|
Setting::from(("use-system-theme", "Use system theme", true)),
|
||||||
|
Setting::Select {
|
||||||
|
js_data_name: "theme",
|
||||||
|
description: "Theme",
|
||||||
|
default_value: "light",
|
||||||
|
options: theme_names.clone(),
|
||||||
|
},
|
||||||
Setting::Select {
|
Setting::Select {
|
||||||
js_data_name: "preferred-dark-theme",
|
js_data_name: "preferred-dark-theme",
|
||||||
description: "Preferred dark theme",
|
description: "Preferred dark theme",
|
||||||
|
|
|
@ -1766,6 +1766,12 @@ details.rustdoc-toggle[open] > summary.hideme::after {
|
||||||
padding-top: 0px;
|
padding-top: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Space is at a premium on mobile, so remove the theme-picker icon. */
|
||||||
|
#theme-picker {
|
||||||
|
display: none;
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.rustdoc {
|
.rustdoc {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
@ -1884,12 +1890,6 @@ details.rustdoc-toggle[open] > summary.hideme::after {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
nav.sub {
|
|
||||||
width: calc(100% - 32px);
|
|
||||||
margin-left: 32px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.source nav:not(.sidebar).sub {
|
.source nav:not(.sidebar).sub {
|
||||||
margin-left: 32px;
|
margin-left: 32px;
|
||||||
}
|
}
|
||||||
|
@ -2086,11 +2086,6 @@ details.rustdoc-toggle[open] > summary.hideme::after {
|
||||||
border: 0;
|
border: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#crate-search + .search-input {
|
|
||||||
width: calc(100% + 71px);
|
|
||||||
margin-left: -36px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#theme-picker, #settings-menu {
|
#theme-picker, #settings-menu {
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
width: 31px;
|
width: 31px;
|
||||||
|
|
|
@ -129,10 +129,15 @@ function hideThemeButtonState() {
|
||||||
|
|
||||||
// Set up the theme picker list.
|
// Set up the theme picker list.
|
||||||
(function () {
|
(function () {
|
||||||
|
if (!document.location.href.startsWith("file:///")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
var themeChoices = getThemesElement();
|
var themeChoices = getThemesElement();
|
||||||
var themePicker = getThemePickerElement();
|
var themePicker = getThemePickerElement();
|
||||||
var availableThemes = getVar("themes").split(",");
|
var availableThemes = getVar("themes").split(",");
|
||||||
|
|
||||||
|
removeClass(themeChoices.parentElement, "hidden");
|
||||||
|
|
||||||
function switchThemeButtonState() {
|
function switchThemeButtonState() {
|
||||||
if (themeChoices.style.display === "block") {
|
if (themeChoices.style.display === "block") {
|
||||||
hideThemeButtonState();
|
hideThemeButtonState();
|
||||||
|
|
|
@ -1,15 +1,18 @@
|
||||||
// Local js definitions:
|
// Local js definitions:
|
||||||
/* global getSettingValue, getVirtualKey, onEachLazy, updateLocalStorage, updateSystemTheme */
|
/* global getSettingValue, getVirtualKey, onEachLazy, updateLocalStorage, updateSystemTheme */
|
||||||
|
/* global addClass, removeClass */
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
function changeSetting(settingName, value) {
|
function changeSetting(settingName, value) {
|
||||||
updateLocalStorage("rustdoc-" + settingName, value);
|
updateLocalStorage("rustdoc-" + settingName, value);
|
||||||
|
|
||||||
switch (settingName) {
|
switch (settingName) {
|
||||||
|
case "theme":
|
||||||
case "preferred-dark-theme":
|
case "preferred-dark-theme":
|
||||||
case "preferred-light-theme":
|
case "preferred-light-theme":
|
||||||
case "use-system-theme":
|
case "use-system-theme":
|
||||||
updateSystemTheme();
|
updateSystemTheme();
|
||||||
|
updateLightAndDark();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,7 +32,32 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function showLightAndDark() {
|
||||||
|
addClass(document.getElementById("theme").parentElement.parentElement, "hidden");
|
||||||
|
removeClass(document.getElementById("preferred-light-theme").parentElement.parentElement,
|
||||||
|
"hidden");
|
||||||
|
removeClass(document.getElementById("preferred-dark-theme").parentElement.parentElement,
|
||||||
|
"hidden");
|
||||||
|
}
|
||||||
|
|
||||||
|
function hideLightAndDark() {
|
||||||
|
addClass(document.getElementById("preferred-light-theme").parentElement.parentElement,
|
||||||
|
"hidden");
|
||||||
|
addClass(document.getElementById("preferred-dark-theme").parentElement.parentElement,
|
||||||
|
"hidden");
|
||||||
|
removeClass(document.getElementById("theme").parentElement.parentElement, "hidden");
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateLightAndDark() {
|
||||||
|
if (getSettingValue("use-system-theme") !== "false") {
|
||||||
|
showLightAndDark();
|
||||||
|
} else {
|
||||||
|
hideLightAndDark();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function setEvents() {
|
function setEvents() {
|
||||||
|
updateLightAndDark();
|
||||||
onEachLazy(document.getElementsByClassName("slider"), function(elem) {
|
onEachLazy(document.getElementsByClassName("slider"), function(elem) {
|
||||||
var toggle = elem.previousElementSibling;
|
var toggle = elem.previousElementSibling;
|
||||||
var settingId = toggle.id;
|
var settingId = toggle.id;
|
||||||
|
|
|
@ -187,22 +187,25 @@ var updateSystemTheme = (function() {
|
||||||
var mql = window.matchMedia("(prefers-color-scheme: dark)");
|
var mql = window.matchMedia("(prefers-color-scheme: dark)");
|
||||||
|
|
||||||
function handlePreferenceChange(mql) {
|
function handlePreferenceChange(mql) {
|
||||||
|
let use = function(theme) {
|
||||||
|
switchTheme(window.currentTheme, window.mainTheme, theme, true);
|
||||||
|
};
|
||||||
// maybe the user has disabled the setting in the meantime!
|
// maybe the user has disabled the setting in the meantime!
|
||||||
if (getSettingValue("use-system-theme") !== "false") {
|
if (getSettingValue("use-system-theme") !== "false") {
|
||||||
var lightTheme = getSettingValue("preferred-light-theme") || "light";
|
var lightTheme = getSettingValue("preferred-light-theme") || "light";
|
||||||
var darkTheme = getSettingValue("preferred-dark-theme") || "dark";
|
var darkTheme = getSettingValue("preferred-dark-theme") || "dark";
|
||||||
|
|
||||||
if (mql.matches) {
|
if (mql.matches) {
|
||||||
// prefers a dark theme
|
use(darkTheme);
|
||||||
switchTheme(window.currentTheme, window.mainTheme, darkTheme, true);
|
|
||||||
} else {
|
} else {
|
||||||
// prefers a light theme, or has no preference
|
// prefers a light theme, or has no preference
|
||||||
switchTheme(window.currentTheme, window.mainTheme, lightTheme, true);
|
use(lightTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
// note: we save the theme so that it doesn't suddenly change when
|
// note: we save the theme so that it doesn't suddenly change when
|
||||||
// the user disables "use-system-theme" and reloads the page or
|
// the user disables "use-system-theme" and reloads the page or
|
||||||
// navigates to another page
|
// navigates to another page
|
||||||
|
} else {
|
||||||
|
use(getSettingValue("theme"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,7 @@
|
||||||
{%- endif -%}
|
{%- endif -%}
|
||||||
</a> {#- -#}
|
</a> {#- -#}
|
||||||
<nav class="sub"> {#- -#}
|
<nav class="sub"> {#- -#}
|
||||||
<div class="theme-picker"> {#- -#}
|
<div class="theme-picker hidden"> {#- -#}
|
||||||
<button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"> {#- -#}
|
<button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"> {#- -#}
|
||||||
<img width="18" height="18" alt="Pick another theme!" {# -#}
|
<img width="18" height="18" alt="Pick another theme!" {# -#}
|
||||||
src="{{static_root_path|safe}}brush{{page.resource_suffix}}.svg"> {#- -#}
|
src="{{static_root_path|safe}}brush{{page.resource_suffix}}.svg"> {#- -#}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
goto: file://|DOC_PATH|/test_docs/struct.Foo.html
|
goto: file://|DOC_PATH|/test_docs/struct.Foo.html
|
||||||
size: (433, 600)
|
size: (433, 600)
|
||||||
assert-attribute: (".top-doc", {"open": ""})
|
assert-attribute: (".top-doc", {"open": ""})
|
||||||
click: (4, 240) // This is the position of the top doc comment toggle
|
click: (4, 260) // This is the position of the top doc comment toggle
|
||||||
assert-attribute-false: (".top-doc", {"open": ""})
|
assert-attribute-false: (".top-doc", {"open": ""})
|
||||||
click: (4, 240)
|
click: (4, 260)
|
||||||
assert-attribute: (".top-doc", {"open": ""})
|
assert-attribute: (".top-doc", {"open": ""})
|
||||||
// To ensure that the toggle isn't over the text, we check that the toggle isn't clicked.
|
// To ensure that the toggle isn't over the text, we check that the toggle isn't clicked.
|
||||||
click: (3, 240)
|
click: (3, 260)
|
||||||
assert-attribute: (".top-doc", {"open": ""})
|
assert-attribute: (".top-doc", {"open": ""})
|
||||||
|
|
||||||
// Assert the position of the toggle on the top doc block.
|
// Assert the position of the toggle on the top doc block.
|
||||||
|
@ -22,10 +22,10 @@ assert-position: (
|
||||||
// Now we do the same but with a little bigger width
|
// Now we do the same but with a little bigger width
|
||||||
size: (600, 600)
|
size: (600, 600)
|
||||||
assert-attribute: (".top-doc", {"open": ""})
|
assert-attribute: (".top-doc", {"open": ""})
|
||||||
click: (4, 240) // New Y position since all search elements are back on one line.
|
click: (4, 260) // New Y position since all search elements are back on one line.
|
||||||
assert-attribute-false: (".top-doc", {"open": ""})
|
assert-attribute-false: (".top-doc", {"open": ""})
|
||||||
click: (4, 240)
|
click: (4, 260)
|
||||||
assert-attribute: (".top-doc", {"open": ""})
|
assert-attribute: (".top-doc", {"open": ""})
|
||||||
// To ensure that the toggle isn't over the text, we check that the toggle isn't clicked.
|
// To ensure that the toggle isn't over the text, we check that the toggle isn't clicked.
|
||||||
click: (3, 240)
|
click: (3, 260)
|
||||||
assert-attribute: (".top-doc", {"open": ""})
|
assert-attribute: (".top-doc", {"open": ""})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue