[matrix] Set theme to system preferred by default
This commit is contained in:
parent
a04a410c8a
commit
ffdddb0fe5
67
docs/_static/custom.js
vendored
67
docs/_static/custom.js
vendored
@ -31,10 +31,25 @@ function changeDocumentation(element) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function updateSetting(element) {
|
function updateSetting(element) {
|
||||||
localStorage.setItem(element.name, element.checked);
|
let value;
|
||||||
if (element.name in settings) {
|
switch (element.type) {
|
||||||
settings[element.name](element.checked);
|
case "checkbox":
|
||||||
|
localStorage.setItem(element.name, element.checked);
|
||||||
|
value = element.checked;
|
||||||
|
break;
|
||||||
|
case "radio":
|
||||||
|
localStorage.setItem(element.name, `"${element.value}"`);
|
||||||
|
value = element.value;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
if (element.name in settings) {
|
||||||
|
settings[element.name]["setter"](value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function LoadSetting(name, defaultValue) {
|
||||||
|
let value = JSON.parse(localStorage.getItem(name));
|
||||||
|
return value === null ? defaultValue : value;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getRootAttributeToggle(attributeName, valueName) {
|
function getRootAttributeToggle(attributeName, valueName) {
|
||||||
@ -48,13 +63,35 @@ function getRootAttributeToggle(attributeName, valueName) {
|
|||||||
return toggleRootAttribute;
|
return toggleRootAttribute;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setTheme(value) {
|
||||||
|
if (value === "automatic") {
|
||||||
|
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||||
|
document.documentElement.setAttribute(`data-theme`, "dark");
|
||||||
|
} else{
|
||||||
|
document.documentElement.setAttribute(`data-theme`, "light");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
document.documentElement.setAttribute(`data-theme`, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const settings = {
|
const settings = {
|
||||||
useSerifFont: getRootAttributeToggle('font', 'serif'),
|
useSerifFont: {
|
||||||
useDarkTheme: getRootAttributeToggle('theme', 'dark')
|
settingType: "checkbox",
|
||||||
|
defaultValue: false,
|
||||||
|
setter: getRootAttributeToggle('font', 'serif')
|
||||||
|
},
|
||||||
|
setTheme: {
|
||||||
|
settingType: "radio",
|
||||||
|
defaultValue: "automatic",
|
||||||
|
setter: setTheme
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Object.entries(settings).forEach(([name, setter]) => {
|
Object.entries(settings).forEach(([name, setting]) => {
|
||||||
let value = JSON.parse(localStorage.getItem(name));
|
let { defaultValue, setter, ..._ } = setting;
|
||||||
|
let value = LoadSetting(name, defaultValue);
|
||||||
try {
|
try {
|
||||||
setter(value);
|
setter(value);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -109,11 +146,15 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
parent.insertBefore(table, element.nextSibling);
|
parent.insertBefore(table, element.nextSibling);
|
||||||
});
|
});
|
||||||
|
|
||||||
Object.keys(settings).forEach(name => {
|
Object.entries(settings).forEach(([name, setting]) => {
|
||||||
let value = JSON.parse(localStorage.getItem(name));
|
let { settingType, defaultValue, ..._ } = setting;
|
||||||
let element = document.querySelector(`input[name=${name}]`);
|
let value = LoadSetting(name, defaultValue);
|
||||||
if (element) {
|
if (settingType === "checkbox") {
|
||||||
element.checked = value === true;
|
let element = document.querySelector(`input[name=${name}]`);
|
||||||
|
element.checked = value;
|
||||||
|
} else {
|
||||||
|
let element = document.querySelector(`input[name=${name}][value=${value}]`);
|
||||||
|
element.checked = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -144,7 +185,7 @@ window.addEventListener('scroll', () => {
|
|||||||
if (activeLink) {
|
if (activeLink) {
|
||||||
let headingChildren = activeLink.parentElement.parentElement;
|
let headingChildren = activeLink.parentElement.parentElement;
|
||||||
let heading = headingChildren.previousElementSibling.previousElementSibling;
|
let heading = headingChildren.previousElementSibling.previousElementSibling;
|
||||||
|
|
||||||
if (heading && headingChildren.style.display === "none") {
|
if (heading && headingChildren.style.display === "none") {
|
||||||
activeLink = heading;
|
activeLink = heading;
|
||||||
}
|
}
|
||||||
|
5
docs/_static/style.css
vendored
5
docs/_static/style.css
vendored
@ -289,6 +289,11 @@ header > nav > a:hover {
|
|||||||
margin-right: 0.5em;
|
margin-right: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.setting h3 {
|
||||||
|
display: inline-block;
|
||||||
|
margin-left: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
.sub-header > .settings:hover {
|
.sub-header > .settings:hover {
|
||||||
color: var(--settings-hover);
|
color: var(--settings-hover);
|
||||||
}
|
}
|
||||||
|
22
docs/_templates/layout.html
vendored
22
docs/_templates/layout.html
vendored
@ -141,6 +141,7 @@
|
|||||||
</span>
|
</span>
|
||||||
<h1>Settings</h1>
|
<h1>Settings</h1>
|
||||||
|
|
||||||
|
<h2>Font</h2>
|
||||||
<div class='setting'>
|
<div class='setting'>
|
||||||
<h3>Use a serif font:
|
<h3>Use a serif font:
|
||||||
<label class="toggle"
|
<label class="toggle"
|
||||||
@ -151,12 +152,25 @@
|
|||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<h2>Theme</h2>
|
||||||
<div class='setting'>
|
<div class='setting'>
|
||||||
<h3>Enable dark theme:
|
<h3>
|
||||||
<label class="toggle" title="Enable the dark theme.">
|
<label class="toggle" title="Set your theme">
|
||||||
<input type="checkbox" name="useDarkTheme" onclick="updateSetting(this);">
|
<input type="radio" name="setTheme" onclick="updateSetting(this);" value="automatic" checked>
|
||||||
<span class="toggle-slider"></span>
|
|
||||||
</label>
|
</label>
|
||||||
|
Automatic
|
||||||
|
</h3>
|
||||||
|
<h3>
|
||||||
|
<label class="toggle" title="Use a serif font? Your system font will be used, falling back to serif.">
|
||||||
|
<input type="radio" name="setTheme" onclick="updateSetting(this);" value="light">
|
||||||
|
</label>
|
||||||
|
Light
|
||||||
|
</h3>
|
||||||
|
<h3>
|
||||||
|
<label class="toggle" title="Use a serif font? Your system font will be used, falling back to serif.">
|
||||||
|
<input type="radio" name="setTheme" onclick="updateSetting(this);" value="dark">
|
||||||
|
</label>
|
||||||
|
Dark
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user