@scania/tegel
Version:
Tegel Design System
1 lines • 9.64 kB
JavaScript
import{r as t,c as o,h as s,H as d,g as a}from"./p-2049fab2.js";import{h as e}from"./p-ae110fc2.js";import{g as i}from"./p-11648030.js";const r=class{constructor(s){t(this,s),this.tdsClose=o(this,"tdsClose",7),this.tdsOpen=o(this,"tdsOpen",7),this.handleClose=t=>{const o=this.tdsClose.emit(t);this.returnFocusOnClose(),o.defaultPrevented||(this.isShown=!1)},this.handleShow=()=>{this.tdsOpen.emit().defaultPrevented||(this.isShown=!0)},this.handleOverlayClick=t=>{const o=t.composedPath()[0];("tds-modal-close"===o.classList[0]||"tds-modal-backdrop"===o.classList[0]&&!1===this.prevent)&&this.handleClose(t)},this.handleReferenceElementClick=t=>{this.isShown?this.handleClose(t):this.handleShow()},this.setShowButton=()=>{var t;if(this.selector||this.referenceEl){const o=null!==(t=this.referenceEl)&&void 0!==t?t:document.querySelector(this.selector);o&&this.initializeReferenceElement(o)}},this.initializeReferenceElement=t=>{t&&t.addEventListener("click",this.handleReferenceElementClick)},this.header=void 0,this.prevent=!1,this.size="md",this.actionsPosition="static",this.selector=void 0,this.referenceEl=void 0,this.show=void 0,this.closable=!0,this.tdsAlertDialog="dialog",this.isShown=!1,this.activeElementIndex=0}async showModal(){this.isShown=!0,requestAnimationFrame((()=>{const t=this.getFocusableElements();t.length>0&&(t[0].focus(),this.activeElementIndex=0)}))}async closeModal(){this.isShown=!1,this.returnFocusOnClose()}async isOpen(){return this.isShown}connectedCallback(){void 0===this.closable&&(this.closable=!0),void 0!==this.show&&(this.isShown=this.show),this.initializeModal(),this.header&&e("header",this.host)&&console.warn("Tegel Modal component: Using both header prop and header slot might break modal's design. Please use just one of them. "),this.selector||this.referenceEl||console.warn('Tegel Modal: Missing focus origin. Please provide either a "referenceEl" or a "selector" to ensure focus returns to the element that opened the modal. If the modal is opened programmatically, this message can be ignored.')}componentWillLoad(){this.initializeModal()}disconnectedCallback(){this.cleanupModal()}async initializeModal(){this.setDismissButtons(),this.setShowButton()}async cleanupModal(){var t;if(this.selector||this.referenceEl){const o=null!==(t=this.referenceEl)&&void 0!==t?t:document.querySelector(this.selector);o&&o.removeEventListener("click",this.handleReferenceElementClick)}this.host.querySelectorAll("[data-dismiss-modal]").forEach((t=>{t.removeEventListener("click",this.handleClose)}))}returnFocusOnClose(){var t;let o=null!==(t=this.referenceEl)&&void 0!==t?t:document.querySelector(this.selector);if(!o)return;const s=["BUTTON","A","INPUT"];if(s.includes(o.tagName))o.focus();else{const t=o.querySelector(s.join(","));t&&t.focus()}}getFocusableElements(){const t=["a[href]","button:not([disabled])","textarea:not([disabled])","input:not([disabled])","select:not([disabled])",'[tabindex]:not([tabindex="-1"])'].join(",");return[...Array.from(this.host.shadowRoot.querySelectorAll(t)),...Array.from(this.host.querySelectorAll(t))]}handleFocusTrap(t){if("Escape"===t.key&&this.isShown&&!this.prevent)return void this.handleClose(t);if(!this.isShown)return;if("Tab"!==t.key)return;const o=this.getFocusableElements();0!==o.length&&(t.preventDefault(),t.shiftKey&&(this.activeElementIndex-=1,-1===this.activeElementIndex&&(this.activeElementIndex=o.length-1)),t.shiftKey||(this.activeElementIndex+=1,this.activeElementIndex===o.length&&(this.activeElementIndex=0)),o[this.activeElementIndex].focus())}setDismissButtons(){this.host.querySelectorAll("[data-dismiss-modal]").forEach((t=>{t.addEventListener("click",this.handleClose)}))}render(){const t=e("header",this.host),o=e("actions",this.host),a=this.header?`tds-modal-header-${i()}`:void 0,r=`tds-modal-body-${i()}`;return s(d,{key:"2d39760de58fd957585e4370aa88447d85249eca",role:this.tdsAlertDialog,"aria-modal":"true","aria-describedby":r,"aria-labelledby":a,class:{show:this.isShown,hide:!this.isShown},onClick:t=>this.handleOverlayClick(t)},s("div",{key:"5eeaf5c29529bf77ddde4892067f13d312d1bba7",class:"tds-modal-backdrop"}),s("div",{key:"8a6ccd911dfec947a809320a0631d5f9904ef78d",class:`tds-modal tds-modal__actions-${this.actionsPosition} tds-modal-${this.size}`},s("div",{key:"b7c760ebded4e98319cec75c161002a579316902",id:a,class:"header"},this.header&&s("div",{key:"db14e71913052ba5367ab95a41a366c7f2dea4a3",class:"header-text"},this.header),t&&s("slot",{key:"62b394718c78e564fd50e7ff3328e637a63679e6",name:"header"}),this.closable&&s("button",{key:"9ff8ad81be4f72ee6a298a9ba39a1024269d3ec2",class:"tds-modal-close","aria-label":"close",onClick:t=>this.handleClose(t)},s("tds-icon",{key:"b34b8a55c7f5c65ce7a3fdee6114c66ee4ab82c3",name:"cross",size:"20px"}))),s("div",{key:"ab04e506dd94c69d8f91fb774fa85f355f3629d4",id:r,class:"body"},s("slot",{key:"f4a8e2377b4cae3a9c4fa1032e896b0b0c58a06a",name:"body"})),o&&s("slot",{key:"09137d7c8b81f91dbf419b10c8a085de25df1272",name:"actions"})))}get host(){return a(this)}};r.style=".tds-modal{box-sizing:border-box;box-shadow:var(--tds-modal-box-shadow);background-color:var(--background-elevation-layer-02);margin:auto;position:relative;border-radius:var(--radius-narrow);max-height:85vh;overflow-y:auto;pointer-events:auto}.tds-modal *{box-sizing:border-box}.tds-modal::-webkit-scrollbar{width:6px;background-color:transparent}.tds-modal::-webkit-scrollbar-track{background-color:transparent}.tds-modal::-webkit-scrollbar-thumb{background-color:var(--foreground-elements-transparparent-discrete);border-radius:3px}.tds-modal__actions-sticky{overflow:hidden;display:flex;flex-direction:column}.tds-modal__actions-sticky .body{font-family:var(--body-01-font-family);font-size:var(--body-01-font-size);line-height:var(--body-01-line-height);font-weight:var(--body-01-font-weight);letter-spacing:var(--body-01-letter-spacing);text-transform:var(--body-01-text-transform);max-height:calc(85vh - 36px);overflow-y:auto}.tds-modal__actions-sticky slot[name=actions]{bottom:-1px;left:0;right:0;background-color:var(--background-elevation-layer-02);padding:24px 16px 16px;display:flex;gap:16px}.tds-modal__actions-static slot[name=actions]{background-color:var(--background-elevation-layer-02);display:flex;gap:16px;padding:24px 16px 16px}@media (min-width: 320px){.tds-modal-xs{width:100%}.tds-modal-sm{width:100%}.tds-modal-md{width:100%}.tds-modal-lg{width:100%}}@media (min-width: 672px){.tds-modal-xs{width:50%}.tds-modal-sm{width:62.5%}.tds-modal-md{width:75%}.tds-modal-lg{width:100%}}@media (min-width: 1056px){.tds-modal-xs{width:31.25%}.tds-modal-sm{width:43.75%}.tds-modal-md{width:62.5%}.tds-modal-lg{width:75%}}@media (min-width: 1312px){.tds-modal-xs{width:31.25%}.tds-modal-sm{width:37.5%}.tds-modal-md{width:62.5%}.tds-modal-lg{width:75%}}@media (min-width: 1584px){.tds-modal-xs{width:25%}.tds-modal-sm{width:37.5%}.tds-modal-md{width:50%}.tds-modal-lg{width:75%}}@media (max-width: 320px){.tds-modal-md,.tds-modal-lg,.tds-modal-sm{height:100%}.tds-modal-md slot[name=actions]::slotted(*),.tds-modal-lg slot[name=actions]::slotted(*),.tds-modal-sm slot[name=actions]::slotted(*){display:flex}}.header{display:flex;padding:16px;position:sticky;top:0;background-color:var(--background-elevation-layer-02);z-index:1}.header,slot[name=header]::slotted(*){font-family:var(--headline-05-font-family);font-size:var(--headline-05-font-size);line-height:var(--headline-05-line-height);font-weight:var(--headline-05-font-weight);letter-spacing:var(--headline-05-letter-spacing);text-transform:var(--headline-05-text-transform);color:var(--foreground-text-strong);margin:0;flex:1}.body{font-family:var(--body-01-font-family);font-size:var(--body-01-font-size);line-height:var(--body-01-line-height);font-weight:var(--body-01-font-weight);letter-spacing:var(--body-01-letter-spacing);text-transform:var(--body-01-text-transform);color:var(--foreground-text-strong);overflow-y:visible;padding:0 16px 16px}.body::-webkit-scrollbar{width:6px;background-color:transparent}.body::-webkit-scrollbar-track{background-color:transparent}.body::-webkit-scrollbar-thumb{background-color:var(--foreground-elements-transparparent-discrete);border-radius:3px}.tds-modal-backdrop{box-sizing:border-box;position:fixed;top:0;right:0;bottom:0;left:0;background-color:var(--tds-modal-backdrop-background);pointer-events:auto}.tds-modal-backdrop *{box-sizing:border-box}button.tds-modal-close{margin:0 0 auto auto;background-color:transparent;border:0;padding:0;appearance:unset}.tds-modal-close{display:inline-block;height:auto;color:var(--foreground-text-strong);cursor:pointer}.tds-modal-close:focus{outline:2px solid var(--tds-focus-outline-color);box-shadow:0 0 0 1px var(--tds-white);outline-offset:1px;z-index:1}@media (min-width: 320px){.tds-modal-close{margin-left:16px}}@media (min-width: 1056px){.tds-modal-close{margin-left:48px}}.tds-modal-close-btn{display:inline-block;height:auto;background-repeat:no-repeat;cursor:pointer}@media (min-width: 320px){.tds-modal-close-btn{margin-left:16px}}@media (min-width: 1056px){.tds-modal-close-btn{margin-left:48px}}.tds-modal-close-btn svg{fill:var(--foreground-text-strong)}.tds-modal-overflow{overflow:hidden}:host{box-sizing:border-box;position:fixed;top:0;right:0;bottom:0;left:0;padding:0 16px;z-index:700;pointer-events:none}:host *{box-sizing:border-box}:host .tds-modal-close{border:none;background-color:transparent}:host .tds-modal-close-btn{border:none;background-color:transparent}@media (max-width: 320px){:host{padding:0}}:host.show{display:flex}:host.hide{display:none}:host(.show){display:flex}:host(.hide){display:none}";export{r as tds_modal}