theme switcher
This commit is contained in:
73
src/components/ThemeSwitcher.astro
Normal file
73
src/components/ThemeSwitcher.astro
Normal file
@@ -0,0 +1,73 @@
|
||||
---
|
||||
import Icon from '@components/Icon.astro';
|
||||
---
|
||||
|
||||
|
||||
<div class="theme-switcher">
|
||||
<button id="switch-to-dark">
|
||||
<Icon name="sun" />
|
||||
</button>
|
||||
<button id="switch-to-light">
|
||||
<Icon name="moon" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
||||
<style>
|
||||
.theme-switcher {
|
||||
position: relative;
|
||||
isolation: isolate;
|
||||
width: 1.5rem;
|
||||
height: 1.5rem;
|
||||
|
||||
transform: translateY(0.1rem);
|
||||
}
|
||||
|
||||
button {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
|
||||
background-color: transparent;
|
||||
padding: 0;
|
||||
color: var(--nav-link-color);
|
||||
border: none;
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
color: var(--accent-color);
|
||||
}
|
||||
|
||||
/* hide by default, i.e. if JS isn't enabled and the data-theme attribute didn't get set, */
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
transition:
|
||||
color 0.2s ease,
|
||||
opacity 0.5s ease,
|
||||
transform 0.5s ease;
|
||||
}
|
||||
|
||||
:global(html[data-theme="light"]) button#switch-to-dark {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
transform: rotate(360deg);
|
||||
/* whichever one is currently active should be on top */
|
||||
z-index: 10;
|
||||
}
|
||||
:global(html[data-theme="dark"]) button#switch-to-light {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
transform: rotate(-360deg);
|
||||
z-index: 10;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
document.getElementById('switch-to-dark')?.addEventListener('click', () => {
|
||||
localStorage.setItem('theme-preference', 'dark');
|
||||
document.documentElement.dataset.theme = 'dark';
|
||||
});
|
||||
document.getElementById('switch-to-light')?.addEventListener('click', () => {
|
||||
localStorage.setItem('theme-preference', 'light');
|
||||
document.documentElement.dataset.theme = 'light';
|
||||
})
|
||||
</script>
|
||||
Reference in New Issue
Block a user