* {
border:0;
box-sizing:border-box;
margin:0;
padding:0;
}
:root {
--hue:223;
--bg:hsl(var(--hue),10%,90%);
--fg:hsl(var(--hue),10%,10%);
--focus:hsl(var(--hue),90%,50%);
--error:hsl(3,90%,40%);
--trans-dur:0.3s;
--trans-timing1:cubic-bezier(0.65,0,0.35,1);
--trans-timing2:cubic-bezier(0.65,0,0.35,1.5);
font-size:calc(14px + (30 - 14) * (100vw - 280px) / (3840 - 280));
}
body,button,input {
color:var(--fg);
font:1em/1.5 "DM Sans",sans-serif;
}
body {
background-color:var(--bg);
display:flex;
height:100vh;
transition:background-color var(--trans-dur),color var(--trans-dur);
}
button {
background-color:var(--fg);
border-radius:0.5em;
color:var(--bg);
cursor:pointer;
display:block;
padding:0.75em 1em;
width:100%;
transition:background-color var(--trans-dur),color var(--trans-dur);
-webkit-appearance:none;
appearance:none;
}
button:hover {
background-color:var(--focus);
}
form {
margin:auto;
padding:3em 0;
}
p {
margin-bottom:1.5em;
}
small {
font-size:0.75em;
line-height:2;
}
.field {
margin-bottom:1.5em;
padding-bottom:0.375em;
position:relative;
}
.field__error,.field__label {
position:absolute;
}
.field__error {
color:var(--error);
top:100%;
left:0;
transition:color var(--trans-dur);
}
.field__input,.field__label {
-webkit-tap-highlight-color:transparent;
}
.field__input {
background-color:white;
border-radius:0.5em;
box-shadow:0 0 0 0.125em white inset,0 0.25em 0 hsl(var(--hue),10%,70%);
outline:transparent;
padding:0.75em 1em;
min-width:15em;
-webkit-appearance:none;
appearance:none;
transition:background-color var(--trans-dur),box-shadow var(--trans-dur) var(--trans-timing1),color var(--trans-dur),transform var(--trans-dur) var(--trans-timing1);
}
.field__input:hover {
box-shadow:0 0 0 0.125em hsl(var(--hue),10%,70%) inset,0 0.25em 0 hsl(var(--hue),10%,70%);
transform:scale(1.08,1.08);
}
.field__input:focus-visible {
box-shadow:0 0 0 0.125em var(--focus) inset,0 0.25em 0 var(--focus);
transform:scale(1,1);
}
.field__input:active {
box-shadow:0 0 0 0.25em hsl(var(--hue),10%,70%) inset,0 0 0 hsl(var(--hue),10%,70%);
transform:translateY(0.375em);
}
.field__input[aria-invalid=true] {
animation:wobble calc(var(--trans-dur) * 3) var(--trans-timing1);
box-shadow:0 0 0 0.125em var(--error) inset,0 0.25em 0 var(--error);
}
.field__input[aria-invalid=true] + .field__error {
animation:fly-in calc(var(--trans-dur) * 3) var(--trans-timing1);
}
.field__label {
pointer-events:none;
top:0.75em;
left:1em;
transition:transform var(--trans-dur) var(--trans-timing2);
z-index:1;
}
.field:has(.field__input[aria-invalid=true]) .field__label {
animation:bounce calc(var(--trans-dur) * 3) var(--trans-timing1);
}
.field:has(.field__input:focus-visible) .field__label,.field:has(.field__input:not(:placeholder-shown)) .field__label {
pointer-events:auto;
transform:translate(-1em,-2.5em);
}
.field:has(.field__input:placeholder-shown:active) .field__label {
transform:translate(0.2em,0.375em);
transition-timing-function:var(--trans-timing1);
}
.note {
color:hsl(var(--hue),10%,30%);
transition:color var(--trans-dur);
}
/* Dark theme */
@media (prefers-color-scheme:dark) {
:root {
--bg:hsl(var(--hue),10%,10%);
--fg:hsl(var(--hue),10%,90%);
--focus:hsl(var(--hue),90%,70%);
--error:hsl(3,90%,60%);
}
.field__input {
background-color:hsl(var(--hue),10%,30%);
box-shadow:0 0 0 0.125em hsl(var(--hue),10%,30%) inset,0 0.25em 0 black;
}
.field__input:hover {
box-shadow:0 0 0 0.125em black inset,0 0.25em 0 black;
}
.field__input:focus-visible {
box-shadow:0 0 0 0.125em var(--focus) inset,0 0.25em 0 var(--focus);
}
.field__input:active {
box-shadow:0 0 0 0.25em black inset,0 0 0 black;
}
.field__input[aria-invalid=true] {
box-shadow:0 0 0 0.125em var(--error) inset,0 0.25em 0 var(--error);
}
.note {
color:hsl(var(--hue),10%,70%);
transition:color var(--trans-dur);
}
}/* Animations */
@keyframes bounce {
from,to {
transform:translate(-1em,-2.5em);
}
16.67% {
transform:translate(-1em,-1.75em) rotate(-15deg) translateX(-0.75em);
}
33.33% {
transform:translate(-1em,-5em) rotate(15deg);
}
50% {
transform:translate(-1em,-5em);
}
66.67% {
animation-timing-function:cubic-bezier(0.32,0,0.67,0);
transform:translate(-1em,-2em);
}
83.33% {
animation-timing-function:cubic-bezier(0.33,1,0.68,1);
transform:translate(-1em,-2.75em);
}
}@keyframes fly-in {
from,66.67% {
animation-timing-function:cubic-bezier(0.32,0,0.67,0);
opacity:0;
transform:translateY(50%);
}
83.33% {
animation-timing-function:cubic-bezier(0.33,1,0.68,1);
opacity:1;
transform:translateY(-25%);
}
to {
opacity:1;
transform:translateY(0);
}
}@keyframes wobble {
from,50%,to {
box-shadow:0 0 0 0.125em var(--error) inset,0 0.25em 0 var(--error);
transform:rotate(0);
}
16.67% {
box-shadow:0 0 0 0.125em var(--error) inset,-0.25em 0.25em 0 var(--error);
transform:rotate(-15deg);
}
33.33% {
box-shadow:0 0 0 0.125em var(--error) inset,0.25em -0.25em 0 var(--error);
transform:rotate(15deg);
}
}