Ghost/ghost/admin/app/styles/components/modals-new.css
Kevin Ansfield 5ce67c7892 Initial ember-promise-modals implementation
refs https://github.com/TryGhost/Team/issues/559

We want to get rid of our existing modals implementation because it doesn't play well with Glimmer compoments and the animation library it uses is now unmaintained and blocking our Ember.js upgrades.

- installed addon using customised fork
  - fork allows passthrough of `allowOutsideClick` to `focus-trap` so we can allow clicks on dropdowns and other wormholed content inside of a modal
- extended the `modals` service locally so we can customise click-outside-to-close behaviour and tie in with our `dropdowns` service
- set up styles in `modals-new.css`, mostly copied from `modals.css` with a few specific overrides
  - once all modals are converted we can drop the old `modals.css` and rename `modals-new.css`
2021-09-13 13:01:12 +01:00

290 lines
6.3 KiB
CSS

: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.15s;
--epm-animation-backdrop-out-duration: 0.15s;
--epm-animation-modal-in-duration: 0.15s;
--epm-animation-modal-out-duration: 0.15s;
--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-opacity: 0.6;
--epm-backdrop-background: #15171A;
}
@media (prefers-reduced-motion: reduce) {
:root {
--epm-animation-backdrop-in-duration: 0s;
--epm-animation-backdrop-out-duration: 0s;
--epm-animation-modal-in-duration: 0s;
--epm-animation-modal-out-duration: 0s;
--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-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: var(--epm-backdrop-opacity);
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;
justify-content: center;
overflow: auto;
}
.epm-animating .epm-modal-container {
overflow: unset;
}
.epm-modal {
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 */
pointer-events: none;
}
.epm-modal * {
pointer-events: auto;
}
@media (max-width: 900px) {
.epm-modal {
padding: 10px;
}
}
.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 {
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: var(--epm-backdrop-opacity);
}
}
@keyframes epm-backdrop-out {
0% {
opacity: var(--epm-backdrop-opacity);
}
100% {
opacity: 0;
}
}
@keyframes epm-modal-in {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes epm-modal-out {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
/* The modal
/* ---------------------------------------------------------- */
/* TODO: remove .epm-modal once original modals.css is removed */
.epm-modal .fullscreen-modal {
margin: 30px auto;
}
/* Modal content
/* ---------------------------------------------------------- */
/* TODO: remove .epm-modal once original modals.css is removed */
.epm-modal .modal-content {
position: relative;
padding: 32px;
background-color: #fff;
background-clip: padding-box;
border-radius: 3px;
box-shadow:
0 2.8px 2.2px rgba(0, 0, 0, 0.02),
0 6.7px 5.3px rgba(0, 0, 0, 0.028),
0 12.5px 10px rgba(0, 0, 0, 0.035),
0 22.3px 17.9px rgba(0, 0, 0, 0.042),
0 41.8px 33.4px rgba(0, 0, 0, 0.05),
0 100px 80px rgba(0, 0, 0, 0.07)
;
}
.modal-content * {
user-select: text;
}
.modal-content .close {
position: absolute;
top: 16px;
right: 16px;
z-index: 9999;
margin: 0;
padding: 0;
width: 16px;
height: 16px;
border: none;
}
.modal-content .close svg {
fill: #808284;
width: 16px;
height: 16px;
}
.modal-content .close svg:hover {
fill: var(--darkgrey);
}
.modal-header {
position: relative;
margin-bottom: 22px;
}
.modal-header h1 {
display: inline-block;
margin: -5px 25px 0 0;
font-size: 2.2rem;
line-height: 1.15em;
font-weight: 600;
letter-spacing: 0.2px;
}
.modal-header.icon-center {
padding-top: 8px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-end;
min-height: 124px;
}
.modal-header.icon-center svg {
width: 66px;
height: 66px;
}
.modal-header.icon-center h1 {
margin: 20px 0 8px;
padding: 0;
}
.modal-header.icon-center .gh-loading-content {
position: relative;
padding: 8px 0;
height: 62px;
}
.modal-body {
position: relative;
}
.modal-body p {
font-size: 1.4rem;
line-height: 1.5em;
}
.modal-footer {
display: flex;
justify-content: flex-end;
margin-top: 20px;
}
.modal-footer-spread {
justify-content: space-between;
}
.modal-footer button {
margin-left: 12px;
min-width: 100px;
text-align: center;
}
.modal-footer button:first-of-type {
margin-left: 0;
}
.modal-footer-hint {
font-size: 1.3rem;
color: var(--midgrey-d2);
}
.modal-body .gh-image-uploader {
margin: 0;
background: color-mod(var(--whitegrey) h(+7) s(-4%) l(+5%));
}
/* Modifiers
/* ---------------------------------------------------------- */
/* TODO: remove .epm-modal once original modals.css is removed */
.epm-modal .fullscreen-modal-wide {
width: 100%;
max-width: 550px;
}
.epm-modal .fullscreen-modal-action {
margin: 6vw 0;
}
@media (max-height: 960px) {
.epm-modal .fullscreen-modal-action {
margin: 40px auto;
}
}