artistry
Version:
A powerful and configurable stylesheet
272 lines (234 loc) • 7.56 kB
text/stylus
@require 'modal-settings.styl';
@require '../grid/container.styl';
@require '../animation/overflow.styl';
$modal-margin-right = (-1 * $modal-width / 2);
$modal-transition-duration = $modal-fade-duration + $modal-slide-duration;
.modal {
display: block;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
visibility: hidden;
overflow-y: hidden;
overflow-x: hidden;
transition-property: visibility;
transition-duration: $modal-transition-duration;
will-change: visibility;
.modal-background {
display: block;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
&:before {
content: '';
display: block;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: $modal-mask-background-color;
opacity: 0;
transition-property: opacity;
transition-duration: ($modal-transition-duration / 2);
transition-delay: ($modal-transition-duration / 2);
will-change: opacity;
}
.modal-content {
position: fixed;
display: flex;
flex-direction: column;
margin: 0;
padding: 0;
top: 0;
bottom: 0;
width: 100%;
border-radius: 0;
// width: $modal-width;
min-height: $modal-min-height;
background-color: $modal-background-color;
box-shadow: $modal-content-box-shadow;
transform: translateY(-2 * ($modal-margin-top + $modal-margin-bottom)) translateY(-100%);
transition-property: transform;
transition-duration: $modal-slide-duration;
transition-delay: 0s;
will-change: transform;
clearfix();
.modal-header {
display: flex;
flex-direction: row;
margin: 0;
padding: 0;
border-bottom: $modal-border-width solid $modal-border-color;
color: $modal-header-color;
background-color: $modal-header-background-color;
border-top-left-radius: 0;
border-top-right-radius: 0;
.modal-title {
margin: $modal-spacing;
flex-grow: 0;
font-size: $modal-title-font-size;
font-weight: $modal-title-font-weight;
}
}
.modal-body {
margin: 0;
padding: 0;
flex: 1;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
&:first-child {
&.lock-contents:after {
border-top-right-radius: max(0, $modal-border-radius - $modal-border-width);
border-top-left-radius: max(0, $modal-border-radius - $modal-border-width);
}
}
&:last-child {
&.lock-contents:after {
border-bottom-right-radius: max(0, $modal-border-radius - $modal-border-width);
border-bottom-left-radius: max(0, $modal-border-radius - $modal-border-width);
}
}
}
.modal-footer {
display: flex;
flex-direction: row;
margin: 0;
padding: 0;
border-top: $modal-border-width solid $modal-border-color;
color: $modal-footer-color;
background-color: $modal-footer-background-color;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
&.modal-space,
.modal-space {
padding: $modal-spacing;
}
}
}
&.modal-animate-top {
.modal-content {
transform: translateY(-2 * ($modal-margin-top + $modal-margin-bottom)) translateY(-100%);
}
}
&.modal-animate-right {
.modal-content {
transform: translateX(110vw);
}
}
&.modal-animate-bottom {
.modal-content {
transform: translateY(110vh);
}
}
&.modal-animate-left {
.modal-content {
transform: translateX(-110vw);
}
}
&.modal-animate-center {
.modal-content {
transition-property: transform, opacity;
transform: scale(0, 0);
opacity: 0;
}
}
&.modal-animate-fade {
.modal-content {
transition-property: transform, opacity;
opacity: 0;
}
}
&.modal-open {
visibility: inherit;
//overflow-y: auto;
& > .modal-background {
overflow-y: visible;
overflow-x: visible;
animation-name: overflow-xy-hidden;
animation-duration: $modal-transition-duration;
&:before {
opacity: 1;
transition-duration: $modal-fade-duration;
transition-delay: 0s;
}
& > .modal-content {
transition-delay: $modal-fade-duration;
transform: none;
opacity: 1;
}
}
}
}
modal-floating($min-width = false) {
&.modal-open {
overflow-y: scroll;
overflow-x: visible;
animation-name: overflow-x-hidden;
animation-duration: $modal-transition-duration;
-webkit-overflow-scrolling: touch;
}
& > .modal-background {
overflow-y: visible;
& > .modal-content {
position: relative;
display: block;
top: unset;
bottom: unset;
flex-direction: unset;
margin: $modal-margin-top auto $modal-margin-top auto;
if ($min-width) {
width: 'calc(%s - var(--scrollbar-width))' % $min-width;
} else {
width: 100%;
}
border: $modal-border-width solid $modal-border-color;
border-radius: $modal-border-radius;
.modal-header {
border-top-left-radius: $modal-border-radius;
border-top-right-radius: $modal-border-radius;
}
.modal-body {
-webkit-overflow-scrolling: auto;
overflow-y: visible;
}
.modal-footer {
border-bottom-left-radius: $modal-border-radius;
border-bottom-right-radius: $modal-border-radius;
}
}
}
}
modal-size(sizes...) {
for size in sizes {
@media only screen and (min-width: size) {
modal-floating(size);
}
}
}
.modal-all {
modal-size($size-xs, $size-sm, $size-md, $size-lg, $size-xl);
}
.modal-floating {
modal-floating();
}
.modal-xs {
modal-size($size-xs);
}
.modal-sm {
modal-size($size-sm);
}
.modal-md {
modal-size($size-md);
}
.modal-lg {
modal-size($size-lg);
}
.modal-xl {
modal-size($size-xl);
}