{"version":3,"names":["CSS","modal","title","header","footer","scrim","back","close","secondary","primary","container","containerOpen","containerEmbedded","content","contentNoFooter","contentBottom","contentTop","openingIdle","openingActive","closingIdle","closingActive","ICONS","SLOTS","modalCss","CalciteModalStyle0","totalOpenModals","initialDocumentOverflowStyle","logger","deprecated","name","removalVersion","suggested","Modal","this","ignoreOpenChange","mutationObserver","createObserver","handleMutationObserver","cssVarObserver","updateSizeCssVars","openTransitionProp","setTransitionEl","el","transitionEl","openEnd","setFocus","removeEventListener","handleCloseClick","open","handleOutsideClose","outsideCloseDisabled","closeModal","async","beforeClose","_error","requestAnimationFrame","opened","removeOverflowHiddenClass","updateFooterVisibility","updateFocusTrapElements","hasFooter","getSlotted","cssWidth","getComputedStyle","getPropertyValue","cssHeight","contentTopSlotChangeHandler","event","hasContentTop","slotChangeHasAssignedElement","contentBottomSlotChangeHandler","hasContentBottom","handleFocusTrapDisabled","focusTrapDisabled","deactivateFocusTrap","activateFocusTrap","onMessagesChange","componentWillLoad","setUpMessages","setUpLoadableComponent","openModal","componentDidLoad","setComponentLoaded","connectedCallback","observe","childList","subtree","attributeFilter","connectConditionalSlotComponent","connectLocalized","connectMessages","connectFocusTrap","disconnectedCallback","disconnect","disconnectConditionalSlotComponent","disconnectLocalized","disconnectMessages","embedded","render","h","Host","key","contentId","titleId","role","class","onClick","renderStyle","ref","renderCloseButton","renderContentTop","modalContent","renderContentBottom","renderFooter","hidden","onSlotchange","closeButtonDisabled","messages","closeButtonEl","icon","scale","getIconScale","fullscreen","docked","effectiveLocaleChange","updateMessages","effectiveLocale","handleEscape","escapeDisabled","defaultPrevented","preventDefault","componentFocusable","focusFirstTabbable","scrollContent","top","left","scrollTo","behavior","scrollTop","scrollLeft","onBeforeOpen","classList","add","calciteModalBeforeOpen","emit","onOpen","remove","calciteModalOpen","onBeforeClose","calciteModalBeforeClose","onClose","calciteModalClose","toggleModal","value","handleOpenedChange","idleClass","onToggleOpenCloseComponent","componentOnReady","addEventListener","titleEl","contentEl","ensureId","document","documentElement","style","overflow","setProperty"],"sources":["src/components/modal/resources.ts","src/components/modal/modal.scss?tag=calcite-modal&encapsulation=shadow","src/components/modal/modal.tsx"],"sourcesContent":["export const CSS = {\n modal: \"modal\",\n title: \"title\",\n header: \"header\",\n footer: \"footer\",\n scrim: \"scrim\",\n back: \"back\",\n close: \"close\",\n secondary: \"secondary\",\n primary: \"primary\",\n container: \"container\",\n containerOpen: \"container--open\",\n containerEmbedded: \"container--embedded\",\n content: \"content\",\n contentNoFooter: \"content--no-footer\",\n contentBottom: \"content-bottom\",\n contentTop: \"content-top\",\n\n // these classes help apply the animation in phases to only set transform on open/close\n // this helps avoid a positioning issue for any floating-ui-owning children\n openingIdle: \"modal--opening-idle\",\n openingActive: \"modal--opening-active\",\n closingIdle: \"modal--closing-idle\",\n closingActive: \"modal--closing-active\",\n};\n\nexport const DURATIONS = {\n slow: 14000,\n medium: 10000,\n fast: 6000,\n test: 300 / 1000,\n};\n\nexport const ICONS = {\n close: \"x\",\n} as const;\n\nexport const SLOTS = {\n content: \"content\",\n contentBottom: \"content-bottom\",\n contentTop: \"content-top\",\n header: \"header\",\n back: \"back\",\n secondary: \"secondary\",\n primary: \"primary\",\n};\n","/**\n * CSS Custom Properties\n *\n * These properties can be overridden using the component's tag as selector.\n *\n * @prop --calcite-modal-content-background: Specifies the background color of content placed in the component's `\"content\"` slot.\n * @prop --calcite-modal-content-padding: Specifies the padding of the component's `\"content\"` slot.\n * @prop --calcite-modal-scrim-background: Specifies the background color of the component's scrim.\n * @prop --calcite-modal-width: Specifies the width of the component, using `px`, `em`, `rem`, `vw`, or `%`. Will never exceed the width of the viewport. Will not apply if `fullscreen` if set.\n * @prop --calcite-modal-height: Specifies the height of the component, using `px`, `em`, `rem`, `vh`, or `%`. Will never exceed the height of the viewport. Will not apply if `fullscreen` if set.\n *\n */\n\n:host {\n --calcite-modal-scrim-background: #{rgba($calcite-color-neutral-blk-240, $calcite-opacity-85)};\n @apply absolute flex inset-0 opacity-0 z-overlay;\n visibility: hidden !important;\n transition:\n visibility 0ms linear var(--calcite-internal-animation-timing-slow),\n opacity var(--calcite-internal-animation-timing-slow) $easing-function;\n // the modal should always use a dark scrim, regardless of light / dark mode - matches value in global.scss\n --calcite-modal-scrim-background-internal: #{rgba($calcite-color-neutral-blk-240, $calcite-opacity-85)};\n}\n\n.content-top[hidden],\n.content-bottom[hidden] {\n @apply hidden;\n}\n\n.container {\n @apply text-color-2\n fixed\n inset-0\n flex\n items-center\n justify-center\n overflow-y-hidden\n opacity-0\n z-overlay;\n visibility: hidden !important;\n transition:\n visibility 0ms linear var(--calcite-internal-animation-timing-slow),\n opacity var(--calcite-internal-animation-timing-slow) $easing-function;\n}\n\n:host([scale=\"s\"]) {\n --calcite-modal-padding-internal: theme(\"spacing.3\");\n --calcite-modal-padding-large-internal: theme(\"spacing.4\");\n --calcite-modal-title-text-internal: theme(\"fontSize.1h\");\n --calcite-modal-content-text-internal: theme(\"fontSize.n1\");\n}\n\n:host([scale=\"m\"]) {\n --calcite-modal-padding-internal: theme(\"spacing.4\");\n --calcite-modal-padding-large-internal: theme(\"spacing.5\");\n --calcite-modal-title-text-internal: theme(\"fontSize.2h\");\n --calcite-modal-content-text-internal: theme(\"fontSize.0\");\n}\n\n:host([scale=\"l\"]) {\n --calcite-modal-padding-internal: theme(\"spacing.5\");\n --calcite-modal-padding-large-internal: theme(\"spacing.6\");\n --calcite-modal-title-text-internal: theme(\"fontSize.3h\");\n --calcite-modal-content-text-internal: theme(\"fontSize.1\");\n}\n\n.scrim {\n --calcite-scrim-background: var(--calcite-modal-scrim-background, var(--calcite-color-transparent-scrim));\n @apply fixed inset-0 flex overflow-y-hidden;\n}\n\n.modal {\n @apply shadow-2-sm\n bg-foreground-1\n pointer-events-none\n float-none\n m-6\n box-border\n flex\n w-full\n flex-col\n overflow-hidden\n rounded\n opacity-0\n z-modal;\n -webkit-overflow-scrolling: touch;\n visibility: hidden;\n transition:\n transform var(--calcite-internal-animation-timing-slow) $easing-function,\n visibility 0ms linear var(--calcite-internal-animation-timing-slow),\n opacity var(--calcite-internal-animation-timing-slow) $easing-function;\n\n --calcite-modal-hidden-position: translate3d(0, 20px, 0);\n --calcite-modal-shown-position: translate3d(0, 0, 0);\n\n &--opening {\n &-idle {\n transform: var(--calcite-modal-hidden-position);\n }\n &-active {\n transform: var(--calcite-modal-shown-position);\n }\n }\n\n &--closing {\n &-idle {\n transform: var(--calcite-modal-shown-position);\n }\n &-active {\n transform: var(--calcite-modal-hidden-position);\n }\n }\n}\n\n:host([opened]) {\n @apply opacity-100;\n visibility: visible !important;\n transition-delay: 0ms;\n}\n\n.container--open {\n @apply opacity-100;\n visibility: visible !important;\n transition-delay: 0ms;\n .modal {\n @apply pointer-events-auto visible opacity-100;\n transition:\n transform var(--calcite-internal-animation-timing-slow) $easing-function,\n visibility 0ms linear,\n opacity var(--calcite-internal-animation-timing-slow) $easing-function,\n max-inline-size var(--calcite-internal-animation-timing-slow) $easing-function,\n max-block-size var(--calcite-internal-animation-timing-slow) $easing-function;\n transition-delay: 0ms;\n }\n}\n\n/**\n * Header\n */\n.header {\n @apply bg-foreground-1\n border-color-3\n flex\n min-w-0\n max-w-full\n rounded-t\n border-0\n border-b\n border-solid\n z-header;\n flex: 0 0 auto;\n}\n\n.close {\n @apply text-color-3\n transition-default\n focus-base\n order-2\n m-0\n cursor-pointer\n appearance-none\n border-none\n bg-transparent;\n padding-block: var(--calcite-modal-padding-internal);\n padding-inline: var(--calcite-modal-padding-internal);\n flex: 0 0 auto;\n calcite-icon {\n @apply pointer-events-none;\n vertical-align: -2px;\n }\n &:focus {\n @apply focus-inset;\n }\n &:hover,\n &:focus,\n &:active {\n @apply bg-foreground-2 text-color-1;\n }\n}\n\n.title {\n @apply order-1 flex min-w-0 items-center;\n flex: 1 1 auto;\n padding-block: var(--calcite-modal-padding-internal);\n padding-inline: var(--calcite-modal-padding-large-internal);\n}\n\n@include slotted(\"header\", \"*\") {\n @apply text-color-1 m-0 font-normal;\n font-size: var(--calcite-modal-title-text-internal);\n}\n\n/**\n * Content area\n */\n.content {\n @apply relative box-border block h-full overflow-auto p-0;\n background-color: var(--calcite-modal-content-background, theme(\"colors.background.foreground.1\"));\n max-block-size: 100%;\n padding: var(--calcite-modal-content-padding, var(--calcite-modal-padding-internal));\n}\n\n.content-top,\n.content-bottom {\n @apply bg-foreground-1 border-color-3 border-solid border-0 z-header flex;\n flex: 0 0 auto;\n padding: var(--calcite-modal-padding-internal);\n}\n\n.content-top {\n @apply min-w-0 max-w-full border-b;\n}\n\n.content-bottom {\n @apply mt-auto box-border w-full justify-between border-t;\n}\n\n.content-top:not(.header ~ .content-top) {\n @apply rounded-t;\n}\n\n.content-bottom:not(.content-bottom ~ .footer),\n.content--no-footer {\n @apply rounded-b;\n}\n\n@include slotted(\"content\", \"*\") {\n font-size: var(--calcite-modal-context-text-internal);\n}\n\n/**\n * Footer\n */\n.footer {\n @apply bg-foreground-1\n border-color-3\n mt-auto\n box-border\n flex\n w-full\n justify-between\n rounded-b\n border-0\n border-t\n border-solid\n z-header;\n flex: 0 0 auto;\n padding-block: var(--calcite-modal-padding-internal);\n padding-inline: var(--calcite-modal-padding-large-internal);\n}\n\n.footer--hide-back .back,\n.footer--hide-secondary .secondary {\n @apply hidden;\n}\n\n.back {\n @apply block;\n margin-inline-end: auto;\n}\n\n.secondary {\n @apply mx-1 block;\n}\n\nslot[name=\"primary\"] {\n @apply block;\n}\n\n/**\n * Sizes\n */\n@mixin modal-size($size, $width) {\n :host([width-scale=\"#{$size}\"]) .modal {\n @apply max-h-full max-w-full;\n inline-size: var(--calcite-modal-width, $width);\n block-size: var(--calcite-modal-height, auto);\n }\n\n @media screen and (max-width: $width + 2 * $baseline) {\n :host([width-scale=\"#{$size}\"]) {\n .modal {\n @apply m-0 h-full max-h-full w-full max-w-full;\n }\n .content {\n flex: 1 1 auto;\n max-block-size: unset;\n }\n }\n :host([width-scale=\"#{$size}\"][docked]) .container {\n align-items: flex-end;\n }\n }\n}\n\n:host([width=\"small\"]) .modal {\n @apply w-auto;\n}\n\n@include modal-size(\"s\", 32rem);\n@include modal-size(\"m\", 48rem);\n@include modal-size(\"l\", 94rem);\n\n/**\n * Fullscreen\n */\n:host([fullscreen]) {\n .modal {\n @apply m-0 max-h-full max-w-full h-full w-full rounded-none;\n --calcite-modal-hidden-position: translate3D(0, 20px, 0) scale(0.95);\n --calcite-modal-shown-position: translate3D(0, 0, 0) scale(1);\n }\n .content {\n @apply max-h-full;\n flex: 1 1 auto;\n }\n}\n\n:host([opened][fullscreen]) {\n .header,\n .footer,\n .content-top,\n .content-bottom {\n border-radius: 0;\n }\n}\n\n/**\n * Docked\n */\n:host([docked]) {\n .modal {\n block-size: var(--calcite-modal-height, auto);\n }\n .content {\n @apply h-auto;\n flex: 1 1 auto;\n }\n}\n\n/**\n * Kinds\n */\n:host([kind=\"brand\"]) .modal {\n @apply border-color-brand;\n}\n\n:host([kind=\"danger\"]) .modal {\n @apply border-color-danger;\n}\n\n:host([kind=\"info\"]) .modal {\n @apply border-color-info;\n}\n\n:host([kind=\"success\"]) .modal {\n @apply border-color-success;\n}\n\n:host([kind=\"warning\"]) .modal {\n @apply border-color-warning;\n}\n\n:host([kind=\"brand\"]),\n:host([kind=\"danger\"]),\n:host([kind=\"info\"]),\n:host([kind=\"success\"]),\n:host([kind=\"warning\"]) {\n .modal {\n @apply border-0 border-t-4 border-solid;\n }\n .header,\n .content-top {\n @apply rounded rounded-b-none;\n }\n}\n\n/**\n * Tablet\n */\n@media screen and (max-width: $viewport-medium) {\n @include slotted(\"header\", \"content-top\", \"*\") {\n @apply text-1;\n }\n .footer,\n .content-bottom {\n @apply sticky bottom-0;\n }\n}\n\n/**\n * Mobile\n */\n@media screen and (max-width: $viewport-small) {\n .footer,\n .content-bottom {\n @apply flex-col;\n }\n .back,\n .secondary {\n @apply m-0 mb-1;\n }\n}\n\n/**\n * Conditional styles for when Modal is slotted in Shell\n */\n\n.container--embedded {\n position: absolute;\n pointer-events: auto;\n calcite-scrim {\n position: absolute;\n }\n}\n\n@include base-component();\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n VNode,\n Watch,\n} from \"@stencil/core\";\nimport {\n ConditionalSlotComponent,\n connectConditionalSlotComponent,\n disconnectConditionalSlotComponent,\n} from \"../../utils/conditionalSlot\";\nimport {\n ensureId,\n focusFirstTabbable,\n getSlotted,\n slotChangeHasAssignedElement,\n} from \"../../utils/dom\";\nimport {\n activateFocusTrap,\n connectFocusTrap,\n deactivateFocusTrap,\n FocusTrap,\n FocusTrapComponent,\n updateFocusTrapElements,\n} from \"../../utils/focusTrapComponent\";\nimport {\n componentFocusable,\n LoadableComponent,\n setComponentLoaded,\n setUpLoadableComponent,\n} from \"../../utils/loadable\";\nimport { createObserver } from \"../../utils/observers\";\nimport { onToggleOpenCloseComponent, OpenCloseComponent } from \"../../utils/openCloseComponent\";\nimport { Kind, Scale } from \"../interfaces\";\nimport { connectLocalized, disconnectLocalized, LocalizedComponent } from \"../../utils/locale\";\nimport {\n connectMessages,\n disconnectMessages,\n setUpMessages,\n T9nComponent,\n updateMessages,\n} from \"../../utils/t9n\";\nimport { componentOnReady, getIconScale } from \"../../utils/component\";\nimport { logger } from \"../../utils/logger\";\nimport { ModalMessages } from \"./assets/modal/t9n\";\nimport { CSS, ICONS, SLOTS } from \"./resources\";\n\nlet totalOpenModals: number = 0;\nlet initialDocumentOverflowStyle: string = \"\";\n\nlogger.deprecated(\"component\", {\n name: \"modal\",\n removalVersion: 4,\n suggested: \"dialog\",\n});\n\n/**\n * @deprecated Use the `calcite-dialog` component instead.\n * @slot header - A slot for adding header text.\n * @slot content - A slot for adding the component's content.\n * @slot content-top - A slot for adding content to the component's sticky header, where content remains at the top of the component when scrolling up and down.\n * @slot content-bottom - A slot for adding content to the component's sticky footer, where content remains at the bottom of the component when scrolling up and down.\n * @slot primary - A slot for adding a primary button.\n * @slot secondary - A slot for adding a secondary button.\n * @slot back - A slot for adding a back button.\n */\n@Component({\n tag: \"calcite-modal\",\n styleUrl: \"modal.scss\",\n shadow: true,\n assetsDirs: [\"assets\"],\n})\nexport class Modal\n implements\n ConditionalSlotComponent,\n OpenCloseComponent,\n FocusTrapComponent,\n LoadableComponent,\n LocalizedComponent,\n T9nComponent\n{\n //--------------------------------------------------------------------------\n //\n // Properties\n //\n //--------------------------------------------------------------------------\n\n /** When `true`, displays and positions the component. */\n @Prop({ mutable: true, reflect: true }) open = false;\n\n /**\n * We use an internal property to handle styles for when a modal is actually opened, not just when the open attribute is applied. This is a property because we need to apply styles to the host element and to keep the styles present while beforeClose is.\n *\n * @internal\n */\n @Prop({ mutable: true, reflect: true }) opened = false;\n\n /** Passes a function to run before the component closes. */\n @Prop() beforeClose: (el: HTMLCalciteModalElement) => Promise;\n\n /** When `true`, disables the component's close button. */\n @Prop({ reflect: true }) closeButtonDisabled = false;\n\n /**\n * When `true`, prevents focus trapping.\n */\n @Prop({ reflect: true }) focusTrapDisabled = false;\n\n @Watch(\"focusTrapDisabled\")\n handleFocusTrapDisabled(focusTrapDisabled: boolean): void {\n if (!this.open) {\n return;\n }\n\n focusTrapDisabled ? deactivateFocusTrap(this) : activateFocusTrap(this);\n }\n\n /** When `true`, disables the closing of the component when clicked outside. */\n @Prop({ reflect: true }) outsideCloseDisabled = false;\n\n /** When `true`, prevents the component from expanding to the entire screen on mobile devices. */\n @Prop({ reflect: true }) docked: boolean;\n\n /**\n * This internal property, managed by a containing calcite-shell, is used\n * to inform the component if special configuration or styles are needed\n *\n * @internal\n */\n @Prop({ mutable: true }) embedded = false;\n\n /** When `true`, disables the default close on escape behavior. */\n @Prop({ reflect: true }) escapeDisabled = false;\n\n /** Specifies the size of the component. */\n @Prop({ reflect: true }) scale: Scale = \"m\";\n\n /** Specifies the width of the component. */\n @Prop({ reflect: true }) widthScale: Scale = \"m\";\n\n /** Sets the component to always be fullscreen. Overrides `widthScale` and `--calcite-modal-width` / `--calcite-modal-height`. */\n @Prop({ reflect: true }) fullscreen: boolean;\n\n /** Specifies the kind of the component, which will apply to top border. */\n @Prop({ reflect: true }) kind: Extract<\"brand\" | \"danger\" | \"info\" | \"success\" | \"warning\", Kind>;\n\n /**\n * Made into a prop for testing purposes only\n *\n * @internal\n */\n // eslint-disable-next-line @stencil-community/strict-mutable -- updated by t9n module\n @Prop({ mutable: true }) messages: ModalMessages;\n\n /**\n * Use this property to override individual strings used by the component.\n */\n // eslint-disable-next-line @stencil-community/strict-mutable -- updated by t9n module\n @Prop({ mutable: true }) messageOverrides: Partial;\n\n @Watch(\"messageOverrides\")\n onMessagesChange(): void {\n /* wired up by t9n util */\n }\n\n //--------------------------------------------------------------------------\n //\n // Lifecycle\n //\n //--------------------------------------------------------------------------\n\n async componentWillLoad(): Promise {\n await setUpMessages(this);\n setUpLoadableComponent(this);\n // when modal initially renders, if active was set we need to open as watcher doesn't fire\n if (this.open) {\n this.openModal();\n }\n }\n\n componentDidLoad(): void {\n setComponentLoaded(this);\n }\n\n connectedCallback(): void {\n this.mutationObserver?.observe(this.el, { childList: true, subtree: true });\n this.cssVarObserver?.observe(this.el, { attributeFilter: [\"style\"] });\n this.updateSizeCssVars();\n this.updateFooterVisibility();\n connectConditionalSlotComponent(this);\n connectLocalized(this);\n connectMessages(this);\n connectFocusTrap(this);\n }\n\n disconnectedCallback(): void {\n this.removeOverflowHiddenClass();\n this.mutationObserver?.disconnect();\n this.cssVarObserver?.disconnect();\n disconnectConditionalSlotComponent(this);\n deactivateFocusTrap(this);\n disconnectLocalized(this);\n disconnectMessages(this);\n this.embedded = false;\n }\n\n render(): VNode {\n return (\n \n \n \n {this.renderStyle()}\n \n
\n {this.renderCloseButton()}\n
\n \n
\n
\n {this.renderContentTop()}\n (this.modalContent = el)}\n >\n \n \n {this.renderContentBottom()}\n {this.renderFooter()}\n \n \n \n );\n }\n\n renderFooter(): VNode {\n return this.hasFooter ? (\n
\n \n \n \n \n \n \n \n \n \n
\n ) : null;\n }\n\n renderContentTop(): VNode {\n return (\n \n );\n }\n\n renderContentBottom(): VNode {\n return (\n \n );\n }\n\n renderCloseButton(): VNode {\n return !this.closeButtonDisabled ? (\n (this.closeButtonEl = el)}\n title={this.messages.close}\n >\n \n \n ) : null;\n }\n\n renderStyle(): VNode {\n if (!this.fullscreen && (this.cssWidth || this.cssHeight)) {\n return (\n \n );\n }\n }\n\n //--------------------------------------------------------------------------\n //\n // Private Properties/ State\n //\n //--------------------------------------------------------------------------\n\n ignoreOpenChange = false;\n\n @Element() el: HTMLCalciteModalElement;\n\n modalContent: HTMLDivElement;\n\n private mutationObserver: MutationObserver = createObserver(\"mutation\", () =>\n this.handleMutationObserver(),\n );\n\n private cssVarObserver: MutationObserver = createObserver(\"mutation\", () => {\n this.updateSizeCssVars();\n });\n\n titleId: string;\n\n openTransitionProp = \"opacity\";\n\n transitionEl: HTMLDivElement;\n\n focusTrap: FocusTrap;\n\n closeButtonEl: HTMLButtonElement;\n\n contentId: string;\n\n @State() cssWidth: string | number;\n\n @State() cssHeight: string | number;\n\n @State() hasFooter = true;\n\n @State() hasContentTop = false;\n\n @State() hasContentBottom = false;\n\n @State() effectiveLocale: string;\n\n @Watch(\"effectiveLocale\")\n effectiveLocaleChange(): void {\n updateMessages(this, this.effectiveLocale);\n }\n\n @State() defaultMessages: ModalMessages;\n\n //--------------------------------------------------------------------------\n //\n // Event Listeners\n //\n //--------------------------------------------------------------------------\n\n @Listen(\"keydown\", { target: \"window\" })\n handleEscape(event: KeyboardEvent): void {\n if (this.open && !this.escapeDisabled && event.key === \"Escape\" && !event.defaultPrevented) {\n this.open = false;\n event.preventDefault();\n }\n }\n\n //--------------------------------------------------------------------------\n //\n // Events\n //\n //--------------------------------------------------------------------------\n /** Fires when the component is requested to be closed and before the closing transition begins. */\n @Event({ cancelable: false }) calciteModalBeforeClose: EventEmitter;\n\n /** Fires when the component is closed and animation is complete. */\n @Event({ cancelable: false }) calciteModalClose: EventEmitter;\n\n /** Fires when the component is added to the DOM but not rendered, and before the opening transition begins. */\n @Event({ cancelable: false }) calciteModalBeforeOpen: EventEmitter;\n\n /** Fires when the component is open and animation is complete. */\n @Event({ cancelable: false }) calciteModalOpen: EventEmitter;\n\n //--------------------------------------------------------------------------\n //\n // Public Methods\n //\n //--------------------------------------------------------------------------\n\n /**\n * Sets focus on the component's \"close\" button (the first focusable item).\n *\n */\n @Method()\n async setFocus(): Promise {\n await componentFocusable(this);\n focusFirstTabbable(this.el);\n }\n\n /**\n * Updates the element(s) that are used within the focus-trap of the component.\n */\n @Method()\n async updateFocusTrapElements(): Promise {\n updateFocusTrapElements(this);\n }\n\n /**\n * Sets the scroll top of the component's content.\n *\n * @param top\n * @param left\n */\n @Method()\n async scrollContent(top = 0, left = 0): Promise {\n if (this.modalContent) {\n if (this.modalContent.scrollTo) {\n this.modalContent.scrollTo({ top, left, behavior: \"smooth\" });\n } else {\n this.modalContent.scrollTop = top;\n this.modalContent.scrollLeft = left;\n }\n }\n }\n\n //--------------------------------------------------------------------------\n //\n // Private Methods\n //\n //--------------------------------------------------------------------------\n\n private setTransitionEl = (el: HTMLDivElement): void => {\n this.transitionEl = el;\n };\n\n onBeforeOpen(): void {\n this.transitionEl.classList.add(CSS.openingActive);\n this.calciteModalBeforeOpen.emit();\n }\n\n onOpen(): void {\n this.transitionEl.classList.remove(CSS.openingIdle, CSS.openingActive);\n this.calciteModalOpen.emit();\n activateFocusTrap(this);\n }\n\n onBeforeClose(): void {\n this.transitionEl.classList.add(CSS.closingActive);\n this.calciteModalBeforeClose.emit();\n }\n\n onClose(): void {\n this.transitionEl.classList.remove(CSS.closingIdle, CSS.closingActive);\n this.calciteModalClose.emit();\n deactivateFocusTrap(this);\n }\n\n @Watch(\"open\")\n toggleModal(value: boolean): void {\n if (this.ignoreOpenChange) {\n return;\n }\n\n if (value) {\n this.openModal();\n } else {\n this.closeModal();\n }\n }\n\n @Watch(\"opened\")\n handleOpenedChange(value: boolean): void {\n const idleClass = value ? CSS.openingIdle : CSS.closingIdle;\n this.transitionEl.classList.add(idleClass);\n onToggleOpenCloseComponent(this);\n }\n\n private openEnd = (): void => {\n this.setFocus();\n this.el.removeEventListener(\"calciteModalOpen\", this.openEnd);\n };\n\n private handleCloseClick = () => {\n this.open = false;\n };\n\n private async openModal(): Promise {\n await componentOnReady(this.el);\n this.el.addEventListener(\"calciteModalOpen\", this.openEnd);\n this.opened = true;\n const titleEl = getSlotted(this.el, SLOTS.header);\n const contentEl = getSlotted(this.el, SLOTS.content);\n\n this.titleId = ensureId(titleEl);\n this.contentId = ensureId(contentEl);\n\n if (!this.embedded) {\n if (totalOpenModals === 0) {\n initialDocumentOverflowStyle = document.documentElement.style.overflow;\n }\n\n totalOpenModals++;\n // use an inline style instead of a utility class to avoid global class declarations.\n document.documentElement.style.setProperty(\"overflow\", \"hidden\");\n }\n }\n\n private handleOutsideClose = (): void => {\n if (this.outsideCloseDisabled) {\n return;\n }\n\n this.open = false;\n };\n\n closeModal = async (): Promise => {\n if (this.beforeClose) {\n try {\n await this.beforeClose(this.el);\n } catch (_error) {\n // close prevented\n requestAnimationFrame(() => {\n this.ignoreOpenChange = true;\n this.open = true;\n this.ignoreOpenChange = false;\n });\n return;\n }\n }\n\n totalOpenModals--;\n this.opened = false;\n this.removeOverflowHiddenClass();\n };\n\n private removeOverflowHiddenClass(): void {\n document.documentElement.style.setProperty(\"overflow\", initialDocumentOverflowStyle);\n }\n\n private handleMutationObserver = (): void => {\n this.updateFooterVisibility();\n this.updateFocusTrapElements();\n };\n\n private updateFooterVisibility = (): void => {\n this.hasFooter = !!getSlotted(this.el, [SLOTS.back, SLOTS.primary, SLOTS.secondary]);\n };\n\n private updateSizeCssVars = (): void => {\n this.cssWidth = getComputedStyle(this.el).getPropertyValue(\"--calcite-modal-width\");\n this.cssHeight = getComputedStyle(this.el).getPropertyValue(\"--calcite-modal-height\");\n };\n\n private contentTopSlotChangeHandler = (event: Event): void => {\n this.hasContentTop = slotChangeHasAssignedElement(event);\n };\n\n private contentBottomSlotChangeHandler = (event: Event): void => {\n this.hasContentBottom = slotChangeHasAssignedElement(event);\n };\n}\n"],"mappings":"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","ignoreList":[]}