92 lines
2.2 KiB
JavaScript
92 lines
2.2 KiB
JavaScript
const colorPickerLight = document.querySelector("#color-picker-light");
|
|
const colorPickerDark = document.querySelector("#color-picker-dark");
|
|
const contrastCheckboxLight = document.querySelector("#contrast-color-light");
|
|
const contrastCheckboxDark = document.querySelector("#contrast-color-dark");
|
|
|
|
let accentColorLight = colorPickerLight.value;
|
|
let accentColorDark = colorPickerDark.value;
|
|
|
|
colorPickerLight.addEventListener("input", updateAccentColorLight);
|
|
colorPickerDark.addEventListener("input", updateAccentColorDark);
|
|
contrastCheckboxLight.addEventListener("change", updateStyles);
|
|
contrastCheckboxDark.addEventListener("change", updateStyles);
|
|
|
|
function updateAccentColorLight() {
|
|
accentColorLight = colorPickerLight.value;
|
|
updateStyles();
|
|
}
|
|
|
|
function updateAccentColorDark() {
|
|
accentColorDark = colorPickerDark.value;
|
|
updateStyles();
|
|
}
|
|
|
|
function updateStyles() {
|
|
const contrastColorLight = contrastCheckboxLight.checked;
|
|
const contrastColorDark = contrastCheckboxDark.checked;
|
|
|
|
let styleElement = document.getElementById("dynamic-styles");
|
|
|
|
if (!styleElement) {
|
|
styleElement = document.createElement("style");
|
|
styleElement.id = "dynamic-styles";
|
|
document.head.appendChild(styleElement);
|
|
}
|
|
|
|
let styles = `
|
|
:root {
|
|
--accent-color: ${accentColorLight};
|
|
}
|
|
[data-theme="dark"] {
|
|
--accent-color: ${accentColorDark};
|
|
}
|
|
@media (prefers-color-scheme: dark) {
|
|
:root:not([data-theme="light"]) {
|
|
--accent-color: ${accentColorDark};
|
|
}
|
|
}
|
|
`;
|
|
|
|
if (contrastColorLight) {
|
|
styles += `
|
|
:root {
|
|
--contrast-color: rgb(0 0 0 / 0.8);
|
|
}
|
|
`;
|
|
} else {
|
|
styles += `
|
|
:root {
|
|
--contrast-color: #fff;
|
|
}
|
|
`;
|
|
}
|
|
|
|
if (contrastColorDark) {
|
|
styles += `
|
|
[data-theme="dark"] {
|
|
--contrast-color: rgb(0 0 0 / 0.8);
|
|
}
|
|
@media (prefers-color-scheme: dark) {
|
|
:root:not([data-theme="light"]) {
|
|
--contrast-color: rgb(0 0 0 / 0.8);
|
|
}
|
|
}
|
|
`;
|
|
} else {
|
|
styles += `
|
|
[data-theme="dark"] {
|
|
--contrast-color: #fff;
|
|
}
|
|
@media (prefers-color-scheme: dark) {
|
|
:root:not([data-theme="light"]) {
|
|
--contrast-color: #fff;
|
|
}
|
|
}
|
|
`;
|
|
}
|
|
|
|
styleElement.textContent = styles;
|
|
}
|
|
|
|
updateStyles();
|