<select class="theme reveal">
<option value="auto">Auto</opation>
<option value="dark">Dark</opation>
<option value="light">Light</opation>
</select>
<div class="spotlight"></div>
@import url('https://fonts.googleapis.com/css2?family=Tagesschrift&display=swap');
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
color-scheme: light dark;
--spotlight-cover: light-dark(white, black);
--spotlight-reveal: light-dark(black, white);
@media (prefers-color-scheme: dark) {
--spotlight-blend-mode: darken;
}
@media (prefers-color-scheme: light) {
--spotlight-blend-mode: lighten;
}
&:has(.theme option[value="dark"]:checked) {
color-scheme: dark;
--spotlight-blend-mode: darken;
}
&:has(.theme option[value="light"]:checked) {
color-scheme: light;
--spotlight-blend-mode: lighten;
}
}
body {
font-family: "Tagesschrift", system-ui;
min-height: 100vh;
display: grid;
place-items: center;
background-image: linear-gradient(to bottom right, aquamarine, hotpink);
}
select {
font: inherit;
padding: 1em 2em;
}
.spotlight {
position: fixed;
inset: 0;
pointer-events: none;
filter: blur(0.5em) contrast(10);
mix-blend-mode: var(--spotlight-blend-mode);
background-color: var(--spotlight-reveal);
outline: 2em solid var(--spotlight-cover);
background-image:
radial-gradient(circle at var(--clientX, 50%) var(--clientY, 50%), transparent 6em, var(--spotlight-cover) 8em),
repeating-conic-gradient(from -20deg, var(--spotlight-cover) 0 40deg, transparent 0 180deg);
background-size: 100% 100%, 4em 4em;
background-position: 0 0, calc(var(--clientX, 50%) * 1.5) calc(var(--clientY, 50%) * 1.5);
transition: opacity 1s, background-color 1s;
body:has(.reveal:hover) & {
opacity: 0;
background-color: var(--spotlight-cover);
}
}
document.body.addEventListener('mousemove', (e) => {
document.body.style.setProperty('--clientX', e.clientX + 'px');
document.body.style.setProperty('--clientY', e.clientY + 'px');
});
This Pen doesn't use any external CSS resources.