ember-promise-modals
Version:
The better way to handle modals in your Ember.js apps.
135 lines (121 loc) • 3.59 kB
CSS
@layer ember-promise-modals {
:root {
/* The named -duration and -delay variables will be lowered to near zero when using the setupPromiseModals test helper */
--epm-animation-backdrop-in-duration: 0.3s;
--epm-animation-backdrop-out-duration: 0.18s;
--epm-animation-modal-in-duration: 0.3s;
--epm-animation-modal-out-duration: 0.18s;
--epm-animation-backdrop-in-delay: 0s;
--epm-animation-backdrop-out-delay: 0s;
--epm-animation-modal-in-delay: 0s;
--epm-animation-modal-out-delay: 0s;
--epm-animation-backdrop-in: var(--epm-animation-backdrop-in-duration) ease var(--epm-animation-backdrop-in-delay) forwards epm-backdrop-in;
--epm-animation-backdrop-out: var(--epm-animation-backdrop-out-duration) ease var(--epm-animation-backdrop-out-delay) forwards epm-backdrop-out;
--epm-animation-modal-in: var(--epm-animation-modal-in-duration) ease-out var(--epm-animation-modal-in-delay) forwards epm-modal-in;
--epm-animation-modal-out: var(--epm-animation-modal-out-duration) ease-out var(--epm-animation-modal-out-delay) forwards epm-modal-out;
--epm-backdrop-background: #2d3748CD;
}
}
@media (prefers-reduced-motion: reduce) {
:root {
--epm-animation-backdrop-in-duration: 0.001s;
--epm-animation-backdrop-out-duration: 0.001s;
--epm-animation-modal-in-duration: 0.001s;
--epm-animation-modal-out-duration: 0.001s;
--epm-animation-backdrop-in-delay: 0.001s;
--epm-animation-backdrop-out-delay: 0.001s;
--epm-animation-modal-in-delay: 0.001s;
--epm-animation-modal-out-delay: 0.001s;
}
}
.epm-scrolling-disabled {
overflow: hidden;
}
.epm-backdrop,
.epm-modal-container {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
}
.epm-backdrop {
background-color: var(--epm-backdrop-background);
opacity: 0;
animation: var(--epm-animation-backdrop-in);
animation-delay: var(--epm-animation-backdrop-in-delay);
animation-duration: var(--epm-animation-backdrop-in-duration);
}
.epm-modal-container {
display: flex;
align-items: center;
justify-content: center;
overflow: auto;
}
.epm-animating .epm-modal-container {
overflow: unset;
}
.epm-modal {
margin: auto;
transform: translate(0, -30vh) scale(1.1);
opacity: 0;
animation: var(--epm-animation-modal-in);
animation-delay: var(--epm-animation-modal-in-delay);
animation-duration: var(--epm-animation-modal-in-duration);
-webkit-overflow-scrolling: touch; /* momentum-based scrolling for Safari on iOS */
}
.epm-backdrop.epm-out {
opacity: 1;
animation: var(--epm-animation-backdrop-out);
animation-delay: var(--epm-animation-backdrop-out-delay);
animation-duration: var(--epm-animation-backdrop-out-duration);
pointer-events: none;
}
.epm-modal.epm-out {
transform: translate(0, 0) scale(1);
opacity: 1;
animation: var(--epm-animation-modal-out);
animation-delay: var(--epm-animation-modal-out-delay);
animation-duration: var(--epm-animation-modal-out-duration);
pointer-events: none;
}
@keyframes epm-backdrop-in {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes epm-backdrop-out {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@keyframes epm-modal-in {
0% {
transform: translate(0, -30vh) scale(1.1);
opacity: 0;
}
72% {
transform: translate(0, 0) scale(0.99);
opacity: 1;
}
100% {
transform: translate(0, 0) scale(1);
opacity: 1;
}
}
@keyframes epm-modal-out {
0% {
transform: translate(0, 0) scale(1);
opacity: 1;
}
100% {
transform: translate(0, -10vh) scale(0.8);
opacity: 0;
}
}