UNPKG

@esri/calcite-components

Version:

Web Components for Esri's Calcite Design System.

609 lines (560 loc) • 15 kB
/* mixins & extensions */ @keyframes in { 0% { opacity: 0; } 100% { opacity: 1; } } @keyframes in-down { 0% { opacity: 0; transform: translate3D(0, -5px, 0); } 100% { opacity: 1; transform: translate3D(0, 0, 0); } } @keyframes in-up { 0% { opacity: 0; transform: translate3D(0, 5px, 0); } 100% { opacity: 1; transform: translate3D(0, 0, 0); } } @keyframes in-right { 0% { opacity: 0; transform: translate3D(-5px, 0, 0); } 100% { opacity: 1; transform: translate3D(0, 0, 0); } } @keyframes in-left { 0% { opacity: 0; transform: translate3D(5px, 0, 0); } 100% { opacity: 1; transform: translate3D(0, 0, 0); } } @keyframes in-scale { 0% { opacity: 0; transform: scale3D(0.95, 0.95, 1); } 100% { opacity: 1; transform: scale3D(1, 1, 1); } } :root { --calcite-animation-timing: calc(150ms * var(--calcite-internal-duration-factor)); --calcite-internal-duration-factor: var(--calcite-duration-factor, 1); --calcite-internal-animation-timing-fast: calc(100ms * var(--calcite-internal-duration-factor)); --calcite-internal-animation-timing-medium: calc(200ms * var(--calcite-internal-duration-factor)); --calcite-internal-animation-timing-slow: calc(300ms * var(--calcite-internal-duration-factor)); } .calcite-animate { opacity: 0; animation-fill-mode: both; animation-duration: var(--calcite-animation-timing); } .calcite-animate__in { animation-name: in; } .calcite-animate__in-down { animation-name: in-down; } .calcite-animate__in-up { animation-name: in-up; } .calcite-animate__in-right { animation-name: in-right; } .calcite-animate__in-left { animation-name: in-left; } .calcite-animate__in-scale { animation-name: in-scale; } @media (prefers-reduced-motion: reduce) { :root { --calcite-internal-duration-factor: 0.01; } } /* helper to properly scale internal durations */ /** * Currently only used in Checkbox. */ :root { --calcite-floating-ui-transition: var(--calcite-animation-timing); --calcite-floating-ui-z-index: var(--calcite-app-z-index-dropdown); } :host([hidden]) { display: none; } /** * CSS Custom Properties * * These properties can be overridden using the component's tag as selector. * * @prop --calcite-modal-content-background: Specifies the background color of content placed in the `content` slot. * @prop --calcite-modal-content-padding: Specifies the padding of the modal `content` slot. * @prop --calcite-modal-scrim-background: Specifies the background color of the modal scrim. * @prop --calcite-modal-width: Specifies a width of the modal, using `px`, `em`, `rem`, `vw`, or `%`. Will never exceed the width of the viewport. Will not apply if `fullscreen` if set. * @prop --calcite-modal-height: Specifies a height of the modal, using `px`, `em`, `rem`, `vh`, or `%`. Will never exceed the height of the viewport. Will not apply if `fullscreen` if set. * */ :host { position: absolute; inset: 0px; z-index: var(--calcite-app-z-index-overlay); display: flex; opacity: 0; visibility: hidden !important; transition: visibility 0ms linear var(--calcite-internal-animation-timing-slow), opacity var(--calcite-internal-animation-timing-slow) cubic-bezier(0.215, 0.44, 0.42, 0.88); --calcite-modal-scrim-background-internal: rgba(0, 0, 0, 0.85); } .content-top[hidden], .content-bottom[hidden] { display: none; } .container { position: fixed; inset: 0px; z-index: var(--calcite-app-z-index-overlay); display: flex; align-items: center; justify-content: center; overflow-y: hidden; color: var(--calcite-ui-text-2); opacity: 0; visibility: hidden !important; transition: visibility 0ms linear var(--calcite-internal-animation-timing-slow), opacity var(--calcite-internal-animation-timing-slow) cubic-bezier(0.215, 0.44, 0.42, 0.88); } :host([scale=s]) { --calcite-modal-padding-internal: 0.75rem; --calcite-modal-padding-large-internal: 1rem; --calcite-modal-title-text-internal: var(--calcite-font-size-1); --calcite-modal-content-text-internal: var(--calcite-font-size--1); } :host([scale=m]) { --calcite-modal-padding-internal: 1rem; --calcite-modal-padding-large-internal: 1.25rem; --calcite-modal-title-text-internal: var(--calcite-font-size-2); --calcite-modal-content-text-internal: var(--calcite-font-size-0); } :host([scale=l]) { --calcite-modal-padding-internal: 1.25rem; --calcite-modal-padding-large-internal: 1.5rem; --calcite-modal-title-text-internal: var(--calcite-font-size-3); --calcite-modal-content-text-internal: var(--calcite-font-size-1); } .scrim { --calcite-scrim-background: var(--calcite-modal-scrim-background, var(--calcite-modal-scrim-background-internal)); position: fixed; inset: 0px; display: flex; overflow-y: hidden; } .modal { pointer-events: none; z-index: var(--calcite-app-z-index-modal); float: none; margin: 1.5rem; box-sizing: border-box; display: flex; inline-size: 100%; flex-direction: column; overflow: hidden; border-radius: 0.25rem; background-color: var(--calcite-ui-foreground-1); opacity: 0; --tw-shadow: 0 2px 12px -4px rgba(0, 0, 0, 0.2), 0 2px 4px -2px rgba(0, 0, 0, 0.16); --tw-shadow-colored: 0 2px 12px -4px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -webkit-overflow-scrolling: touch; visibility: hidden; transition: transform var(--calcite-internal-animation-timing-slow) cubic-bezier(0.215, 0.44, 0.42, 0.88), visibility 0ms linear var(--calcite-internal-animation-timing-slow), opacity var(--calcite-internal-animation-timing-slow) cubic-bezier(0.215, 0.44, 0.42, 0.88); --calcite-modal-hidden-position: translate3d(0, 20px, 0); --calcite-modal-shown-position: translate3d(0, 0, 0); } .modal--opening-idle { transform: var(--calcite-modal-hidden-position); } .modal--opening-active { transform: var(--calcite-modal-shown-position); } .modal--closing-idle { transform: var(--calcite-modal-shown-position); } .modal--closing-active { transform: var(--calcite-modal-hidden-position); } :host([open]) { opacity: 1; visibility: visible !important; transition-delay: 0ms; } .container--open { opacity: 1; visibility: visible !important; transition-delay: 0ms; } .container--open .modal { pointer-events: auto; visibility: visible; opacity: 1; transition: transform var(--calcite-internal-animation-timing-slow) cubic-bezier(0.215, 0.44, 0.42, 0.88), visibility 0ms linear, opacity var(--calcite-internal-animation-timing-slow) cubic-bezier(0.215, 0.44, 0.42, 0.88), max-inline-size var(--calcite-internal-animation-timing-slow) cubic-bezier(0.215, 0.44, 0.42, 0.88), max-block-size var(--calcite-internal-animation-timing-slow) cubic-bezier(0.215, 0.44, 0.42, 0.88); transition-delay: 0ms; } /** * Header */ .header { z-index: var(--calcite-app-z-index-header); display: flex; min-inline-size: 0px; max-inline-size: 100%; border-start-start-radius: 0.25rem; border-start-end-radius: 0.25rem; border-width: 0px; border-block-end-width: 1px; border-style: solid; border-color: var(--calcite-ui-border-3); background-color: var(--calcite-ui-foreground-1); flex: 0 0 auto; } .close { order: 2; margin: 0px; cursor: pointer; -webkit-appearance: none; appearance: none; border-style: none; background-color: transparent; color: var(--calcite-ui-text-3); outline-color: transparent; transition: all var(--calcite-animation-timing) ease-in-out 0s, outline 0s, outline-offset 0s; padding-block: var(--calcite-modal-padding-internal); padding-inline: var(--calcite-modal-padding-internal); flex: 0 0 auto; } .close calcite-icon { pointer-events: none; vertical-align: -2px; } .close:focus { outline: 2px solid var(--calcite-ui-focus-color, var(--calcite-ui-brand)); outline-offset: calc( -2px * calc( 1 - 2 * clamp( 0, var(--calcite-ui-focus-offset-invert), 1 ) ) ); } .close:hover, .close:focus, .close:active { background-color: var(--calcite-ui-foreground-2); color: var(--calcite-ui-text-1); } .title { order: 1; display: flex; min-inline-size: 0px; align-items: center; flex: 1 1 auto; padding-block: var(--calcite-modal-padding-internal); padding-inline: var(--calcite-modal-padding-large-internal); } slot[name=header]::slotted(*), *::slotted([slot=header]) { margin: 0px; font-weight: var(--calcite-font-weight-normal); color: var(--calcite-ui-text-1); font-size: var(--calcite-modal-title-text-internal); } /** * Content area */ .content { position: relative; box-sizing: border-box; display: block; block-size: 100%; overflow: auto; padding: 0px; background-color: var(--calcite-modal-content-background, var(--calcite-ui-foreground-1)); max-block-size: 100%; padding: var(--calcite-modal-content-padding, var(--calcite-modal-padding-internal)); } .content-top, .content-bottom { z-index: var(--calcite-app-z-index-header); display: flex; border-width: 0px; border-style: solid; border-color: var(--calcite-ui-border-3); background-color: var(--calcite-ui-foreground-1); flex: 0 0 auto; padding: var(--calcite-modal-padding-internal); } .content-top { min-inline-size: 0px; max-inline-size: 100%; border-block-end-width: 1px; } .content-bottom { margin-block-start: auto; box-sizing: border-box; inline-size: 100%; justify-content: space-between; border-block-start-width: 1px; } .content-top:not(.header ~ .content-top) { border-start-start-radius: 0.25rem; border-start-end-radius: 0.25rem; } .content-bottom:not(.content-bottom ~ .footer), .content--no-footer { border-end-end-radius: 0.25rem; border-end-start-radius: 0.25rem; } slot[name=content]::slotted(*), *::slotted([slot=content]) { font-size: var(--calcite-modal-context-text-internal); } /** * Footer */ .footer { z-index: var(--calcite-app-z-index-header); margin-block-start: auto; box-sizing: border-box; display: flex; inline-size: 100%; justify-content: space-between; border-end-end-radius: 0.25rem; border-end-start-radius: 0.25rem; border-width: 0px; border-block-start-width: 1px; border-style: solid; border-color: var(--calcite-ui-border-3); background-color: var(--calcite-ui-foreground-1); flex: 0 0 auto; padding-block: var(--calcite-modal-padding-internal); padding-inline: var(--calcite-modal-padding-large-internal); } .footer--hide-back .back, .footer--hide-secondary .secondary { display: none; } .back { display: block; margin-inline-end: auto; } .secondary { margin-inline: 0.25rem; display: block; } slot[name=primary] { display: block; } /** * Sizes */ :host([width=small]) .modal { inline-size: auto; } :host([width=s]) .modal { max-block-size: 100%; max-inline-size: 100%; inline-size: var(--calcite-modal-width, 32rem); block-size: var(--calcite-modal-height, auto); } @media screen and (max-width: 35rem) { :host([width=s]) .modal { margin: 0px; block-size: 100%; max-block-size: 100%; inline-size: 100%; max-inline-size: 100%; } :host([width=s]) .content { flex: 1 1 auto; max-block-size: unset; } :host([width=s][docked]) .container { align-items: flex-end; } } :host([width=m]) .modal { max-block-size: 100%; max-inline-size: 100%; inline-size: var(--calcite-modal-width, 48rem); block-size: var(--calcite-modal-height, auto); } @media screen and (max-width: 51rem) { :host([width=m]) .modal { margin: 0px; block-size: 100%; max-block-size: 100%; inline-size: 100%; max-inline-size: 100%; } :host([width=m]) .content { flex: 1 1 auto; max-block-size: unset; } :host([width=m][docked]) .container { align-items: flex-end; } } :host([width=l]) .modal { max-block-size: 100%; max-inline-size: 100%; inline-size: var(--calcite-modal-width, 94rem); block-size: var(--calcite-modal-height, auto); } @media screen and (max-width: 97rem) { :host([width=l]) .modal { margin: 0px; block-size: 100%; max-block-size: 100%; inline-size: 100%; max-inline-size: 100%; } :host([width=l]) .content { flex: 1 1 auto; max-block-size: unset; } :host([width=l][docked]) .container { align-items: flex-end; } } /** * Fullscreen */ :host([fullscreen]) .modal { margin: 0px; block-size: 100%; max-block-size: 100%; inline-size: 100%; max-inline-size: 100%; border-radius: 0px; --calcite-modal-hidden-position: translate3D(0, 20px, 0) scale(0.95); --calcite-modal-shown-position: translate3D(0, 0, 0) scale(1); } :host([fullscreen]) .content { max-block-size: 100%; flex: 1 1 auto; } :host([open][fullscreen]) .header, :host([open][fullscreen]) .footer, :host([open][fullscreen]) .content-top, :host([open][fullscreen]) .content-bottom { border-radius: 0; } /** * Docked */ :host([docked]) .modal { block-size: var(--calcite-modal-height, auto); } :host([docked]) .content { block-size: auto; flex: 1 1 auto; } /** * Kinds */ :host([kind=brand]) .modal { border-color: var(--calcite-ui-brand); } :host([kind=danger]) .modal { border-color: var(--calcite-ui-danger); } :host([kind=info]) .modal { border-color: var(--calcite-ui-info); } :host([kind=success]) .modal { border-color: var(--calcite-ui-success); } :host([kind=warning]) .modal { border-color: var(--calcite-ui-warning); } :host([kind=brand]) .modal, :host([kind=danger]) .modal, :host([kind=info]) .modal, :host([kind=success]) .modal, :host([kind=warning]) .modal { border-width: 0px; border-block-start-width: 4px; border-style: solid; } :host([kind=brand]) .header, :host([kind=brand]) .content-top, :host([kind=danger]) .header, :host([kind=danger]) .content-top, :host([kind=info]) .header, :host([kind=info]) .content-top, :host([kind=success]) .header, :host([kind=success]) .content-top, :host([kind=warning]) .header, :host([kind=warning]) .content-top { border-radius: 0.25rem; border-end-end-radius: 0px; border-end-start-radius: 0px; } /** * Tablet */ @media screen and (max-width: 860px) { * slot[name=header]::slotted(content-top), * content-top::slotted([slot=header]) { font-size: var(--calcite-font-size-1); } .footer, .content-bottom { position: sticky; inset-block-end: 0px; } } /** * Mobile */ @media screen and (max-width: 480px) { .footer, .content-bottom { flex-direction: column; } .back, .secondary { margin: 0px; margin-block-end: 0.25rem; } } /** * Conditional styles for when Modal is slotted in Shell */ .container.slotted-in-shell { position: absolute; pointer-events: auto; } .container.slotted-in-shell calcite-scrim { position: absolute; }