@esri/calcite-components
Version:
Web Components for Esri's Calcite Design System.
3 lines (2 loc) • 12.6 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0/LICENSE.txt */
import{a}from"./HXIMHC6U.js";import{a as L}from"./SQ6RHDDF.js";import{a as k}from"./3XLPUKLV.js";import"./3YEM2IPT.js";import"./QUTTHRH3.js";import"./MNIRD7Q7.js";import{e as $,u as I}from"./ZQBZ5QPB.js";import"./CIYXQ5G6.js";import{C as p,D as v,E as w,F as r,H as u,K as y,Q as x,g,h as o,p as m}from"./G7AHLVJ5.js";var t={container:"container",content:"content",dropdownVertical:"dropdown--vertical",dropdownMenuItems:"dropdown-menu-items",dropdownAction:"dropdown-action",layoutVertical:"layout--vertical",hoverHrefIcon:"hover-href-icon",icon:"icon",iconBreadcrumb:"icon--breadcrumb",iconDropdown:"icon--dropdown",iconEnd:"icon--end",iconStart:"icon--start",isParentVertical:"parent--vertical",itemContent:"item-content",open:"open",nested:"nested",textContainer:"text-container"},S={submenuItem:"submenu-item"},c={arrowLeft:"arrow-left",arrowRight:"arrow-right",chevronLeft:"chevron-left",chevronRight:"chevron-right",chevronUp:"chevron-up",chevronDown:"chevron-down"},M=g`:host{--calcite-internal-menu-item-border: 1px solid var(--calcite-menu-item-sub-menu-border-color, var(--calcite-color-border-3));position:relative;box-sizing:border-box;display:flex;align-items:center;flex-shrink:0}:host .container,:host .item-content,:host .content{min-block-size:3rem}:host([layout=vertical]){inline-size:100%}:host(:not([layout=vertical])){block-size:100%}.container,.item-content{display:flex;block-size:100%;inline-size:100%;flex-direction:row;align-items:stretch}.item-content{background-color:var(--calcite-menu-background-color, var(--calcite-internal-menu-background-color, var(--calcite-color-foreground-1)))}.content{position:relative;box-sizing:border-box;display:flex;block-size:100%;inline-size:100%;cursor:pointer;align-items:center;justify-content:center;padding-inline:1rem;font-size:var(--calcite-font-size-relative-md);outline:2px solid transparent;outline-offset:2px;text-decoration:none;padding-block-start:.125rem;border-block-end:.125rem solid var(--calcite-color-transparent);background-color:var(--calcite-menu-background-color, var(--calcite-internal-menu-background-color, var(--calcite-color-foreground-1)));color:var(--calcite-menu-text-color, var(--calcite-internal-menu-text-color, var(--calcite-color-text-2)))}.content:hover{--calcite-internal-menu-background-color: var(--calcite-color-foreground-2)}.content:focus{border-block-end-width:4px;outline:var(--calcite-border-width-md) solid var(--calcite-color-focus, var(--calcite-ui-focus-color, var(--calcite-color-brand)));outline-offset:calc(calc(-1 * var(--calcite-spacing-base)) * calc(1 - (2*clamp(0,var(--calcite-offset-invert-focus),1))));padding-block-start:.25rem;border-block-end-width:.25rem}.content:active{--calcite-internal-menu-background-color: var(--calcite-color-foreground-3);--calcite-internal-menu-text-color: var(--calcite-color-text-1)}.content span{display:inline-flex}.content.layout--vertical{display:flex;inline-size:100%;justify-content:flex-start;padding-block:var(--calcite-space-md);border-block-end:0;border-inline-end:.25rem solid var(--calcite-color-transparent)}:host([layout=vertical]) .content{padding-inline:.75rem}:host([active]) .content{--calcite-internal-menu-text-color: var(--calcite-color-text-1);border-color:var(--calcite-menu-item-accent-color, var(--calcite-color-brand))}:host([active]) .icon{--calcite-internal-menu-item-icon-color: var( --calcite-icon-color, var(--calcite-ui-icon-color, var(--calcite-color-brand)) )}.icon{color:var(--calcite-menu-text-color, var(--calcite-icon-color, var(--calcite-internal-menu-item-icon-color, var(--calcite-ui-icon-color, var(--calcite-color-text-3)))))}.icon--start{margin-inline-end:.75rem}.icon--end{margin-inline-start:.75rem}:host([layout=vertical]) .icon--end{margin-inline-start:auto;padding-inline-start:.75rem}.icon--dropdown{position:relative;margin-inline-start:auto;margin-inline-end:0px;padding-inline-start:.5rem}:host([layout=vertical]) .icon--end~.icon--dropdown{margin-inline-start:.75rem}:host([layout=vertical]) .hover-href-icon{padding-inline-start:.5rem}:host([layout=vertical]) .hover-href-icon~.icon--end{margin-inline-start:.5rem}:host([layout=vertical]) .hover-href-icon~.icon--breadcrumb{margin-inline-start:.75rem}.icon--breadcrumb{margin-inline-end:0px;padding-inline-start:.5rem}:host([layout=vertical]) .icon--breadcrumb{margin-inline-start:auto}:host([layout=vertical]) .icon--breadcrumb~.icon--dropdown{margin-inline-start:.5rem}:host([layout=vertical]) .icon--end~.icon--breadcrumb{margin-inline-start:.5rem}:host([breadcrumb]) .content{padding-inline-end:.75rem}.dropdown-action{position:relative;align-self:center;--calcite-action-background-color: var(--calcite-menu-background-color);--calcite-action-text-color: var(--calcite-menu-text-color);margin-inline-start:var(--calcite-spacing-xxs)}.dropdown-action:after{position:absolute;display:block;inline-size:1px;content:"";inset-inline-start:calc(-1 * var(--calcite-spacing-xxs));inset-block:var(--calcite-spacing-xxs);background-color:var(--calcite-color-border-3)}.dropdown-action:active{--calcite-action-background-color-press: var(--calcite-menu-background-color)}:host([layout=vertical]) .dropdown-action{margin-inline-end:var(--calcite-spacing-xxs)}.dropdown-menu-items{position:absolute;display:none;block-size:auto;min-inline-size:100%;flex-direction:column;overflow:visible;border:var(--calcite-internal-menu-item-border);border-radius:var(--calcite-menu-item-sub-menu-corner-radius, var(--calcite-corner-radius));inset-block-start:100%;z-index:var(--calcite-z-index-dropdown)}.dropdown-menu-items.open{display:block}.dropdown-menu-items.nested{position:absolute;inset-block-start:-1px;transform:translate(calc(100% - 2px))}.parent--vertical{flex-direction:column}.dropdown--vertical.dropdown-menu-items{position:relative;box-shadow:none;inset-block-start:0;transform:none}.dropdown--vertical.dropdown-menu-items:last-of-type{border-inline:0}:host([layout=vertical]:last-of-type) .dropdown-menu-items{border-block-end:0}:host([layout=vertical]) .dropdown--vertical.dropdown-menu-items{border:none}:host([layout=vertical]) .dropdown--vertical.dropdown-menu-items:after{content:"";border-block-start:var(--calcite-internal-menu-item-border);position:absolute;inset-block-start:0;inset-inline:var(--calcite-space-md) 0}:host([slot=submenu-item]) .parent--vertical{padding-inline-start:1.5rem}.dropdown-menu-items.nested.calcite--rtl{transform:translate(calc(-100% + 2px))}.dropdown--vertical.dropdown-menu-items.nested.calcite--rtl{transform:none}.hover-href-icon{position:relative;inset-inline-end:.25rem;margin-inline-start:auto;opacity:0;transition:all var(--calcite-internal-animation-timing-medium) ease-in-out}.content:focus .hover-href-icon,.content:hover .hover-href-icon{inset-inline-end:-.25rem;opacity:1}:host([hidden]){display:none}[hidden]{display:none}`,f=class extends w{constructor(){super(),this.anchorRef=p(),this.dropdownActionRef=p(),this.messages=L(),this.focusSetter=k()(this),this.hasSubmenu=!1,this.isTopLevelItem=!1,this.open=!1,this.calciteInternalMenuItemKeyEvent=m(),this.calciteMenuItemSelect=m(),this.listenOn(window,"click",this.handleClickOut),this.listen("focusout",this.handleFocusOut),this.listen("blur",this.blurHandler),this.listen("focus",this.focusHandler)}static{this.properties={hasSubmenu:[16,{},{state:!0}],submenuItems:[16,{},{state:!0}],active:[7,{},{reflect:!0,type:Boolean}],breadcrumb:[7,{},{reflect:!0,type:Boolean}],href:1,iconEnd:[3,{type:String},{reflect:!0}],iconFlipRtl:[3,{},{reflect:!0}],iconStart:[3,{type:String},{reflect:!0}],isTopLevelItem:[5,{},{type:Boolean}],label:1,layout:[3,{},{reflect:!0}],messageOverrides:[0,{},{attribute:!1}],open:[7,{},{reflect:!0,type:Boolean}],rel:[3,{},{reflect:!0}],target:[3,{},{reflect:!0}],text:1,topLevelMenuLayout:1}}static{this.styles=M}async setFocus(e){return this.focusSetter(()=>this.anchorRef.value,e)}handleClickOut(e){this.topLevelMenuLayout!=="vertical"&&this.hasSubmenu&&this.open&&!e.composedPath().includes(this.el)&&(this.open=!1)}handleFocusOut(e){this.topLevelMenuLayout!=="vertical"&&!this.el.contains(e.relatedTarget)&&(this.open=!1)}blurHandler(){this.isFocused=!1}clickHandler(e){(this.href&&e.target===this.dropdownActionRef.value||!this.href&&this.hasSubmenu)&&(this.open=!this.open),this.selectMenuItem(e)}focusHandler(e){let n=e.target;this.isFocused=!0,n.open&&!this.open&&(n.open=!1)}handleMenuItemSlotChange(e){this.submenuItems=I(e),this.submenuItems.forEach(n=>{n.topLevelMenuLayout||(n.topLevelMenuLayout=this.topLevelMenuLayout)}),this.hasSubmenu=this.submenuItems.length>0}async keyDownHandler(e){let{hasSubmenu:n,href:l,layout:b,open:s,submenuItems:h}=this,i=e.key,d=e.target===this.dropdownActionRef.value;if(!e.defaultPrevented){if(i===" "||i==="Enter")n&&(!l||l&&d)&&(this.open=!s),!(l&&d)&&i!=="Enter"&&this.selectMenuItem(e),(i===" "||l&&d)&&e.preventDefault();else if(i==="Escape"){if(s){this.open=!1;return}this.calciteInternalMenuItemKeyEvent.emit({event:e}),e.preventDefault()}else if(i==="ArrowDown"||i==="ArrowUp"){if(e.preventDefault(),(d||!l)&&n&&!s&&b==="horizontal"){this.open=!0;return}this.calciteInternalMenuItemKeyEvent.emit({event:e,children:h,isSubmenuOpen:s&&n})}else if(i==="ArrowLeft")e.preventDefault(),this.calciteInternalMenuItemKeyEvent.emit({event:e,children:h,isSubmenuOpen:!0});else if(i==="ArrowRight"){if(e.preventDefault(),(d||!l)&&n&&!s&&b==="vertical"){this.open=!0;return}this.calciteInternalMenuItemKeyEvent.emit({event:e,children:h,isSubmenuOpen:s&&n})}}}selectMenuItem(e){e.target!==this.dropdownActionRef.value&&this.calciteMenuItemSelect.emit()}renderIconStart(){return a(t.iconStart,o`<calcite-icon class=${`${t.icon} ${t.iconStart}`} .flipRtl=${this.iconFlipRtl==="start"||this.iconFlipRtl==="both"} .icon=${this.iconStart} scale=s></calcite-icon>`)}renderIconEnd(){return a(t.iconEnd,o`<calcite-icon class=${`${t.icon} ${t.iconEnd}`} .flipRtl=${this.iconFlipRtl==="end"||this.iconFlipRtl==="both"} .icon=${this.iconEnd} scale=s></calcite-icon>`)}renderBreadcrumbIcon(e){return a(t.iconBreadcrumb,o`<calcite-icon class=${`${t.icon} ${t.iconBreadcrumb}`} .icon=${e==="rtl"?c.chevronLeft:c.chevronRight} scale=s></calcite-icon>`)}renderDropdownIcon(e){let n=e==="rtl"?"chevron-left":"chevron-right";return a(t.iconDropdown,o`<calcite-icon class=${`${t.icon} ${t.iconDropdown}`} .icon=${this.topLevelMenuLayout==="vertical"||this.isTopLevelItem?this.open?c.chevronUp:c.chevronDown:n} scale=s></calcite-icon>`)}renderDropdownAction(e){let n=e==="rtl"?"chevron-left":"chevron-right";return a(t.dropdownAction,o`<calcite-action .aria=${{expanded:this.open}} class=${r(t.dropdownAction)} .icon=${this.topLevelMenuLayout==="vertical"||this.isTopLevelItem?this.open?c.chevronUp:c.chevronDown:n} =${this.clickHandler} =${this.keyDownHandler} .text=${this.messages.open} ${v(this.dropdownActionRef)}></calcite-action>`)}renderSubmenuItems(e){return o`<calcite-menu class=${r({[t.dropdownMenuItems]:!0,[t.open]:this.open,[t.nested]:!this.isTopLevelItem,[y.rtl]:e==="rtl",[t.dropdownVertical]:this.topLevelMenuLayout==="vertical"})} .label=${this.messages.submenu} layout=vertical role=menu><slot name=${S.submenuItem} =${this.handleMenuItemSlotChange}></slot></calcite-menu>`}renderHrefIcon(e){return a(t.hoverHrefIcon,o`<calcite-icon class=${r(t.hoverHrefIcon)} .icon=${e==="rtl"?c.arrowLeft:c.arrowRight} scale=s></calcite-icon>`)}renderItemContent(e){let n=this.href&&(this.topLevelMenuLayout==="vertical"||!this.isTopLevelItem);return o`${this.iconStart&&this.renderIconStart()||""}<div class=${r(t.textContainer)}><span>${this.text}</span></div>${n&&this.renderHrefIcon(e)||""}${this.iconEnd&&this.renderIconEnd()||""}${this.breadcrumb?this.renderBreadcrumbIcon(e):null}${!this.href&&this.hasSubmenu?this.renderDropdownIcon(e):null}`}render(){let e=$(this.el);return o`<li class=${r({[t.container]:!0,[t.isParentVertical]:this.topLevelMenuLayout==="vertical"})} role=none><div class=${r(t.itemContent)}><a .ariaCurrent=${this.isFocused?"page":!1} .ariaExpanded=${this.open} .ariaHasPopup=${this.hasSubmenu} .ariaLabel=${this.label} class=${r({[t.layoutVertical]:this.layout==="vertical",[t.content]:!0})} href=${this.href??u} =${this.clickHandler} =${this.keyDownHandler} rel=${this.rel??u} role=menuitem .tabIndex=${this.isTopLevelItem?0:-1} target=${this.target??u} ${v(this.anchorRef)}>${this.renderItemContent(e)}</a>${this.href&&this.hasSubmenu?this.renderDropdownAction(e):null}</div>${this.renderSubmenuItems(e)}</li>`}};x("calcite-menu-item",f);export{f as MenuItem};