- add .en.html overrides for 16 case pages + resume via apinex translator - translate remaining partials (projects-related, mini-projects-*, fab-stack-home-contact, fab-stack-resume, content-edit-fab-stack, cookie-notice) - enhance translate.mjs to protect <script>/<style> from translation - second pass: translate attribute values (aria-label/alt/title/placeholder/content/ data-hint-default) and visible text DeepL skipped in html mode - make logo language-aware (NM / НМ) via i18n
81 lines
3.4 KiB
HTML
81 lines
3.4 KiB
HTML
<script>
|
|
(function () {
|
|
var FONT_CSS = {
|
|
merriweather: "/assets/fonts/merriweather.css",
|
|
geologica: "/assets/fonts/geologica.css",
|
|
mono: "/assets/fonts/mono.css",
|
|
};
|
|
try {
|
|
var t = JSON.parse(localStorage.getItem("siteThemeV1") || "{}");
|
|
var d = document.documentElement;
|
|
var m = t.mode;
|
|
if (m !== "light" && m !== "dark" && m !== "system") m = "system";
|
|
var eff =
|
|
m === "system"
|
|
? window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches
|
|
? "dark"
|
|
: "light"
|
|
: m;
|
|
d.dataset.theme = eff;
|
|
var h = typeof t.h === "number" ? t.h : typeof t.hue === "number" ? t.hue : null;
|
|
var s = typeof t.s === "number" ? t.s : typeof t.sat === "number" ? t.sat : null;
|
|
var l = typeof t.l === "number" ? t.l : typeof t.light === "number" ? t.light : null;
|
|
if (h !== null) d.style.setProperty("--theme-h", String(h));
|
|
if (s !== null) d.style.setProperty("--theme-s", String(s));
|
|
if (l !== null) {
|
|
var L = Number(l);
|
|
if (Number.isFinite(L)) d.style.setProperty("--theme-l", String(Math.min(70, Math.max(20, L))));
|
|
}
|
|
var hVal = h !== null ? h : 210;
|
|
var sVal = s !== null ? s : 90;
|
|
var lVal = l !== null ? Math.min(70, Math.max(20, Number(l))) : 40;
|
|
var H = (((hVal % 360) + 360) % 360) / 360;
|
|
var S = Math.min(100, Math.max(0, sVal)) / 100;
|
|
var Lv = Math.min(100, Math.max(0, lVal)) / 100;
|
|
var r, g, b;
|
|
if (S === 0) { r = g = b = Lv; }
|
|
else {
|
|
var q = Lv < 0.5 ? Lv * (1 + S) : Lv + S - Lv * S;
|
|
var p = 2 * Lv - q;
|
|
var hue2rgb = function(p, q, t) {
|
|
if (t < 0) t += 1; if (t > 1) t -= 1;
|
|
if (t < 1/6) return p + (q - p) * 6 * t;
|
|
if (t < 1/2) return q;
|
|
if (t < 2/3) return p + (q - p) * (2/3 - t) * 6;
|
|
return p;
|
|
};
|
|
r = hue2rgb(p, q, H + 1/3);
|
|
g = hue2rgb(p, q, H);
|
|
b = hue2rgb(p, q, H - 1/3);
|
|
}
|
|
var lum = 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
d.style.setProperty("--on-accent", lum > 0.58 ? "hsl(220 14% 12%)" : "hsl(0 0% 98%)");
|
|
var rad = t.radius;
|
|
if (rad === "soft" || rad === "medium" || rad === "strong") {
|
|
d.dataset.radius = rad;
|
|
} else {
|
|
d.dataset.radius = "medium";
|
|
}
|
|
var f = t.font;
|
|
if (f === "onest") f = "geologica";
|
|
if (f === "anonymous") f = "mono";
|
|
if (f !== "merriweather" && f !== "mono" && f !== "geologica") f = "merriweather";
|
|
d.dataset.font = f;
|
|
var mb = t.meshBg;
|
|
if (mb === "off") {
|
|
d.dataset.meshBg = "off";
|
|
} else {
|
|
d.dataset.meshBg = "on";
|
|
}
|
|
var href = FONT_CSS[f];
|
|
if (href && !document.querySelector('link[data-theme-font="' + f + '"]')) {
|
|
var link = document.createElement("link");
|
|
link.rel = "stylesheet";
|
|
link.href = href;
|
|
link.setAttribute("data-theme-font", f);
|
|
document.head.appendChild(link);
|
|
}
|
|
} catch (e) {}
|
|
})();
|
|
</script>
|