|
9 | 9 | const isSettingsPage = window.location.pathname.endsWith("/settings.html");
|
10 | 10 |
|
11 | 11 | function changeSetting(settingName, value) {
|
| 12 | + if (settingName === "theme") { |
| 13 | + const useSystem = value === "system preference" ? "true" : "false"; |
| 14 | + updateLocalStorage("use-system-theme", useSystem); |
| 15 | + } |
12 | 16 | updateLocalStorage(settingName, value);
|
13 | 17 |
|
14 | 18 | switch (settingName) {
|
15 | 19 | case "theme":
|
16 | 20 | case "preferred-dark-theme":
|
17 | 21 | case "preferred-light-theme":
|
18 |
| - case "use-system-theme": |
19 | 22 | updateSystemTheme();
|
20 | 23 | updateLightAndDark();
|
21 | 24 | break;
|
|
45 | 48 | }
|
46 | 49 |
|
47 | 50 | function showLightAndDark() {
|
48 |
| - addClass(document.getElementById("theme").parentElement, "hidden"); |
49 | 51 | removeClass(document.getElementById("preferred-light-theme").parentElement, "hidden");
|
50 | 52 | removeClass(document.getElementById("preferred-dark-theme").parentElement, "hidden");
|
51 | 53 | }
|
52 | 54 |
|
53 | 55 | function hideLightAndDark() {
|
54 | 56 | addClass(document.getElementById("preferred-light-theme").parentElement, "hidden");
|
55 | 57 | addClass(document.getElementById("preferred-dark-theme").parentElement, "hidden");
|
56 |
| - removeClass(document.getElementById("theme").parentElement, "hidden"); |
57 | 58 | }
|
58 | 59 |
|
59 | 60 | function updateLightAndDark() {
|
60 |
| - if (getSettingValue("use-system-theme") !== "false") { |
| 61 | + const useSystem = getSettingValue("use-system-theme"); |
| 62 | + if (useSystem === "true" || (useSystem === null && getSettingValue("theme") === null)) { |
61 | 63 | showLightAndDark();
|
62 | 64 | } else {
|
63 | 65 | hideLightAndDark();
|
|
91 | 93 | });
|
92 | 94 | onEachLazy(settingsElement.querySelectorAll("input[type=\"radio\"]"), elem => {
|
93 | 95 | const settingId = elem.name;
|
94 |
| - const settingValue = getSettingValue(settingId); |
| 96 | + let settingValue = getSettingValue(settingId); |
| 97 | + if (settingId === "theme") { |
| 98 | + const useSystem = getSettingValue("use-system-theme"); |
| 99 | + if (useSystem === "true" || settingValue === null) { |
| 100 | + if (useSystem !== "false") { |
| 101 | + settingValue = "system preference"; |
| 102 | + } else { |
| 103 | + // This is the default theme. |
| 104 | + settingValue = "light"; |
| 105 | + } |
| 106 | + } |
| 107 | + } |
95 | 108 | if (settingValue !== null && settingValue !== "null") {
|
96 | 109 | elem.checked = settingValue === elem.value;
|
97 | 110 | }
|
|
120 | 133 |
|
121 | 134 | if (setting["options"] !== undefined) {
|
122 | 135 | // This is a select setting.
|
123 |
| - output += `<div class="radio-line" id="${js_data_name}">\ |
124 |
| - <span class="setting-name">${setting_name}</span>\ |
125 |
| - <div class="choices">`; |
| 136 | + output += `\ |
| 137 | +<div class="radio-line" id="${js_data_name}"> |
| 138 | + <span class="setting-name">${setting_name}</span> |
| 139 | +<div class="choices">`; |
126 | 140 | onEach(setting["options"], option => {
|
127 | 141 | const checked = option === setting["default"] ? " checked" : "";
|
| 142 | + const full = `${js_data_name}-${option.replace(/ /g,"-")}`; |
128 | 143 |
|
129 |
| - output += `<label for="${js_data_name}-${option}" class="choice">\ |
130 |
| - <input type="radio" name="${js_data_name}" \ |
131 |
| - id="${js_data_name}-${option}" value="${option}"${checked}>\ |
132 |
| - <span>${option}</span>\ |
133 |
| - </label>`; |
| 144 | + output += `\ |
| 145 | +<label for="${full}" class="choice"> |
| 146 | + <input type="radio" name="${js_data_name}" |
| 147 | + id="${full}" value="${option}"${checked}> |
| 148 | + <span>${option}</span> |
| 149 | +</label>`; |
134 | 150 | });
|
135 | 151 | output += "</div></div>";
|
136 | 152 | } else {
|
137 | 153 | // This is a toggle.
|
138 | 154 | const checked = setting["default"] === true ? " checked" : "";
|
139 |
| - output += `<label class="toggle">\ |
140 |
| - <input type="checkbox" id="${js_data_name}"${checked}>\ |
141 |
| - <span class="label">${setting_name}</span>\ |
142 |
| - </label>`; |
| 155 | + output += `\ |
| 156 | +<label class="toggle">\ |
| 157 | + <input type="checkbox" id="${js_data_name}"${checked}>\ |
| 158 | + <span class="label">${setting_name}</span>\ |
| 159 | +</label>`; |
143 | 160 | }
|
144 | 161 | output += "</div>";
|
145 | 162 | }
|
|
156 | 173 | theme_names.push("light", "dark", "ayu");
|
157 | 174 |
|
158 | 175 | const settings = [
|
159 |
| - { |
160 |
| - "name": "Use system theme", |
161 |
| - "js_name": "use-system-theme", |
162 |
| - "default": true, |
163 |
| - }, |
164 | 176 | {
|
165 | 177 | "name": "Theme",
|
166 | 178 | "js_name": "theme",
|
167 |
| - "default": "light", |
168 |
| - "options": theme_names, |
| 179 | + "default": "system preference", |
| 180 | + "options": theme_names.concat("system preference"), |
169 | 181 | },
|
170 | 182 | {
|
171 | 183 | "name": "Preferred light theme",
|
|
0 commit comments