parent
5d477da7e0
commit
fa766b123d
7 changed files with 233 additions and 13 deletions
@ -0,0 +1,187 @@ |
|||||||
|
:root { |
||||||
|
/** sunny side **/ |
||||||
|
--blue-background: #C2E9F6; |
||||||
|
--blue-border: #72cce3; |
||||||
|
--blue-color: #96dcee; |
||||||
|
--yellow-background: #fffaa8; |
||||||
|
--yellow-border: #f5eb71; |
||||||
|
/** dark side **/ |
||||||
|
--indigo-background: #808fc7; |
||||||
|
--indigo-border: #5d6baa; |
||||||
|
--indigo-color: #6b7abb; |
||||||
|
--gray-border: #e8e8ea; |
||||||
|
--gray-dots: #e8e8ea; |
||||||
|
/** general **/ |
||||||
|
--white: #fff; |
||||||
|
} |
||||||
|
|
||||||
|
// * { |
||||||
|
// margin: 0; |
||||||
|
// padding: 0; |
||||||
|
// } |
||||||
|
|
||||||
|
// body { |
||||||
|
// display: grid; |
||||||
|
// place-items: center; |
||||||
|
// min-height: 100vh; |
||||||
|
// position: relative; |
||||||
|
// } |
||||||
|
|
||||||
|
.background { |
||||||
|
position: absolute; |
||||||
|
left: 0; |
||||||
|
top: 0; |
||||||
|
background: var(--blue-background); |
||||||
|
z-index: -1; |
||||||
|
width: 100%; |
||||||
|
height: 100%; |
||||||
|
transition: all 250ms ease-in; |
||||||
|
} |
||||||
|
|
||||||
|
.toggle--checkbox { |
||||||
|
display: none; |
||||||
|
} |
||||||
|
.toggle--checkbox:checked { |
||||||
|
/** This will all flip from sun to moon **/ |
||||||
|
/** Change the label color **/ |
||||||
|
} |
||||||
|
.toggle--checkbox:checked ~ .background { |
||||||
|
background: var(--indigo-background); |
||||||
|
} |
||||||
|
.toggle--checkbox:checked + .toggle--label { |
||||||
|
background: var(--indigo-color); |
||||||
|
border-color: var(--indigo-border); |
||||||
|
/** Change the cloud to stars **/ |
||||||
|
/** Change the sun into the moon **/ |
||||||
|
/** Show the dimples on the moon **/ |
||||||
|
} |
||||||
|
.toggle--checkbox:checked + .toggle--label .toggle--label-background { |
||||||
|
left: 60px; |
||||||
|
width: 5px; |
||||||
|
} |
||||||
|
.toggle--checkbox:checked + .toggle--label .toggle--label-background:before { |
||||||
|
width: 5px; |
||||||
|
height: 5px; |
||||||
|
top: -25px; |
||||||
|
} |
||||||
|
.toggle--checkbox:checked + .toggle--label .toggle--label-background:after { |
||||||
|
width: 5px; |
||||||
|
height: 5px; |
||||||
|
left: -30px; |
||||||
|
top: 20px; |
||||||
|
} |
||||||
|
.toggle--checkbox:checked + .toggle--label:before { |
||||||
|
background: var(--white); |
||||||
|
border-color: var(--gray-border); |
||||||
|
animation-name: switch; |
||||||
|
animation-duration: 350ms; |
||||||
|
animation-fill-mode: forwards; |
||||||
|
} |
||||||
|
.toggle--checkbox:checked + .toggle--label:after { |
||||||
|
transition-delay: 350ms; |
||||||
|
opacity: 0; |
||||||
|
} |
||||||
|
.toggle--label { |
||||||
|
/** Placeholder element, starting at blue **/ |
||||||
|
width: 70px; |
||||||
|
height: 35px; |
||||||
|
margin-right: 60px; |
||||||
|
background: var(--blue-color); |
||||||
|
border-radius: 100px; |
||||||
|
border: 5px solid var(--blue-border); |
||||||
|
display: flex; |
||||||
|
position: relative; |
||||||
|
transition: all 350ms ease-in; |
||||||
|
/** The sun cloud and moon stars **/ |
||||||
|
/** Sun/Moon element **/ |
||||||
|
/** Gray dots on the moon **/ |
||||||
|
} |
||||||
|
.toggle--label-background { |
||||||
|
opacity: 0; |
||||||
|
width: 10px; |
||||||
|
height: 5px; |
||||||
|
border-radius: 5px; |
||||||
|
position: relative; |
||||||
|
background: var(--white); |
||||||
|
left: 5px; |
||||||
|
top: 12px; |
||||||
|
transition: all 150ms ease-in; |
||||||
|
} |
||||||
|
// .toggle--label-background:before { |
||||||
|
// content: ""; |
||||||
|
// position: absolute; |
||||||
|
// top: -5px; |
||||||
|
// width: 40px; |
||||||
|
// height: 5px; |
||||||
|
// border-radius: 5px; |
||||||
|
// background: var(--white); |
||||||
|
// left: -20px; |
||||||
|
// transition: all 150ms ease-in; |
||||||
|
// } |
||||||
|
// .toggle--label-background:after { |
||||||
|
// content: ""; |
||||||
|
// position: absolute; |
||||||
|
// top: 2px; |
||||||
|
// width: 40px; |
||||||
|
// height: 5px; |
||||||
|
// border-radius: 5px; |
||||||
|
// background: var(--white); |
||||||
|
// left: -10px; |
||||||
|
// transition: all 150ms ease-in; |
||||||
|
// } |
||||||
|
.toggle--label:before { |
||||||
|
animation-name: reverse; |
||||||
|
animation-duration: 350ms; |
||||||
|
animation-fill-mode: forwards; |
||||||
|
transition: all 350ms ease-in; |
||||||
|
content: ""; |
||||||
|
width: 25px; |
||||||
|
height: 25px; |
||||||
|
border: 5px solid var(--yellow-border); |
||||||
|
top: 1px; |
||||||
|
left: 0px; |
||||||
|
position: absolute; |
||||||
|
border-radius: 82px; |
||||||
|
background: var(--yellow-background); |
||||||
|
} |
||||||
|
.toggle--label:after { |
||||||
|
transition-delay: 0ms; |
||||||
|
transition: all 250ms ease-in; |
||||||
|
position: absolute; |
||||||
|
content: ""; |
||||||
|
box-shadow: var(--gray-dots) -13px 0 0 2px, var(--gray-dots) -24px 14px 0 -2px; |
||||||
|
left: 30px; |
||||||
|
top: 12px; |
||||||
|
width: 6px; |
||||||
|
height: 6px; |
||||||
|
background: transparent; |
||||||
|
border-radius: 50%; |
||||||
|
opacity: 0; |
||||||
|
} |
||||||
|
|
||||||
|
@keyframes switch { |
||||||
|
0% { |
||||||
|
left: 0px; |
||||||
|
} |
||||||
|
60% { |
||||||
|
left: 0px; |
||||||
|
width: 62px; |
||||||
|
} |
||||||
|
100% { |
||||||
|
left: 33px; |
||||||
|
width: 25px; |
||||||
|
} |
||||||
|
} |
||||||
|
@keyframes reverse { |
||||||
|
0% { |
||||||
|
left: 33px; |
||||||
|
width: 38px; |
||||||
|
} |
||||||
|
60% { |
||||||
|
left: 2px; |
||||||
|
width: 62px; |
||||||
|
} |
||||||
|
100% { |
||||||
|
left: 2px; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
import React from "react"; |
||||||
|
import { connect } from "react-redux"; |
||||||
|
import { publicApi } from "../../redux/actions"; |
||||||
|
|
||||||
|
function ThemeSwitch({ theme, setTheme }: any) { |
||||||
|
return ( |
||||||
|
<div className="desktop"> |
||||||
|
<input |
||||||
|
type="checkbox" |
||||||
|
id="toggle" |
||||||
|
checked={theme === 'dark'} |
||||||
|
className="toggle--checkbox" |
||||||
|
onChange={() => setTheme(theme === "light" ? "dark" : "light")} |
||||||
|
/> |
||||||
|
<label htmlFor="toggle" className="toggle--label"> |
||||||
|
<span className="toggle--label-background"></span> |
||||||
|
</label> |
||||||
|
</div> |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
export default connect( |
||||||
|
(state: any) => ({ |
||||||
|
theme: state.publicApi.theme, |
||||||
|
}), |
||||||
|
{ setTheme: publicApi.setTheme } |
||||||
|
)(ThemeSwitch); |
Loading…
Reference in new issue