@import url("https://fonts.googleapis.com/css?family=Open+Sans&display=swap"); *, *:before, *:after { box-sizing: border-box; position: relative; } :root { --easing: cubic-bezier(.5, 0, .5, 1); --duration: .3s; --blue: #6C80F5; } html, body { height: 100%; width: 100%; margin: 0; padding: 0; font-family: 'Open Sans', sans-serif; } body { display: -webkit-box; display: flex; -webkit-box-pack: center; justify-content: center; -webkit-box-align: center; align-items: center; } /* ---------------------------------- */ .toggle-wrapper { font-size: 2rem; display: -webkit-box; display: flex; -webkit-box-align: center; align-items: center; } #toggle { width: 2em; height: 2em; visibility: hidden; position: absolute; } #app { display: -webkit-box; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; flex-direction: row; color: #404843; } .fancy-toggle { font-size: 3rem; width: 1em; height: 1em; padding: 0.2em; box-sizing: content-box; margin-right: 1.5em; -webkit-transition: -webkit-transform 0.4s var(--easing); transition: -webkit-transform 0.4s var(--easing); transition: transform 0.4s var(--easing); transition: transform 0.4s var(--easing), -webkit-transform 0.4s var(--easing); -webkit-transition-property: width, background-color, -webkit-transform; transition-property: width, background-color, -webkit-transform; transition-property: transform, width, background-color; transition-property: transform, width, background-color, -webkit-transform; } .fancy-toggle .bg { background: grey; position: absolute; top: 0; left: 0; width: 175%; height: 100%; border-radius: 2em; box-shadow: 0 0.25em 0.5em rgba(0, 0, 0, 0.1); -webkit-transition: inherit; transition: inherit; } .fancy-toggle .circle { width: 1em; height: 1em; background: white; box-shadow: 0 0.25em 0.5em rgba(0, 0, 0, 0.1); border-radius: 50%; -webkit-transition: inherit; transition: inherit; } .fancy-toggle .circle > svg { -webkit-transform: rotate(-90deg); transform: rotate(-90deg); margin: -.1em; } .fancy-toggle .loader { stroke: var(--blue); stroke-width: 6; fill: none; stroke-dasharray: 1 1; stroke-dashoffset: -1; -webkit-transition: stroke-dasharray calc(var(--timeout, 0) * 0.5ms) linear, stroke-dashoffset 1000ms linear; transition: stroke-dasharray calc(var(--timeout, 0) * 0.5ms) linear, stroke-dashoffset 1000ms linear; } .status { overflow: hidden; display: grid; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .status > div { grid-area: 1 / 1; } .status-text { -webkit-transition: -webkit-transform var(--duration) var(--easing); transition: -webkit-transform var(--duration) var(--easing); transition: transform var(--duration) var(--easing); transition: transform var(--duration) var(--easing), -webkit-transform var(--duration) var(--easing); } .status-text[data-for="off"], .status-text[data-for="pending"] { -webkit-transform: translateY(-100%); transform: translateY(-100%); } .status-text[data-for="on"] { -webkit-transform: translateY(100%); transform: translateY(100%); } .status-text[data-active] ~ [data-for="pending"] { -webkit-transform: translateY(100%); transform: translateY(100%); } .status-text[data-active] { -webkit-transform: translateY(0); transform: translateY(0); } [data-state="off"] .fancy-toggle .bg { background: #E44B45; } [data-state="pending"] .fancy-toggle { -webkit-transform: translateX(50%); transform: translateX(50%); } [data-state="pending"] .fancy-toggle .bg { width: 100%; background: #b5b5b5; } [data-state="pending"] .fancy-toggle .loader { stroke-dashoffset: 0; } [data-state="on"] .fancy-toggle .bg { background: #1BCE6F; } [data-state="on"] .fancy-toggle .circle { -webkit-transform: translateX(100%); transform: translateX(100%); } [data-state="on"] .fancy-toggle .loader { stroke-dashoffset: 1; } body { -webkit-transition: background-color 0.3s var(--easing); transition: background-color 0.3s var(--easing); background-color: var(--bg-color); } body[data-toggle-state="off"] { --bg-color: #FFE3E2; } body[data-toggle-state="pending"] { --bg-color: #DCE1FF; } body[data-toggle-state="on"] { --bg-color: #E1FCED; }