|  | 
| 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