Added dark/light toggle button
This commit is contained in:
		
							parent
							
								
									34cab08d41
								
							
						
					
					
						commit
						834df78310
					
				
					 5 changed files with 203 additions and 34 deletions
				
			
		|  | @ -144,8 +144,8 @@ input[type="radio"] { | ||||||
|     float: left; |     float: left; | ||||||
|     border: 0px; |     border: 0px; | ||||||
|     border-radius: 10px; |     border-radius: 10px; | ||||||
|     padding-top: 25px; |     height: 56px; | ||||||
|     padding-bottom: 25px; |     margin-top: 7px; | ||||||
|     background-color: var(--bg-nxt); |     background-color: var(--bg-nxt); | ||||||
|     color: var(--fg-nxt); |     color: var(--fg-nxt); | ||||||
|     font-weight: bold; |     font-weight: bold; | ||||||
|  | @ -179,6 +179,7 @@ input[type="radio"] { | ||||||
| 
 | 
 | ||||||
|     #next { |     #next { | ||||||
|         min-width: 100%; |         min-width: 100%; | ||||||
|  |         margin-top: 20px; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     #questions { |     #questions { | ||||||
|  | @ -194,6 +195,14 @@ input[type="radio"] { | ||||||
|     .b { |     .b { | ||||||
|         font-size: small; |         font-size: small; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     .toggle { | ||||||
|  |         min-width: 100%; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     .toggle_label { | ||||||
|  |         min-width: 100%;; | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @media (prefers-color-scheme: dark) { | @media (prefers-color-scheme: dark) { | ||||||
|  | @ -246,3 +255,111 @@ input[type="radio"] { | ||||||
|         color: var(--fg-lnk) !important; |         color: var(--fg-lnk) !important; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #toggle_checkbox { | ||||||
|  |     display: none; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .spacer { | ||||||
|  |     width: 10%; | ||||||
|  |     float: left; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .toggle { | ||||||
|  |     width: 10%; | ||||||
|  |     float: left; | ||||||
|  |     display: none; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .toggle_label { | ||||||
|  |     display: block; | ||||||
|  |     position: relative; | ||||||
|  |     top: 35px; | ||||||
|  |     right: 0; | ||||||
|  |     left: 0; | ||||||
|  |     width: 80%; | ||||||
|  |     height: 56px; | ||||||
|  |     margin: 0 auto; | ||||||
|  |     background-color: var(--bg-ab); | ||||||
|  |     border-radius: 25px; | ||||||
|  |     transform: translateY(-50%); | ||||||
|  |     cursor: pointer; | ||||||
|  |     transition: 0.3s ease background-color; | ||||||
|  |     overflow: hidden; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #star { | ||||||
|  |     position: absolute; | ||||||
|  |     top: 13px; | ||||||
|  |     left: 13px; | ||||||
|  |     width: 30px; | ||||||
|  |     height: 30px; | ||||||
|  |     transform: scale(1); | ||||||
|  |     border-radius: 50%; | ||||||
|  |     transition: 0.3s ease top, 0.3s ease left, 0.3s ease transform, 0.3s ease background-color; | ||||||
|  |     z-index: 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #star-1 { | ||||||
|  |     position: relative; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #star-2 { | ||||||
|  |     position: absolute; | ||||||
|  |     transform: rotateZ(36deg); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .star { | ||||||
|  |     top: 0; | ||||||
|  |     left: -7px; | ||||||
|  |     font-size: 54px; | ||||||
|  |     line-height: 28px; | ||||||
|  |     color: var(--bg-a); | ||||||
|  |     transition: 0.3s ease color; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #moon { | ||||||
|  |     position: absolute; | ||||||
|  |     bottom: -52px; | ||||||
|  |     right: 8px; | ||||||
|  |     width: 40px; | ||||||
|  |     height: 40px; | ||||||
|  |     background-color: var(--bg-a); | ||||||
|  |     border-radius: 50%; | ||||||
|  |     transition: 0.3s ease bottom; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #moon:before { | ||||||
|  |     content: ""; | ||||||
|  |     position: absolute; | ||||||
|  |     top: -12px; | ||||||
|  |     left: -17px; | ||||||
|  |     width: 40px; | ||||||
|  |     height: 40px; | ||||||
|  |     background-color: var(--bg-ab); | ||||||
|  |     border-radius: 50%; | ||||||
|  |     transition: 0.3s ease background-color; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #toggle_checkbox:checked+label { | ||||||
|  |     background-color: var(--bg-b); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #toggle_checkbox:checked+label #star { | ||||||
|  |     top: 0px; | ||||||
|  |     left: 640px; | ||||||
|  |     transform: scale(0.3); | ||||||
|  |     background-color: var(--bg); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #toggle_checkbox:checked+label .star { | ||||||
|  |     color: var(--bg-a); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #toggle_checkbox:checked+label #moon { | ||||||
|  |     bottom: 8px; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #toggle_checkbox:checked+label #moon:before { | ||||||
|  |     background-color: var(--bg-b); | ||||||
|  | } | ||||||
|  | @ -1,4 +1,29 @@ | ||||||
| :root { | :root { | ||||||
|  |     --bg: #E7E5E2; | ||||||
|  |     --fg: #243233; | ||||||
|  |     --br: #243233; | ||||||
|  |     --fg-lnk: #8FA3A9; | ||||||
|  | 
 | ||||||
|  |     --bg-header: #8FA3A9; | ||||||
|  |     --fg-header: #243233; | ||||||
|  |     --bg-ab: #89A6C0; | ||||||
|  | 
 | ||||||
|  |     --bg-a: #F7D214; | ||||||
|  |     --fg-a: #243233; | ||||||
|  |     --bg-b: #243233; | ||||||
|  |     --fg-b: #F7D214; | ||||||
|  | 
 | ||||||
|  |     --bg-ab-chkd: #B3472B; | ||||||
|  |     --fg-ab-chkd: #E7E5E2; | ||||||
|  |     --br-ab-chkd: #000000; | ||||||
|  | 
 | ||||||
|  |     --fg-sep: #243233; | ||||||
|  |     --fg-que: #243233; | ||||||
|  |     --bg-nxt: #8FA3A9; | ||||||
|  |     --fg-nxt: #243233; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | [data-theme="dark"] { | ||||||
|     --bg: #243233; |     --bg: #243233; | ||||||
|     --fg: #E7E5E2; |     --fg: #E7E5E2; | ||||||
|     --br: #E7E5E2; |     --br: #E7E5E2; | ||||||
|  | @ -1,24 +0,0 @@ | ||||||
| :root { |  | ||||||
|     --bg: #E7E5E2; |  | ||||||
|     --fg: #243233; |  | ||||||
|     --br: #243233; |  | ||||||
|     --fg-lnk: #8FA3A9; |  | ||||||
| 
 |  | ||||||
|     --bg-header: #8FA3A9; |  | ||||||
|     --fg-header: #243233; |  | ||||||
|     --bg-ab: #89A6C0; |  | ||||||
| 
 |  | ||||||
|     --bg-a: #F7D214; |  | ||||||
|     --fg-a: #243233; |  | ||||||
|     --bg-b: #243233; |  | ||||||
|     --fg-b: #F7D214; |  | ||||||
| 
 |  | ||||||
|     --bg-ab-chkd: #B3472B; |  | ||||||
|     --fg-ab-chkd: #E7E5E2; |  | ||||||
|     --br-ab-chkd: #000000; |  | ||||||
| 
 |  | ||||||
|     --fg-sep: #243233; |  | ||||||
|     --fg-que: #243233; |  | ||||||
|     --bg-nxt: #8FA3A9; |  | ||||||
|     --fg-nxt: #243233; |  | ||||||
| } |  | ||||||
							
								
								
									
										34
									
								
								static/js/toggle.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								static/js/toggle.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | ||||||
|  | function initToggle() { | ||||||
|  |     const toggleSwitch = document.querySelector('.toggle input[type="checkbox"]'); | ||||||
|  |     const currentTheme = localStorage.getItem('theme') ? localStorage.getItem('theme') : null; | ||||||
|  | 
 | ||||||
|  |     function switchTheme(e) { | ||||||
|  |         if (e.target.checked) { | ||||||
|  |             document.documentElement.setAttribute('data-theme', 'dark'); | ||||||
|  |             localStorage.setItem('theme', 'dark'); //add this
 | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |             document.documentElement.setAttribute('data-theme', 'light'); | ||||||
|  |             localStorage.setItem('theme', 'light'); //add this
 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     toggleSwitch.addEventListener('change', switchTheme, false); | ||||||
|  | 
 | ||||||
|  |     if (currentTheme) { | ||||||
|  |         document.documentElement.setAttribute('data-theme', currentTheme); | ||||||
|  | 
 | ||||||
|  |         if (currentTheme === 'dark') { | ||||||
|  |             toggleSwitch.checked = true; | ||||||
|  |         } else { | ||||||
|  |             toggleSwitch.checked = false; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     document.querySelectorAll('.spacer').forEach(function (el) { | ||||||
|  |         el.style.display = 'none'; | ||||||
|  |     }); | ||||||
|  |     document.querySelectorAll('.toggle').forEach(function (el) { | ||||||
|  |         el.style.display = 'unset'; | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  | @ -1,14 +1,15 @@ | ||||||
| <!DOCTYPE html> | <!DOCTYPE html> | ||||||
| <html lang="{{ lang }}"> | {%- if theme == "light" %} | ||||||
|  | <html lang="{{ lang }}" data-theme="dark"> | ||||||
|  | {%- else %} | ||||||
|  | <html lang="{{ lang }}" data-theme="light"> | ||||||
|  | {%- endif %} | ||||||
| 
 | 
 | ||||||
| <head> | <head> | ||||||
|     <title>{{ title }}</title> |     <title>{{ title }}</title> | ||||||
|  |     <script src="/js/toggle.js" type="text/javascript"></script> | ||||||
|     <link rel="stylesheet" type="text/css" href="/css/base.css?t={{ epoch }}"> |     <link rel="stylesheet" type="text/css" href="/css/base.css?t={{ epoch }}"> | ||||||
|     {%- if theme == "light" %} |     <link rel="stylesheet" type="text/css" href="/css/colors.css?t={{ epoch }}"> | ||||||
|     <link rel="stylesheet" type="text/css" href="/css/light.css?t={{ epoch }}"> |  | ||||||
|     {%- else %} |  | ||||||
|     <link rel="stylesheet" type="text/css" href="/css/dark.css?t={{ epoch }}"> |  | ||||||
|     {%- endif %} |  | ||||||
|     <link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('static', filename='apple-touch-icon.png') }}"> |     <link rel="apple-touch-icon" sizes="180x180" href="{{ url_for('static', filename='apple-touch-icon.png') }}"> | ||||||
|     <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon-32x32.png') }}"> |     <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='favicon-32x32.png') }}"> | ||||||
|     <link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicon-16x16.png') }}"> |     <link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='favicon-16x16.png') }}"> | ||||||
|  | @ -45,13 +46,29 @@ | ||||||
|         <div id="footer"> |         <div id="footer"> | ||||||
|             <div id="questions">{{ questions_prefix }} {{ num_lines }} {{ questions_suffix }}<br><a |             <div id="questions">{{ questions_prefix }} {{ num_lines }} {{ questions_suffix }}<br><a | ||||||
|                     href="mailto:{{ mailto }}">Einreichen!</a></div> |                     href="mailto:{{ mailto }}">Einreichen!</a></div> | ||||||
|             <div class="separator"> </div> |             <div class="spacer"> </div> | ||||||
|  |             <div class="toggle"> | ||||||
|  |                 {%- if theme == "light" %} | ||||||
|  |                 <input type="checkbox" id="toggle_checkbox"> | ||||||
|  |                 {%- else %} | ||||||
|  |                 <input type="checkbox" id="toggle_checkbox" checked="checked"> | ||||||
|  |                 {%- endif %} | ||||||
|  |                 <label for="toggle_checkbox" class="toggle_label"> | ||||||
|  |                     <div id="star"> | ||||||
|  |                         <div class="star" id="star-1">★</div> | ||||||
|  |                         <div class="star" id="star-2">★</div> | ||||||
|  |                     </div> | ||||||
|  |                     <div id="moon"></div> | ||||||
|  |                 </label> | ||||||
|  |             </div> | ||||||
|             <form action="/" method="get"> |             <form action="/" method="get"> | ||||||
|                 <input type="hidden" name="t" value="{{ epoch }}"> |                 <input type="hidden" name="t" value="{{ epoch }}"> | ||||||
|                 <button id="next" type="submit">{{ more }}</button> |                 <button id="next" type="submit">{{ more }}</button> | ||||||
|             </form> |             </form> | ||||||
|         </div> |         </div> | ||||||
|     </div> |     </div> | ||||||
|  |     <script type="text/javascript"> | ||||||
|  |         initToggle(); | ||||||
|  |     </script> | ||||||
| </body> | </body> | ||||||
| 
 |  | ||||||
| </html> | </html> | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue