@odopod/odo-dialog
Version:
Responsive window dialog component focused on a11y and extendibility
139 lines (123 loc) • 3.05 kB
CSS
body.odo-dialog-open {
position: relative;
overflow: hidden;
}
.odo-dialog {
position: fixed;
z-index: 1050;
top: 0;
left: 0;
right: 0;
bottom: 0;
display: none;
overflow-x: hidden;
overflow-y: auto;
width: 100%;
height: 100%;
height: 100vh;
/* If you modify the contents of the modal, you may run into issues: https://bugs.webkit.org/show_bug.cgi?id=158342 */
-webkit-overflow-scrolling: touch;
-webkit-transition: 250ms ease transform, 250ms ease opacity;
transition: 250ms ease transform, 250ms ease opacity;
}
.odo-dialog--open {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
/* Layer promote the dialog while it's open to prevent paints on scroll. */
.odo-dialog--visible {
will-change: transform;
-webkit-transform: translateZ(0);
transform: translateZ(0);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.odo-dialog--visible + .odo-dialog-backdrop {
-webkit-transform: translateZ(0);
transform: translateZ(0);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
/* Remove focus ring from role=dialog element because the user cannot really
do anything with it when it's focused and it looks weird to sighted users. It's
really only focused so that the next time the user hits tab, they go to content
within the dialog. */
.odo-dialog__element:focus {
outline: 0;
}
.odo-dialog-backdrop {
position: fixed;
z-index: 1040;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, .75);
-webkit-transition: opacity 250ms ease-out;
transition: opacity 250ms ease-out;
}
.odo-dialog--enter + .odo-dialog-backdrop,
.odo-dialog--leave-active + .odo-dialog-backdrop {
opacity: 0;
}
.odo-dialog__content {
position: relative;
z-index: 1;
margin: auto;
}
.odo-dialog--enter,
.odo-dialog--leave {
will-change: transform, opacity;
}
/* Fade and scale down by default */
.odo-dialog--enter,
.odo-dialog--leave-active {
opacity: 0;
-webkit-transform: scale(1.05);
transform: scale(1.05);
}
/* Fade transition */
.odo-dialog--fade.odo-dialog--enter,
.odo-dialog--fade.odo-dialog--leave-active {
-webkit-transform: none;
transform: none;
}
/* Fade and scale up */
.odo-dialog--zoom-in.odo-dialog--enter,
.odo-dialog--zoom-in.odo-dialog--leave-active {
-webkit-transform: scale(0.9);
transform: scale(0.9);
}
.odo-dialog--full .odo-dialog__content,
.odo-dialog--full .odo-dialog__inner {
width: inherit;
height: inherit;
margin: 0;
}
.odo-dialog__inner {
position: relative;
margin-top: 2.5vh;
margin-bottom: 2.5vh;
background-color: #fff;
}
.odo-dialog__close {
position: absolute;
top: 0;
right: 0;
display: block;
width: 40px;
height: 40px;
padding: 0;
border: 0;
background-color: transparent;
font-weight: bold;
font-size: 32px;
text-align: center;
line-height: 1;
cursor: pointer;
-webkit-transition: 150ms ease;
transition: 150ms ease;
}