168 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			SCSS
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
	
		
			3.2 KiB
		
	
	
	
		
			SCSS
		
	
	
	
	
	
| /**
 | |
|  * Modal (<dialog>)
 | |
|  */
 | |
| 
 | |
| :root {
 | |
|   --scrollbar-width: 0px;
 | |
| }
 | |
| 
 | |
| dialog {
 | |
|   display: flex;
 | |
|   z-index: 999;
 | |
|   position: fixed;
 | |
|   top: 0;
 | |
|   right: 0;
 | |
|   bottom: 0;
 | |
|   left: 0;
 | |
|   align-items: center;
 | |
|   justify-content: center;
 | |
|   width: inherit;
 | |
|   min-width: 100%;
 | |
|   height: inherit;
 | |
|   min-height: 100%;
 | |
|   padding: var(--spacing);
 | |
|   border: 0;
 | |
|   backdrop-filter: var(--modal-overlay-backdrop-filter);
 | |
|   background-color: var(--modal-overlay-background-color);
 | |
|   color: var(--color);
 | |
| 
 | |
|   // Content
 | |
|   article {
 | |
|     $close-selector: if($enable-classes, ".close", "a[rel='prev']");
 | |
|     max-height: calc(100vh - var(--spacing) * 2);
 | |
|     overflow: auto;
 | |
| 
 | |
|     @if map-get($breakpoints, "sm") {
 | |
|       @media (min-width: map-get($breakpoints, "sm")) {
 | |
|         max-width: map-get($viewports, "sm");
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     @if map-get($breakpoints, "md") {
 | |
|       @media (min-width: map-get($breakpoints, "md")) {
 | |
|         max-width: map-get($viewports, "md");
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     > header,
 | |
|     > footer {
 | |
|       padding: calc(var(--block-spacing-vertical) * 0.5)
 | |
|         var(--block-spacing-horizontal);
 | |
|     }
 | |
| 
 | |
|     > header {
 | |
|       #{$close-selector} {
 | |
|         margin: 0;
 | |
|         margin-left: var(--spacing);
 | |
|         float: right;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     > footer {
 | |
|       text-align: right;
 | |
| 
 | |
|       [role="button"] {
 | |
|         margin-bottom: 0;
 | |
| 
 | |
|         &:not(:first-of-type) {
 | |
|           margin-left: calc(var(--spacing) * 0.5);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     p {
 | |
|       &:last-of-type {
 | |
|         margin: 0;
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     // Close icon
 | |
|     #{$close-selector} {
 | |
|       display: block;
 | |
|       width: 1rem;
 | |
|       height: 1rem;
 | |
|       margin-top: calc(var(--block-spacing-vertical) * -0.5);
 | |
|       margin-bottom: var(--typography-spacing-vertical);
 | |
|       margin-left: auto;
 | |
|       background-image: var(--icon-close);
 | |
|       background-position: center;
 | |
|       background-size: auto 1rem;
 | |
|       background-repeat: no-repeat;
 | |
|       opacity: 0.5;
 | |
| 
 | |
|       @if $enable-transitions {
 | |
|         transition: opacity var(--transition);
 | |
|       }
 | |
| 
 | |
|       &:is([aria-current], :hover, :active, :focus) {
 | |
|         opacity: 1;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   // Closed state
 | |
|   &:not([open]),
 | |
|   &[open="false"] {
 | |
|     display: none;
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Utilities
 | |
| @if $enable-classes {
 | |
|   .modal-is-open {
 | |
|     padding-right: var(--scrollbar-width, 0px);
 | |
|     overflow: hidden;
 | |
|     pointer-events: none;
 | |
|     touch-action: none;
 | |
| 
 | |
|     dialog {
 | |
|       pointer-events: auto;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Animations
 | |
| @if ($enable-classes and $enable-transitions) {
 | |
|   $animation-duration: 0.2s;
 | |
| 
 | |
|   :where(.modal-is-opening, .modal-is-closing) {
 | |
|     dialog,
 | |
|     dialog > article {
 | |
|       animation-duration: $animation-duration;
 | |
|       animation-timing-function: ease-in-out;
 | |
|       animation-fill-mode: both;
 | |
|     }
 | |
| 
 | |
|     dialog {
 | |
|       animation-duration: ($animation-duration * 4);
 | |
|       animation-name: modal-overlay ;
 | |
| 
 | |
|       > article {
 | |
|         animation-delay: $animation-duration;
 | |
|         animation-name: modal;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .modal-is-closing {
 | |
|     dialog,
 | |
|     dialog > article {
 | |
|       animation-delay: 0s;
 | |
|       animation-direction: reverse;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   @keyframes modal-overlay {
 | |
|     from {
 | |
|       backdrop-filter: none;
 | |
|       background-color: transparent;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   @keyframes modal {
 | |
|     from {
 | |
|       transform: translateY(-100%);
 | |
|       opacity: 0;
 | |
|     }
 | |
|   }
 | |
| }
 |