@dialpad/dialtone-css
Version:
Dialpad's design system
347 lines (298 loc) • 9.75 kB
text/less
//
// DIALTONE
// COMPONENTS: MODALS
//
// These are modal classes for Dialpad's design system Dialtone.
// For further documentation of these and other classes,
// visit https://dialtone.dialpad.com/components/modals
//
// TABLE OF CONTENTS
// • BASE STYLES
// - Wrapper
// - Dialog
// - Make them appear
// • MODAL BACKGROUND
// • HEADER
// • CONTENT
// • FOOTER
// • TRANSITIONS
//
// ============================================================================
// $ BASE STYLES
// ============================================================================
// $$ WRAPPER
// ----------------------------------------------------------------------------
.d-modal {
// Component CSS Vars
// ------------------------------------------------------------------------
--modal-backdrop-color-background: var(--dt-color-surface-backdrop);
--modal-dialog-padding: var(--dt-space-600);
--modal-dialog-color-background: var(--dt-color-surface-primary);
--modal-dialog-color-border: var(--dt-color-border-subtle);
--modal-dialog-color-text: var(--dt-color-foreground-primary);
--modal-header-color-text: var(--dt-color-foreground-primary);
--modal-dialog-shadow: var(--dt-shadow-large);
// If we don't set this the native app header region will override all click events on the modal overlay
-webkit-app-region: no-drag;
position: fixed;
inset: 0;
z-index: var(--zi-hide);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: var(--dt-space-600); // 32
background-color: var(--modal-backdrop-color-background);
backface-visibility: hidden;
visibility: hidden;
opacity: 0;
will-change: visibility, z-index, opacity;
}
.d-modal--transparent {
--modal-backdrop-color-background: var(--d-bgc-transparent);
// If we don't set this the native app header region will override all click events on the modal overlay
-webkit-app-region: no-drag;
&[aria-hidden='false'] {
position: fixed;
top: 0;
left: 0;
width: 100%;
min-height: 100%;
}
}
// $$ MODAL DIALOG
// ----------------------------------------------------------------------------
.d-modal__dialog {
position: relative;
z-index: var(--zi-hide);
display: flex;
flex-direction: column;
gap: var(--dt-space-500); //
box-sizing: border-box;
width: 100%;
max-width: var(--dt-size-1020); // 628
max-height: 100%;
padding: var(--modal-dialog-padding); // 32
overflow-y: auto;
color: var(--modal-dialog-color-text);
font-size: var(--dt-font-size-200);
line-height: var(--dt-font-line-height-400);
background-color: var(--modal-dialog-color-background);
background-clip: padding-box;
border: var(--dt-size-100) solid var(--modal-dialog-color-border);
border-radius: var(--dt-size-500);
box-shadow: var(--modal-dialog-shadow);
transform: translate3d(0, 30%, 0) scale3d(0.75, 0.75, 0.75);
backface-visibility: hidden;
visibility: hidden;
opacity: 0;
will-change: visibility, z-index, opacity, transform;
}
// $$ MAKE THEM APPEAR
// ----------------------------------------------------------------------------
.d-modal[aria-hidden='false'],
.d-modal[aria-hidden='false'] .d-modal__dialog,
.d-modal--transparent[aria-hidden='false'],
.d-modal--transparent[aria-hidden='false'] .d-modal__dialog {
z-index: var(--zi-modal);
transform: translate3d(0, 0, 0) scale3d(1, 1, 1);
visibility: visible;
opacity: 1;
}
// ============================================================================
// $ MODAL AREAS
// ----------------------------------------------------------------------------
.d-modal__footer {
--modal-footer-padding: var(--dt-space-550); // 24
display: flex;
flex-direction: row-reverse;
gap: var(--dt-space-400);
align-items: center;
}
// ============================================================================
// $ TYPE STYLES
// ============================================================================
// $$ HEADER
// ----------------------------------------------------------------------------
.d-modal__header {
--modal-header-padding: var(--dt-space-550); // 24
margin: 0 ;
padding-right: var(--modal-header-padding);
color: var(--modal-header-color-text);
font-weight: var(--dt-font-weight-medium);
font-size: var(--dt-font-size-400);
line-height: var(--dt-font-line-height-100);
}
// $$ CONTENT
// ----------------------------------------------------------------------------
.d-modal__content {
max-width: 75ch;
}
// ============================================================================
// $ BUTTONS
// ----------------------------------------------------------------------------
.d-modal__close {
position: absolute;
top: var(--dt-space-500); // 16
right: var(--dt-space-500); // 16
margin: 0 ;
}
// ============================================================================
// $ BANNERS
// ----------------------------------------------------------------------------
.d-modal__banner {
--modal-banner-padding-y: var(--dt-space-500);
--modal-banner-padding-x: var(--dt-space-600);
--modal-banner-color-background: var(--dt-color-surface-warning);
position: relative;
box-sizing: border-box;
width: 100%;
max-width: var(--dt-size-1020); // 628
padding: var(--modal-banner-padding-y) var(--modal-banner-padding-x); // 16 32
color: var(--dt-color-foreground-primary);
font-size: var(--dt-font-size-200);
line-height: var(--dt-font-line-height-300);
background-color: var(--modal-banner-color-background);
background-clip: padding-box;
border: var(--dt-size-100) solid var(--modal-dialog-color-border);
border-bottom-width: 0;
border-radius: var(--dt-size-500) var(--dt-size-500) 0 0;
box-shadow: var(--modal-dialog-shadow);
&--warning {
--modal-banner-color-background: var(--dt-color-surface-warning);
}
&--info {
--modal-banner-color-background: var(--dt-color-surface-info);
}
&--critical {
--modal-banner-color-background: var(--dt-color-surface-critical);
}
&--success {
--modal-banner-color-background: var(--dt-color-surface-success);
}
&--general {
--modal-banner-color-background: var(--dt-color-surface-secondary);
}
&::before {
// 🤦 don't ask. or do, i'm not even sorry.
position: absolute;
right: 0;
bottom: 0;
left: 0;
z-index: var(--zi-modal-element);
height: var(--modal-banner-padding-y);
background-color: var(--modal-banner-color-background);
content: '';
}
&:not(.d-d-none) + .d-modal__dialog {
border-top-width: 0;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
}
// ============================================================================
// $ MODIFYING STYLES
// ============================================================================
// $$ FULL WIDTH
// ----------------------------------------------------------------------------
.d-modal--full {
--modal-dialog-padding: 0;
padding: 0;
overflow: hidden scroll;
transform: unset ;
.d-modal__dialog {
display: flex;
flex-direction: column;
max-width: unset;
height: 100%;
border-radius: 0;
transform: unset ;
}
.d-modal__header {
padding: var(--dt-space-600) var(--dt-space-600) 0; // 32
}
.d-modal__content {
padding-right: 0;
padding-left: var(--dt-space-600); // 32
}
.d-modal__footer {
margin-top: auto ;
padding: 0 var(--dt-space-550) var(--dt-space-600) var(--dt-space-600); // 0 24 32 32
}
.d-modal__banner {
max-width: unset;
padding: var(--dt-space-450) var(--dt-space-600); // 12 32
border-radius: 0;
}
}
// $$ SCROLLABLE
// ----------------------------------------------------------------------------
.d-modal__dialog--scrollable {
display: flex;
flex-direction: column;
overflow: hidden;
.d-modal__content {
overflow-y: auto;
}
}
// $$ DANGER
// ----------------------------------------------------------------------------
.d-modal--danger {
--modal-header-color-text: var(--dt-color-foreground-primary);
}
// ============================================================================
// $ TRANSITIONS
// ----------------------------------------------------------------------------
.d-modal--animate {
z-index: var(--zi-hide) ;
backface-visibility: hidden ;
visibility: hidden ;
opacity: 0 ;
}
.d-modal__dialog--animate {
.d-modal--animate();
transform: translate3d(0, 30%, 0) scale3d(0.75, 0.75, 0.75) ;
}
.d-modal--animate-in,
.d-modal__dialog--animate-in {
transition:
opacity 100ms var(--ttf-in-out) 10ms,
z-index 0s 0s,
visibility 0s 0s,
transform 100ms var(--ttf-in-out) 10ms;
@media (prefers-reduced-motion) {
transition: none ;
}
}
.d-modal--animate-out {
transition:
opacity 100ms var(--ttf-in-out) 10ms,
z-index 0s 200ms,
visibility 0s 200ms,
transform 100ms var(--ttf-in-out) 10ms;
&.d-modal--full {
transition:
opacity 200ms var(--ttf-in-out) 0s,
z-index 0s 200ms,
visibility 0s 200ms;
}
@media (prefers-reduced-motion) {
transition: none ;
}
}
.d-modal__dialog--animate-out {
transition:
opacity 200ms var(--ttf-in-out) 0s,
z-index 0s 200ms,
visibility 0s 200ms,
transform 100ms var(--ttf-in-out) 0s;
&.d-modal--full {
transition:
opacity 200ms var(--ttf-in-out) 0s,
z-index 0s 200ms,
visibility 0s 200ms;
}
@media (prefers-reduced-motion) {
transition: none ;
}
}