UNPKG

@esri/calcite-components

Version:

Web Components for Esri's Calcite Design System.

3 lines (2 loc) 8.31 kB
/* COPYRIGHT Esri - https://js.arcgis.com/5.0/LICENSE.txt */ import{a as m}from"./LG254OZM.js";import{a as A}from"./K7LRDT5O.js";import{c as B}from"./2H6QHI5U.js";import{a as p,b as r,c as h,d as M}from"./ONZUNTVX.js";import{a as b}from"./3XLPUKLV.js";import"./3YEM2IPT.js";import"./QUTTHRH3.js";import"./MNIRD7Q7.js";import{q as I}from"./ZQBZ5QPB.js";import{a as x}from"./CIYXQ5G6.js";import{D as u,E,F as d,Q as v,g,h as o,l,p as c}from"./G7AHLVJ5.js";var D=g`:host([scale=s]){--calcite-internal-action-menu-gap: var(--calcite-action-menu-items-space, var(--calcite-spacing-xxs));--calcite-internal-action-menu-padding: var(--calcite-spacing-xxs)}:host([scale=m]){--calcite-internal-action-menu-gap: var(--calcite-action-menu-items-space, var(--calcite-spacing-sm));--calcite-internal-action-menu-padding: var(--calcite-spacing-sm)}:host([scale=l]){--calcite-internal-action-menu-gap: var(--calcite-action-menu-items-space, var(--calcite-spacing-sm-plus));--calcite-internal-action-menu-padding: var(--calcite-spacing-sm-plus)}:host{box-sizing:border-box;display:flex;flex-direction:column;font-size:var(--calcite-font-size-relative-lg)}::slotted(calcite-action-group:not(:last-of-type)){border-block-end-width:var(--calcite-border-width-sm);padding-block-end:var(--calcite-internal-action-menu-padding)}.default-trigger{position:relative;block-size:100%;flex:0 1 auto;align-self:stretch}slot[name=trigger]::slotted(calcite-action),calcite-action::slotted([slot=trigger]){position:relative;block-size:100%;flex:0 1 auto;align-self:stretch}.menu{display:flex;max-block-size:45vh;flex-direction:column;flex-wrap:nowrap;overflow-y:auto;overflow-x:hidden;outline:2px solid transparent;outline-offset:2px;gap:var(--calcite-internal-action-menu-gap);padding:var(--calcite-internal-action-menu-padding)}:host([hidden]){display:none}[hidden]{display:none}`,C=["ArrowUp","ArrowDown","End","Home"],f=class extends E{constructor(){super(...arguments),this.guid=x(),this.actionElements=[],this.menuButtonClick=()=>{this.toggleOpen()},this.menuButtonId=r.button(this.guid),this.menuButtonKeyDown=e=>{let{key:t}=e,{actionElements:n,activeMenuItemIndex:i,open:a}=this;if(n.length){if(A(t)){if(e.preventDefault(),!a){this.toggleOpen();return}let s=n[i];s?s.click():this.toggleOpen(!1)}if(t==="Tab"){this.open=!1;return}if(t==="Escape"){this.toggleOpen(!1),e.preventDefault();return}this.handleActionNavigation(e,t,n)}},this.menuId=r.menu(this.guid),this._open=!1,this.updateAction=(e,t)=>{let{guid:n,activeMenuItemIndex:i}=this,a=r.action(n,t);e.tabIndex=-1,e.setAttribute("role","menuitem"),e.id||(e.id=a),e.activeDescendant=t===i},this.focusSetter=b()(this),this.mouseDownHandler=e=>{e.composedPath().some(B)&&(this.activeMenuItemIndex=this.actionElements?.findIndex(t=>t===e.target))},this.activeMenuItemIndex=-1,this.appearance="solid",this.expanded=!1,this.overlayPositioning="absolute",this.placement="auto",this.topLayerDisabled=!1,this.scale="m",this.calciteActionMenuCollapse=c({cancelable:!1}),this.calciteActionMenuExpand=c({cancelable:!1}),this.calciteActionMenuOpen=c({cancelable:!1})}static{this.properties={activeMenuItemIndex:[16,{},{state:!0}],menuButtonEl:[16,{},{state:!0}],appearance:[3,{},{reflect:!0}],expanded:[7,{},{reflect:!0,type:Boolean}],flipPlacements:[0,{},{attribute:!1}],label:1,open:[7,{},{reflect:!0,type:Boolean}],overlayPositioning:[3,{},{reflect:!0}],placement:[3,{},{reflect:!0}],topLayerDisabled:[7,{},{reflect:!0,type:Boolean}],scale:[3,{},{reflect:!0}]}}static{this.styles=D}get open(){return this._open}set open(e){let t=this._open;e!==t&&(this._open=e,this.openHandler(e))}async setFocus(e){return this.focusSetter(()=>this.menuButtonEl,e)}connectedCallback(){super.connectedCallback(),this.connectMenuButtonEl(),this.listen("mousedown",this.mouseDownHandler)}willUpdate(e){e.has("expanded")&&(this.hasUpdated||this.expanded!==!1)&&this.expandedHandler(),e.has("activeMenuItemIndex")&&(this.hasUpdated||this.activeMenuItemIndex!==-1)&&this.updateActions(this.actionElements),e.has("expanded")&&this.hasUpdated&&(this.expanded?this.calciteActionMenuExpand.emit():this.calciteActionMenuCollapse.emit())}disconnectedCallback(){super.disconnectedCallback(),this.disconnectMenuButtonEl()}expandedHandler(){this.open=!1,this.setTooltipReferenceElement()}openHandler(e){this.menuButtonEl&&(this.menuButtonEl.active=e,this.menuButtonEl.aria={expanded:e}),this.popoverEl&&(this.popoverEl.open=e),this.activeMenuItemIndex=this.open?0:-1,this.calciteActionMenuOpen.emit(),this.setTooltipReferenceElement()}connectMenuButtonEl(){let{menuButtonId:e,menuId:t,open:n,label:i}=this,a=this.slottedMenuButtonEl||this.defaultMenuButtonEl;this.menuButtonEl!==a&&(this.disconnectMenuButtonEl(),this.menuButtonEl=a,this.setTooltipReferenceElement(),a&&(a.active=n,a.setAttribute("aria-controls",t),a.setAttribute("aria-expanded",I(n)),a.setAttribute("aria-haspopup","true"),a.id||(a.id=e),a.label||(a.label=i),a.text||(a.text=i),a.addEventListener("click",this.menuButtonClick),a.addEventListener("keydown",this.menuButtonKeyDown)))}disconnectMenuButtonEl(){let{menuButtonEl:e}=this;e&&(e.removeEventListener("click",this.menuButtonClick),e.removeEventListener("keydown",this.menuButtonKeyDown),this.menuButtonEl=null)}setMenuButtonEl(e){let t=e.target.assignedElements({flatten:!0}).filter(n=>n?.matches("calcite-action"));this.slottedMenuButtonEl=t[0],this.connectMenuButtonEl()}setDefaultMenuButtonEl(e){this.defaultMenuButtonEl=e,this.connectMenuButtonEl()}setPopoverEl(e){e&&(this.popoverEl=e,e.open=this.open)}handleCalciteActionClick(e){this.actionElements?.some(t=>e.composedPath().includes(t))&&(this.open=!1,this.setFocus())}updateTooltip(e){let t=e.target.assignedElements({flatten:!0}).filter(n=>n?.matches("calcite-tooltip"));this.tooltipEl=t[0],this.setTooltipReferenceElement()}setTooltipReferenceElement(){let{tooltipEl:e,expanded:t,menuButtonEl:n,open:i}=this;e&&(e.referenceElement=!t&&!i?n:null)}updateActions(e){e?.forEach(this.updateAction)}async handleDefaultSlotChange(e){let t=e.target.assignedElements({flatten:!0}).reduce((n,i)=>i?.matches("calcite-action")?(n.push(i),n):i?.matches("calcite-action-group")?n.concat(Array.from(i.querySelectorAll("calcite-action"))):n,[]);await this.componentOnReady(),this.actionElements=t.filter(n=>!n.disabled&&!n.hidden)}isValidKey(e,t){return!!t.find(n=>n===e)}handleActionNavigation(e,t,n){if(!this.isValidKey(t,C))return;if(e.preventDefault(),!this.open){this.toggleOpen(),(t==="Home"||t==="ArrowDown")&&(this.activeMenuItemIndex=0),(t==="End"||t==="ArrowUp")&&(this.activeMenuItemIndex=n.length-1);return}t==="Home"&&(this.activeMenuItemIndex=0),t==="End"&&(this.activeMenuItemIndex=n.length-1);let i=this.activeMenuItemIndex;t==="ArrowUp"&&(this.activeMenuItemIndex=m(Math.max(i-1,-1),n.length)),t==="ArrowDown"&&(this.activeMenuItemIndex=m(i+1,n.length))}toggleOpen(e=!this.open){this.open=e}handlePopoverOpen(e){e.stopPropagation(),this.open=!0,this.setFocus()}handlePopoverClose(e){e.stopPropagation(),this.open=!1}renderMenuButton(){let{appearance:e,label:t,scale:n,expanded:i}=this;return o`<slot name=${h.trigger} @slotchange=${this.setMenuButtonEl}><calcite-action .appearance=${e} .aria=${{expanded:i}} class=${d(p.defaultTrigger)} .icon=${M.menu} .scale=${n} .text=${t} .textEnabled=${i} ${u(this.setDefaultMenuButtonEl)}></calcite-action></slot>`}renderMenuItems(){let{actionElements:e,activeMenuItemIndex:t,menuId:n,menuButtonEl:i,label:a,placement:s,overlayPositioning:$,flipPlacements:y}=this,w=e[t]?.id||null;return o`<calcite-popover auto-close .flipPlacements=${y} focus-trap-disabled .label=${a} offset-distance=0 @calcitePopoverClose=${this.handlePopoverClose} @calcitePopoverOpen=${this.handlePopoverOpen} .overlayPositioning=${$} .placement=${s} pointer-disabled .referenceElement=${i} .scale=${this.scale} .topLayerDisabled=${this.topLayerDisabled} trigger-disabled ${u(this.setPopoverEl)}><div aria-activedescendant=${w??l} aria-labelledby=${i?.id??l} class=${d(p.menu)} id=${n??l} @click=${this.handleCalciteActionClick} role=menu tabindex=-1><slot @slotchange=${this.handleDefaultSlotChange}></slot></div></calcite-popover>`}render(){return o`${this.renderMenuButton()}${this.renderMenuItems()}<slot name=${h.tooltip} @slotchange=${this.updateTooltip}></slot>`}};v("calcite-action-menu",f);export{f as ActionMenu};