sophuwu.site > manhttpd   
              86
            
                 /*
    --theme: <integer 0-5>;
    * sets the theme color, 4 is the default. 0 white, 1-3 add yellow filter. 4 is dark, 5 changes header+link colors.
    --contrast: <bool 0/1>;
    * sets high contrast, 0 is the default.
    --font: string;
    * sets the font, 'JetBrains Mono' will be used from google fonts if not set.
    --font-size: <float><unit>;
    * sets the font size, 18px is the default.
     */

const CSSRx = /^(((\d+(\.\d+)?)(%|p[xtc]|r?em|ex|ch|v(min|max|w|h)|([cm]m)|in))|(((?<x>x{1,3}-)?(small|larg)e?((?<=\k<x>)r)?)|medium|normal))$/;


let funcmap = {
    "--theme": function (value) {
        let v = parseInt(value);
        return (v < 0 || v > 5)
    },
    "--contrast": function (value) {
        let v = parseInt(value);
        return (v < 0 || v > 1)
    },
    "--font": function (value) {
        return (value.length < 1)
    },
    "--font-size": function (value) {
        return !CSSRx.test(value)
    }
};


function SaveValue(key, value) {
    let fn = funcmap[key]
    if (typeof(fn) != "function"||fn(value)) {
        return false;
    }
    localStorage.setItem(key, value);
    return true;
}

function DeleteValue(key) {
    localStorage.removeItem(key);
}

// var style = document.createElement('style');
// style.innerText += document.styleSheets[0].cssRules[0].cssText;
// const styleCss = style.innerText;
// style.id = "styleCss";
// document.head.appendChild(style);

const style = document.getElementById("styleCss");
const styleCss = style.innerText;

function setStyle() {
    let tmp = ":root{\n";
    let ar = ["--theme", "--contrast", "--font", "--font-size"];
    for (let key of ar) {
        let value = localStorage.getItem(key);
        if (value) tmp += `${key}:${value};` + "\n";
    }
    tmp += "}";
    style.innerText = tmp + styleCss;
}

document.addEventListener("DOMContentLoaded", setStyle);
document.addEventListener("DOMContentLoaded", function () {
    document.getElementById("SetButt").addEventListener("click", function () {
        let ar = ["--theme", "--contrast", "--font", "--font-size"];
        for (let key of ar) {
            let value = localStorage.getItem(key);
            if (value) document.getElementById(key.replaceAll("-", "")).value = value;
        }
        document.querySelector("article.settings").classList.toggle("hidden");
    });
    document.getElementById("contrast").addEventListener("mousedown", function () {
            let elem = document.getElementById("contrast");
            if (elem.value == 1) elem.value = 0;
            else elem.value = 1;
            elem.classList.toggle("togii");
            if (SaveValue("--contrast", elem.value))setStyle();
    });
    document.getElementById("theme").addEventListener("input", function () {
        if (SaveValue("--theme", document.getElementById("theme").value))setStyle();
    });
});