mirror of
				https://github.com/fooflington/selfdefined.git
				synced 2025-10-31 14:18:32 +00:00 
			
		
		
		
	 7f7943d2fc
			
		
	
	7f7943d2fc
	
	
	
		
			
			* feat(dark mode): set up first set of colors * feat(dark mode): define state colours * 🧹 * feat(dark mode): variablify all teh wordz * feat(dark mode): set colors on body * feat(dark mode): replace hard coded color value * feat(dark mode): 🌑 * feat(a11y): update link focus styles - restores visible focus in windows high contrast mode - increases visibility in boxes with bg colour * feat(dark mode): enable postcss * 💅 * feat(dark mode): add user control * chore: use generic headline name * feat(dark mode): hide switch until script loads * feat(dark mode): increase link contrast * add content warning to footer nav partial * feat(dark mode): replace hard coded colour value in alertbox * feat(dark mode): tone down text colour * feat(dark mode): properly invert code elements * 🧹 move box styles into own partial * feat(dark mode): use darker colour as background for links
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| function initThemeSwitch() {
 | |
|   let $switchContainer = document.querySelector('.js-theme-switch');
 | |
| 
 | |
|   if (!$switchContainer) return;
 | |
| 
 | |
|   $switchContainer.hidden = false;
 | |
| 
 | |
|   let userOverwrite = ['light', 'dark'];
 | |
| 
 | |
|   let $buttons = $switchContainer.querySelectorAll('[type="radio"]');
 | |
| 
 | |
|   /**
 | |
|    * @type String
 | |
|    */
 | |
|   let userThemeSetting = localStorage.getItem('sdUserTheme');
 | |
| 
 | |
|   function setInitialState() {
 | |
|     if (userThemeSetting) {
 | |
|       document.documentElement.setAttribute(
 | |
|         'data-user-theme',
 | |
|         userThemeSetting
 | |
|       );
 | |
|       $switchContainer.querySelector(
 | |
|         `[value="${userThemeSetting}"]`
 | |
|       ).checked = true;
 | |
|     } else {
 | |
|       $switchContainer.querySelector('[value="system"]').checked = true;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function setUserPreference(value) {
 | |
|     localStorage.setItem('sdUserTheme', value);
 | |
|     document.documentElement.setAttribute('data-user-theme', value);
 | |
|   }
 | |
| 
 | |
|   function unsetUserPreference() {
 | |
|     localStorage.removeItem('sdUserTheme');
 | |
|     document.documentElement.removeAttribute('data-user-theme');
 | |
|   }
 | |
| 
 | |
|   Array.from($buttons).forEach(function($button) {
 | |
|     $button.addEventListener('change', function() {
 | |
|       // only run the switch functionality for the currently active radio button
 | |
|       if (!$button.checked) return;
 | |
| 
 | |
|       if (userOverwrite.includes($button.value)) {
 | |
|         setUserPreference($button.value);
 | |
|       } else {
 | |
|         unsetUserPreference();
 | |
|       }
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   setInitialState();
 | |
| }
 | |
| 
 | |
| if (document.readyState === 'complete') {
 | |
|   initThemeSwitch();
 | |
| } else {
 | |
|   window.addEventListener('load', function() {
 | |
|     initThemeSwitch();
 | |
|   });
 | |
| }
 |