color picker yay
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-09-09 13:37:35 -07:00
parent 782912c8a6
commit 0e46e65034
6 changed files with 172 additions and 1 deletions
+21
View File
@@ -21,4 +21,25 @@
</a> </a>
</li> </li>
</ul> </ul>
<fieldset id="theme">
<legend>color scheme</legend>
<input type="radio" id="theme-light" name="theme" value="light"/>
<label class="theme-light" for="theme-light">
<i class="fa-regular fa-sun" aria-hidden="true"></i>
light
</label>
<input type="radio" id="theme-auto" name="theme" value="auto"/>
<label class="theme-auto" for="theme-auto">
auto
</label>
<input type="radio" id="theme-dark" name="theme" value="dark"/>
<label class="theme-dark" for="theme-dark">
dark
<i class="fa-regular fa-moon" aria-hidden="true"></i>
</label>
</fieldset>
</footer> </footer>
+2
View File
@@ -38,4 +38,6 @@
<style>{% getBundle "css" %}</style> <style>{% getBundle "css" %}</style>
{# Scripts #}
<script>{% include "js/theme.js" %}</script>
<script type="module">{% getBundle "js" %}</script> <script type="module">{% getBundle "js" %}</script>
+8 -1
View File
@@ -51,6 +51,13 @@
--color-grey: light-dark(var(--color-grey-dark), var(--color-grey-light)); --color-grey: light-dark(var(--color-grey-dark), var(--color-grey-light));
} }
:root:has(#theme-light:checked) {
color-scheme: light;
}
:root:has(#theme-dark:checked) {
color-scheme: dark;
}
/* Base */ /* Base */
* { * {
@@ -194,7 +201,7 @@ ul, ol, dl, li {
} }
li { li {
line-height: 1.2 5; line-height: 1.2;
margin-top: .65rem; margin-top: .65rem;
margin-bottom: .65rem; margin-bottom: .65rem;
} }
+105
View File
@@ -241,6 +241,111 @@ footer a:focus-visible {
outline-color: var(--color-pink); outline-color: var(--color-pink);
} }
/* color picker */
#theme {
display: flex;
justify-content: center;
margin: .5rem auto 0;
padding: 0 .75rem .5rem;
width: fit-content;
border: .125rem solid var(--color-teal);
border-radius: 2rem;
}
#theme legend {
margin: 0 auto;
color: var(--color-teal);
}
footer label {
cursor: pointer;
border: .125rem solid var(--color-pink);
padding: 0 .25rem;
color: var(--color-pink);
background-color: var(--color-bg); /* this stops the box shadows from showing through */
box-shadow: .15em .15em var(--color-shadow);
/* Click animation handling */
position: relative;
top: 0;
left: 0;
transition: top .05s ease-in, left .05s ease-in;
}
footer input:checked + label {
color: var(--color-blue);
border-color: var(--color-blue);
}
footer label i {
color: var(--color-teal);
}
footer input:checked + label i {
color: var(--color-pink);
}
@media (any-hover: hover) {
footer label:hover,
footer input:checked + label:hover,
footer label:hover i,
footer input:checked + label:hover i {
color: var(--color-bg);
}
footer label:hover {
background-color: var(--color-pink);
}
footer input:checked + label:hover {
background-color: var(--color-teal);
}
}
footer input:focus-visible + label,
footer input:focus-visible + label i {
color: var(--color-bg);
background-color: var(--color-pink);
border-color: var(--color-pink);
}
footer input:checked:focus-visible + label,
footer input:checked:focus-visible + label i {
color: var(--color-bg);
background-color: var(--color-teal);
border-color: var(--color-teal);
}
footer label:active {
top: .09em;
left: .09em;
box-shadow: .05em .05em var(--color-shadow);
}
label.theme-light {
border-top-left-radius: 1rem;
border-bottom-left-radius: 1rem;
border-right: none;
padding-left: .35rem;
}
label.theme-auto {
}
label.theme-dark {
border-top-right-radius: 1rem;
border-bottom-right-radius: 1rem;
border-left: none;
padding-right: .35rem;
}
footer input {
/* To allow screen reader to still access these. */
/* From https://lyra.horse/blog/2025/08/you-dont-need-js/ */
opacity: 0;
position: absolute;
pointer-events: none;
}
/* Pagination */ /* Pagination */
.pagination, .pagination,
.pagination li { .pagination li {
+1
View File
@@ -135,6 +135,7 @@ export default async function(eleventyConfig) {
/* Watch when serving */ /* Watch when serving */
eleventyConfig.addWatchTarget("css"); eleventyConfig.addWatchTarget("css");
eleventyConfig.addWatchTarget("js");
}; };
export const config = { export const config = {
+35
View File
@@ -0,0 +1,35 @@
const THEME = "theme";
const saveTheme = (themeValue) => {
localStorage.setItem(THEME, themeValue);
};
const themeLight = document.getElementById("theme-light");
themeLight.addEventListener("input", (e) => {
saveTheme(themeLight.value);
});
const themeAuto = document.getElementById("theme-auto");
themeAuto.addEventListener("input", (e) => {
saveTheme(themeAuto.auto);
});
const themeDark = document.getElementById("theme-dark");
themeDark.addEventListener("input", (e) => {
saveTheme(themeDark.value);
});
var currentThemeValue = localStorage.getItem(THEME);
switch (currentThemeValue) {
case "light":
themeLight.checked = true;
break;
case "auto":
themeAuto.checked = true;
break;
case "dark":
themeDark.checked = true;
break;
default:
themeAuto.checked = true;
}