@zanichelli/albe-web-components 16.3.1 → 16.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/web-components-library.cjs.js +1 -1
  4. package/dist/cjs/z-app-header_12.cjs.entry.js +67 -17
  5. package/dist/cjs/z-app-header_12.cjs.entry.js.map +1 -1
  6. package/dist/cjs/z-menu-section.cjs.entry.js +28 -13
  7. package/dist/cjs/z-menu-section.cjs.entry.js.map +1 -1
  8. package/dist/cjs/z-menu.cjs.entry.js +89 -43
  9. package/dist/cjs/z-menu.cjs.entry.js.map +1 -1
  10. package/dist/collection/components/z-app-header/index.js +55 -13
  11. package/dist/collection/components/z-app-header/index.js.map +1 -1
  12. package/dist/collection/components/z-app-header/index.stories.js +50 -116
  13. package/dist/collection/components/z-app-header/index.stories.js.map +1 -1
  14. package/dist/collection/components/z-app-header/styles.css +34 -25
  15. package/dist/collection/components/z-menu/index.js +93 -42
  16. package/dist/collection/components/z-menu/index.js.map +1 -1
  17. package/dist/collection/components/z-menu/styles.css +40 -52
  18. package/dist/collection/components/z-menu-section/index.js +31 -16
  19. package/dist/collection/components/z-menu-section/index.js.map +1 -1
  20. package/dist/collection/components/z-menu-section/styles.css +8 -0
  21. package/dist/collection/components/z-searchbar/index.js +14 -5
  22. package/dist/collection/components/z-searchbar/index.js.map +1 -1
  23. package/dist/components/index23.js +14 -5
  24. package/dist/components/index23.js.map +1 -1
  25. package/dist/components/z-app-header.js +56 -14
  26. package/dist/components/z-app-header.js.map +1 -1
  27. package/dist/components/z-menu-section.js +30 -15
  28. package/dist/components/z-menu-section.js.map +1 -1
  29. package/dist/components/z-menu.js +89 -44
  30. package/dist/components/z-menu.js.map +1 -1
  31. package/dist/esm/loader.js +1 -1
  32. package/dist/esm/web-components-library.js +1 -1
  33. package/dist/esm/z-app-header_12.entry.js +67 -17
  34. package/dist/esm/z-app-header_12.entry.js.map +1 -1
  35. package/dist/esm/z-menu-section.entry.js +28 -13
  36. package/dist/esm/z-menu-section.entry.js.map +1 -1
  37. package/dist/esm/z-menu.entry.js +89 -43
  38. package/dist/esm/z-menu.entry.js.map +1 -1
  39. package/dist/types/components/z-app-header/index.d.ts +4 -3
  40. package/dist/types/components/z-menu/index.d.ts +9 -1
  41. package/dist/types/components/z-menu-section/index.d.ts +4 -2
  42. package/dist/types/components/z-searchbar/index.d.ts +1 -0
  43. package/dist/web-components-library/p-8e5f1ae0.entry.js +2 -0
  44. package/dist/web-components-library/p-8e5f1ae0.entry.js.map +1 -0
  45. package/dist/web-components-library/p-b6e7866f.entry.js +2 -0
  46. package/dist/web-components-library/p-b6e7866f.entry.js.map +1 -0
  47. package/dist/web-components-library/p-fb0b11cd.entry.js +2 -0
  48. package/dist/web-components-library/p-fb0b11cd.entry.js.map +1 -0
  49. package/dist/web-components-library/web-components-library.esm.js +1 -1
  50. package/dist/web-components-library/web-components-library.esm.js.map +1 -1
  51. package/package.json +1 -1
  52. package/www/build/p-38bf2bfc.js +2 -0
  53. package/www/build/p-8e5f1ae0.entry.js +2 -0
  54. package/www/build/p-8e5f1ae0.entry.js.map +1 -0
  55. package/www/build/p-b6e7866f.entry.js +2 -0
  56. package/www/build/p-b6e7866f.entry.js.map +1 -0
  57. package/www/build/p-fb0b11cd.entry.js +2 -0
  58. package/www/build/p-fb0b11cd.entry.js.map +1 -0
  59. package/www/build/web-components-library.esm.js +1 -1
  60. package/www/build/web-components-library.esm.js.map +1 -1
  61. package/www/index.html +1 -1
  62. package/dist/web-components-library/p-04c39e8a.entry.js +0 -2
  63. package/dist/web-components-library/p-04c39e8a.entry.js.map +0 -1
  64. package/dist/web-components-library/p-0542a3c9.entry.js +0 -2
  65. package/dist/web-components-library/p-0542a3c9.entry.js.map +0 -1
  66. package/dist/web-components-library/p-16d625b3.entry.js +0 -2
  67. package/dist/web-components-library/p-16d625b3.entry.js.map +0 -1
  68. package/www/build/p-04c39e8a.entry.js +0 -2
  69. package/www/build/p-04c39e8a.entry.js.map +0 -1
  70. package/www/build/p-0542a3c9.entry.js +0 -2
  71. package/www/build/p-0542a3c9.entry.js.map +0 -1
  72. package/www/build/p-16d625b3.entry.js +0 -2
  73. package/www/build/p-16d625b3.entry.js.map +0 -1
  74. package/www/build/p-ae5cec65.js +0 -2
@@ -1,2 +0,0 @@
1
- import{r as t,c as e,h as i,a as s,g as o}from"./p-75c4a726.js";import{g as n}from"./p-6037cdf3.js";const a=':host,::slotted(*),*{box-sizing:border-box;outline:none}:host{position:relative;display:inline-flex;height:fit-content;flex-direction:column}::slotted(a){text-decoration:none}::slotted(*){color:var(--color-default-text);font-family:var(--font-family-sans);font-weight:var(--font-rg)}.menu-label{position:relative;width:100%;padding:0;border:0;margin:0;background:transparent;border-radius:0;color:inherit;text-align:left}.menu-wrapper{display:flex;align-items:center}button.menu-label{cursor:pointer}.menu-label:focus-within{box-shadow:var(--shadow-focus-primary)}.menu-label .menu-label-content{position:relative;display:flex;align-items:center;border-bottom:var(--border-size-large) solid transparent}:host(:is([active],[open])) .menu-label-content,.menu-label:focus-within .menu-label-content{color:var(--color-primary01);font-weight:var(--font-bd)}:host(:is([active],[open])) .menu-label-content ::slotted(*),.menu-label:focus-within .menu-label-content ::slotted(*),.menu-label:focus-within .menu-label-content z-icon{color:var(--color-primary01);letter-spacing:normal}:host([vertical-context]) .menu-label-content{padding:var(--space-unit) 0;border-width:var(--border-size-small);border-color:var(--color-surface03)}:host([vertical-context]) .menu-label-content ::slotted(*){padding:0}:host(:is([active],[open])) .menu-label .menu-label-content,.menu-label .menu-label-content:hover,.menu-label:focus-within .menu-label-content{border-color:var(--color-secondary01)}:host([vertical-context]:is([active],[open])) .menu-label .menu-label-content::after,:host([vertical-context]) .menu-label:hover::after,:host([vertical-context]) .menu-label:focus-within .menu-label-content::after{position:absolute;bottom:0;left:0;width:100%;height:var(--border-size-large);background-color:var(--color-secondary01);content:""}::slotted([data-text]:not([slot]))::after{height:0;content:attr(data-text);content:attr(data-text) / "";font-weight:var(--font-bd);letter-spacing:normal;pointer-events:none;user-select:none;visibility:hidden}@media speech{::slotted([data-text]:not([slot]))::after{display:none}}::slotted([data-text]:not([slot])){display:inline-flex;flex-direction:column}.menu-label .menu-label-content ::slotted(*){display:inline-flex;width:100%;min-width:fit-content;padding-bottom:2px;margin:0;appearance:none;color:var(--z-menu-label-color, var(--color-default-text));font-family:var(--font-family-sans);font-size:var(--font-size-3);font-weight:inherit;line-height:1.5}.menu-label .menu-label-content z-icon{margin-left:calc(var(--space-unit) * 1.5);fill:currentcolor}.content{background:var(--color-surface01)}:host(:not([open])) .content{display:none}:host([floating]:not([vertical-context])) .content{position:absolute;top:100%;left:0;width:375px;min-width:100%;max-width:100vw;padding:0 calc(var(--space-unit) * 2);box-shadow:var(--shadow-2)}:host(:not([floating])) .content{width:100%}.header{display:flex;align-items:center;padding:var(--space-unit) 0 calc(var(--space-unit) * 2)}.header ::slotted(img[slot="header"]){width:calc(var(--space-unit) * 11.25);height:auto;object-fit:contain}.header ::slotted([slot="header"]:not(:first-child)){margin:auto 0;margin-left:calc(var(--space-unit) * 2.5);font-size:var(--font-size-3);font-weight:var(--font-sb);line-height:1.5}.items{display:flex;flex-direction:column;align-items:flex-start;background:inherit}.items>::slotted([slot="item"]){width:100%;margin:0;font-size:var(--font-size-3);line-height:1.5}.items>::slotted([slot="item"]:focus:focus-visible){box-shadow:var(--shadow-focus-primary)}.items>::slotted([slot="item"]:not(z-menu-section)){padding:var(--space-unit) 0;border-bottom:var(--border-size-small) solid var(--color-surface03)}:host(:not([vertical-context])) .items>::slotted([slot="item"]:not(z-menu-section):last-of-type){border-bottom:0}.items>::slotted([slot="item"]:hover),.items>::slotted([slot="item"]:focus:focus-visible),.items>::slotted([slot="item"]:active){border-color:var(--color-secondary01);font-weight:var(--font-bd)}';const l=a;const r=t=>(t===null||t===void 0?void 0:t.tagName)==="Z-MENU-SECTION";const h=class{get focusableItem(){return this.items.find((t=>r(t)?t.htmlTabindex===0:t.tabIndex===0))}toggle(){if(!this.hasContent){return}this.open=!this.open}onLabelSlotChange(t){const e=t.target.assignedElements()[0];e.dataset.text=e===null||e===void 0?void 0:e.textContent;this.setLabelA11yAttrs()}reflow(t=false){if(this.content&&this.hasContent){const{style:t}=this.content;const{left:e}=this.host.getBoundingClientRect();const i=getComputedStyle(this.content).width;const s=i?parseFloat(i.replace("px","")):375;const o=30;t.left=`${Math.min(window.innerWidth-e-s-o,0)}px`}if(t){this.raf=requestAnimationFrame(this.reflow.bind(this,t))}}checkContent(){this.hasHeader=!!this.host.querySelectorAll("[slot=header]").length;this.hasContent=!!this.host.querySelectorAll("[slot=item]").length||this.hasHeader}setItemsA11yAttrs(){this.items.forEach(((t,e)=>{const i=e===0?0:-1;if(r(t)){t.htmlTabindex=i}else{t.setAttribute("role","menuitem");t.tabIndex=i}}))}onItemsChange(){this.checkContent();this.items=Array.from(this.host.children).filter((({slot:t})=>t==="item"));this.setItemsA11yAttrs();this.items.forEach((t=>{if(!r(t)){t.dataset.text=t.textContent}}))}moveFocus(t,e){if(r(t)){t.setFocus()}else{t.tabIndex=0;setTimeout((()=>{t.focus()}),100)}if(!e){return}if(r(e)){e.htmlTabindex=-1}else{e.tabIndex=-1}}onLabelKeydown(t){if(t.key===n.ENTER||t.key===n.SPACE){t.preventDefault();t.stopPropagation();this.toggle()}if(!this.verticalContext){return}if(t.key===n.ARROW_RIGHT&&!this.open){t.preventDefault();t.stopPropagation();this.open=true;return}if(t.key===n.ARROW_LEFT&&this.open){t.preventDefault();t.stopPropagation();this.open=false}}async setFocus(){this.htmlTabindex=0;const t=this.hasContent?this.labelButton:this.host.firstElementChild;t.focus()}async focusLastItem(){this.htmlTabindex=0;this.moveFocus(this.items[this.items.length-1])}onOpenChanged(){this.setItemsA11yAttrs();if(!this.open){cancelAnimationFrame(this.raf);this.closed.emit();this.items.forEach((t=>{if(r(t)&&t.open){t.open=false}}));return}this.opened.emit();if(this.floating){this.reflow(true)}}setLabelA11yAttrs(){if(this.hasContent&&!this.labelButton){return}if(this.hasContent){this.labelButton.tabIndex=this.htmlTabindex;return}const t=this.host.firstElementChild;t.role="menuitem";t.tabIndex=this.htmlTabindex}onKeyDown(t){if(!this.hasContent){return}switch(t.key){case n.ESC:t.stopPropagation();t.preventDefault();this.open=false;this.setFocus();break;case n.ARROW_DOWN:{if(this.verticalContext&&document.activeElement===this.host&&!this.open){break}if(document.activeElement===this.host){if(!this.open){this.open=true}t.stopPropagation();t.preventDefault();this.moveFocus(this.items[0]);break}const e=this.items.indexOf(this.focusableItem);const i=this.items[e+1];if(this.verticalContext&&!i){break}t.stopPropagation();t.preventDefault();this.moveFocus(i!==null&&i!==void 0?i:this.items[0],this.focusableItem);break}case n.ARROW_UP:{if(this.verticalContext&&document.activeElement===this.host){break}if(document.activeElement===this.host){if(!this.open){this.open=true}t.stopPropagation();t.preventDefault();this.moveFocus(this.items[this.items.length-1],this.focusableItem);break}t.stopPropagation();t.preventDefault();const e=this.items.indexOf(this.focusableItem);const i=this.items[e-1];if(!i&&this.verticalContext){this.setFocus();break}if(r(i)&&i.open){r(this.focusableItem)?this.focusableItem.htmlTabindex=-1:this.focusableItem.tabIndex=-1;i.focusLastItem();break}this.moveFocus(i!==null&&i!==void 0?i:this.items[this.items.length-1],this.focusableItem);break}}}constructor(i){t(this,i);this.opened=e(this,"opened",7);this.closed=e(this,"closed",7);this.active=undefined;this.floating=true;this.open=false;this.verticalContext=false;this.htmlTabindex=-1;this.hasHeader=undefined;this.hasContent=undefined;this.toggle=this.toggle.bind(this);this.checkContent=this.checkContent.bind(this);this.onLabelSlotChange=this.onLabelSlotChange.bind(this);this.onItemsChange=this.onItemsChange.bind(this);this.onLabelKeydown=this.onLabelKeydown.bind(this)}connectedCallback(){this.onItemsChange();this.setLabelA11yAttrs()}render(){if(!this.hasContent){return i("div",{class:"menu-wrapper"},i("div",{class:"menu-label"},i("div",{class:"menu-label-content"},i("slot",{onSlotchange:this.onLabelSlotChange}))))}return i(s,null,i("div",{class:"menu-wrapper"},i("button",{ref:t=>this.labelButton=t,class:"menu-label","aria-expanded":`${!!this.open}`,"aria-haspopup":`${this.hasContent}`,"aria-label":this.open?"Chiudi menù":"Apri menù",role:"menuitem",tabindex:this.htmlTabindex,onClick:this.toggle,onKeyDown:this.onLabelKeydown},i("div",{class:"menu-label-content"},i("slot",{onSlotchange:this.onLabelSlotChange}),i("z-icon",{name:this.open?"chevron-up":"chevron-down"})))),i("div",{class:"content",ref:t=>this.content=t},this.hasHeader&&i("header",{class:"header"},i("slot",{name:"header",onSlotchange:this.checkContent})),i("div",{class:"items",role:"menu"},i("slot",{name:"item",onSlotchange:this.onItemsChange}))))}get host(){return o(this)}static get watchers(){return{open:["onOpenChanged"],htmlTabindex:["setLabelA11yAttrs"]}}};h.style=l;export{h as z_menu};
2
- //# sourceMappingURL=p-04c39e8a.entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["stylesCss","ZMenuStyle0","isZMenuSection","el","tagName","ZMenu","focusableItem","this","items","find","item","htmlTabindex","tabIndex","toggle","hasContent","open","onLabelSlotChange","ev","labelElement","target","assignedElements","dataset","text","textContent","setLabelA11yAttrs","reflow","live","content","style","left","host","getBoundingClientRect","widthPx","getComputedStyle","width","parseFloat","replace","safeScrollbarSpace","Math","min","window","innerWidth","raf","requestAnimationFrame","bind","checkContent","hasHeader","querySelectorAll","length","setItemsA11yAttrs","forEach","index","tabindex","setAttribute","onItemsChange","Array","from","children","filter","slot","moveFocus","receiver","current","setFocus","setTimeout","focus","onLabelKeydown","key","KeyboardCode","ENTER","SPACE","preventDefault","stopPropagation","verticalContext","ARROW_RIGHT","ARROW_LEFT","label","labelButton","firstElementChild","focusLastItem","onOpenChanged","cancelAnimationFrame","closed","emit","opened","floating","slottedLabel","role","onKeyDown","ESC","ARROW_DOWN","document","activeElement","currentIndex","indexOf","ARROW_UP","constructor","hostRef","connectedCallback","render","h","class","onSlotchange","Host","ref","onClick","name"],"sources":["src/components/z-menu/styles.css?tag=z-menu&encapsulation=shadow","src/components/z-menu/index.tsx"],"sourcesContent":[":host,\n::slotted(*),\n* {\n box-sizing: border-box;\n outline: none;\n}\n\n:host {\n --z-menu-label-color: ;\n\n position: relative;\n display: inline-flex;\n height: fit-content;\n flex-direction: column;\n}\n\n::slotted(a) {\n text-decoration: none;\n}\n\n::slotted(*) {\n color: var(--color-default-text);\n font-family: var(--font-family-sans);\n font-weight: var(--font-rg);\n}\n\n.menu-label {\n position: relative;\n width: 100%;\n padding: 0;\n border: 0;\n margin: 0;\n background: transparent;\n border-radius: 0;\n color: inherit;\n text-align: left;\n}\n\n.menu-wrapper {\n display: flex;\n align-items: center;\n}\n\nbutton.menu-label {\n cursor: pointer;\n}\n\n.menu-label:focus-within {\n box-shadow: var(--shadow-focus-primary);\n}\n\n.menu-label .menu-label-content {\n position: relative;\n display: flex;\n align-items: center;\n border-bottom: var(--border-size-large) solid transparent;\n}\n\n:host(:is([active], [open])) .menu-label-content,\n.menu-label:focus-within .menu-label-content {\n color: var(--color-primary01);\n font-weight: var(--font-bd);\n}\n\n:host(:is([active], [open])) .menu-label-content ::slotted(*),\n.menu-label:focus-within .menu-label-content ::slotted(*),\n.menu-label:focus-within .menu-label-content z-icon {\n color: var(--color-primary01);\n letter-spacing: normal;\n}\n\n:host([vertical-context]) .menu-label-content {\n padding: var(--space-unit) 0;\n border-width: var(--border-size-small);\n border-color: var(--color-surface03);\n}\n\n:host([vertical-context]) .menu-label-content ::slotted(*) {\n padding: 0;\n}\n\n:host(:is([active], [open])) .menu-label .menu-label-content,\n.menu-label .menu-label-content:hover,\n.menu-label:focus-within .menu-label-content {\n border-color: var(--color-secondary01);\n}\n\n:host([vertical-context]:is([active], [open])) .menu-label .menu-label-content::after,\n:host([vertical-context]) .menu-label:hover::after,\n:host([vertical-context]) .menu-label:focus-within .menu-label-content::after {\n position: absolute;\n bottom: 0;\n left: 0;\n width: 100%;\n height: var(--border-size-large);\n background-color: var(--color-secondary01);\n content: \"\";\n}\n\n/* Prevents layout shifts on font-weight changes.\nThe trick is to put an hidden copy of the text already set to bold,\nso the needed space is correctly calculated before any hover/active state changes the\nfont-weight of the real text.\nThe hidden text has an height of 0px so it can expand the width without changing the height\nwhen placed below the real text using `flex-direction: column`. */\n::slotted([data-text]:not([slot]))::after {\n height: 0;\n content: attr(data-text);\n content: attr(data-text) / \"\";\n font-weight: var(--font-bd);\n letter-spacing: normal;\n pointer-events: none;\n user-select: none;\n visibility: hidden;\n}\n\n@media speech {\n ::slotted([data-text]:not([slot]))::after {\n display: none;\n }\n}\n\n::slotted([data-text]:not([slot])) {\n display: inline-flex;\n flex-direction: column;\n}\n\n.menu-label .menu-label-content ::slotted(*) {\n display: inline-flex;\n width: 100%;\n min-width: fit-content;\n padding-bottom: 2px;\n margin: 0;\n appearance: none;\n color: var(--z-menu-label-color, var(--color-default-text));\n font-family: var(--font-family-sans);\n font-size: var(--font-size-3);\n font-weight: inherit;\n line-height: 1.5;\n}\n\n.menu-label .menu-label-content z-icon {\n margin-left: calc(var(--space-unit) * 1.5);\n fill: currentcolor;\n}\n\n.content {\n background: var(--color-surface01);\n}\n\n:host(:not([open])) .content {\n display: none;\n}\n\n:host([floating]:not([vertical-context])) .content {\n position: absolute;\n top: 100%;\n left: 0;\n width: 375px;\n min-width: 100%;\n max-width: 100vw;\n padding: 0 calc(var(--space-unit) * 2);\n box-shadow: var(--shadow-2);\n}\n\n:host(:not([floating])) .content {\n width: 100%;\n}\n\n.header {\n display: flex;\n align-items: center;\n padding: var(--space-unit) 0 calc(var(--space-unit) * 2);\n}\n\n.header ::slotted(img[slot=\"header\"]) {\n width: calc(var(--space-unit) * 11.25);\n height: auto;\n object-fit: contain;\n}\n\n.header ::slotted([slot=\"header\"]:not(:first-child)) {\n margin: auto 0;\n margin-left: calc(var(--space-unit) * 2.5);\n font-size: var(--font-size-3);\n font-weight: var(--font-sb);\n line-height: 1.5;\n}\n\n.items {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n background: inherit;\n}\n\n.items > ::slotted([slot=\"item\"]) {\n width: 100%;\n margin: 0;\n font-size: var(--font-size-3);\n line-height: 1.5;\n}\n\n.items > ::slotted([slot=\"item\"]:focus:focus-visible) {\n box-shadow: var(--shadow-focus-primary);\n}\n\n.items > ::slotted([slot=\"item\"]:not(z-menu-section)) {\n padding: var(--space-unit) 0;\n border-bottom: var(--border-size-small) solid var(--color-surface03);\n}\n\n:host(:not([vertical-context])) .items > ::slotted([slot=\"item\"]:not(z-menu-section):last-of-type) {\n border-bottom: 0;\n}\n\n.items > ::slotted([slot=\"item\"]:hover),\n.items > ::slotted([slot=\"item\"]:focus:focus-visible),\n.items > ::slotted([slot=\"item\"]:active) {\n border-color: var(--color-secondary01);\n font-weight: var(--font-bd);\n}\n","import {Component, Element, Event, EventEmitter, Host, Listen, Method, Prop, State, Watch, h} from \"@stencil/core\";\nimport {KeyboardCode} from \"../../beans\";\n\nconst isZMenuSection = (el: HTMLElement | HTMLZMenuSectionElement): el is HTMLZMenuSectionElement =>\n el?.tagName === \"Z-MENU-SECTION\";\n\n/**\n * @slot - Menu label\n * @slot header - Header to display as the first entry of the open menu.\n * @slot item - Single entry of the section. Can be slotted multiple times to insert items onto the menu. Set the `active` HTML attribute on the element to highlight it. Use `z-menu-section` for submenus.\n * @cssprop --z-menu-label-color - Color of the label's text.\n */\n@Component({\n tag: \"z-menu\",\n styleUrl: \"styles.css\",\n shadow: true,\n})\nexport class ZMenu {\n @Element() host: HTMLZMenuElement;\n\n /** Flag to set the active status of the menu. */\n @Prop({reflect: true})\n active?: boolean;\n\n /**\n * Flag to set the display mode of the list.\n * If true, the list will be absolutely positioned under the menu label,\n * stacked beneath it otherwise.\n */\n @Prop({reflect: true})\n floating? = true;\n\n /** The opening state of the menu. */\n @Prop({mutable: true, reflect: true})\n open = false;\n\n /**\n * Tells the component that it's placed in a vertical context with other `ZMenu`s (usually in the ZAppHeader's offcanvas).\n * A small border is placed under it as a separator from other elements.\n */\n @Prop({reflect: true})\n verticalContext = false;\n\n /**\n * Tabindex value to set on the menu label.\n * Useful to manage keyboard navigation focus with roving tabindex handled by this component's parent (usually ZAppHeader).\n */\n @Prop()\n htmlTabindex = -1;\n\n @State()\n hasHeader: boolean;\n\n @State()\n hasContent: boolean;\n\n /** The menu has been opened. */\n @Event()\n opened: EventEmitter;\n\n /** The menu has been closed. */\n @Event()\n closed: EventEmitter;\n\n private labelButton: HTMLButtonElement;\n\n private content: HTMLElement;\n\n private items: (HTMLElement | HTMLZMenuSectionElement)[];\n\n /** Animation frame request id. */\n private raf: number;\n\n private get focusableItem(): HTMLZMenuSectionElement | HTMLElement | null {\n return this.items.find((item) => (isZMenuSection(item) ? item.htmlTabindex === 0 : item.tabIndex === 0));\n }\n\n private toggle(): void {\n if (!this.hasContent) {\n return;\n }\n\n this.open = !this.open;\n }\n\n /**\n * Sets slotted item text as `data-text` attribute value, to let CSS use it through `attr()`.\n * @param ev Slotchange event\n */\n private onLabelSlotChange(ev: Event): void {\n const labelElement = (ev.target as HTMLSlotElement).assignedElements()[0] as HTMLElement;\n labelElement.dataset.text = labelElement?.textContent;\n this.setLabelA11yAttrs();\n }\n\n /**\n * Correctly set position of the floating menu in order to prevent overflow.\n * @param live Should run the method on every refresh frame.\n */\n private reflow(live = false): void {\n if (this.content && this.hasContent) {\n const {style} = this.content;\n const {left} = this.host.getBoundingClientRect();\n const widthPx = getComputedStyle(this.content).width;\n const width = widthPx ? parseFloat(widthPx.replace(\"px\", \"\")) : 375;\n const safeScrollbarSpace = 30;\n style.left = `${Math.min(window.innerWidth - left - width - safeScrollbarSpace, 0)}px`;\n }\n if (live) {\n this.raf = requestAnimationFrame(this.reflow.bind(this, live));\n }\n }\n\n /**\n * Check if some content slot is set.\n */\n private checkContent(): void {\n this.hasHeader = !!this.host.querySelectorAll(\"[slot=header]\").length;\n this.hasContent = !!this.host.querySelectorAll(\"[slot=item]\").length || this.hasHeader;\n }\n\n /**\n * Set `menuitem` role to all menu items (ZMenuSection items already have it).\n * Set -1 to the tabindex of the items and 0 to the first one.\n */\n private setItemsA11yAttrs(): void {\n this.items.forEach((item, index) => {\n const tabindex = index === 0 ? 0 : -1;\n if (isZMenuSection(item)) {\n item.htmlTabindex = tabindex;\n } else {\n item.setAttribute(\"role\", \"menuitem\");\n item.tabIndex = tabindex;\n }\n });\n }\n\n private onItemsChange(): void {\n this.checkContent();\n this.items = Array.from(this.host.children).filter(({slot}) => slot === \"item\") as HTMLElement[];\n this.setItemsA11yAttrs();\n this.items.forEach((item) => {\n if (!isZMenuSection(item)) {\n item.dataset.text = item.textContent;\n }\n });\n }\n\n /**\n * Move focus and adjust the tabindex value of `receiver` and `current` elements,\n * setting -1 to the `current` and 0 to the `receiver`, then focus the `receiver` element.\n * If the receiver is a ZMenuSection and it's open, focus its first focusable item.\n */\n private moveFocus(\n receiver: HTMLElement | HTMLZMenuSectionElement,\n current?: HTMLElement | HTMLZMenuSectionElement\n ): void {\n if (isZMenuSection(receiver)) {\n receiver.setFocus();\n } else {\n receiver.tabIndex = 0;\n setTimeout(() => {\n receiver.focus();\n }, 100);\n }\n if (!current) {\n return;\n }\n\n if (isZMenuSection(current)) {\n current.htmlTabindex = -1;\n } else {\n current.tabIndex = -1;\n }\n }\n\n private onLabelKeydown(ev: KeyboardEvent): void {\n if (ev.key === KeyboardCode.ENTER || ev.key === KeyboardCode.SPACE) {\n ev.preventDefault();\n ev.stopPropagation();\n this.toggle();\n }\n\n if (!this.verticalContext) {\n return;\n }\n\n if (ev.key === KeyboardCode.ARROW_RIGHT && !this.open) {\n ev.preventDefault();\n ev.stopPropagation();\n this.open = true;\n\n return;\n }\n\n if (ev.key === KeyboardCode.ARROW_LEFT && this.open) {\n ev.preventDefault();\n ev.stopPropagation();\n this.open = false;\n }\n }\n\n /** Set tabindex of the label to 0, then focus it. */\n @Method()\n async setFocus(): Promise<void> {\n this.htmlTabindex = 0;\n const label = this.hasContent ? this.labelButton : (this.host.firstElementChild as HTMLElement);\n label.focus();\n }\n\n /** Focus the last item. */\n @Method()\n async focusLastItem(): Promise<void> {\n this.htmlTabindex = 0;\n this.moveFocus(this.items[this.items.length - 1]);\n }\n\n @Watch(\"open\")\n onOpenChanged(): void {\n this.setItemsA11yAttrs();\n if (!this.open) {\n cancelAnimationFrame(this.raf);\n this.closed.emit();\n this.items.forEach((item) => {\n if (isZMenuSection(item) && item.open) {\n item.open = false;\n }\n });\n\n return;\n }\n\n this.opened.emit();\n if (this.floating) {\n this.reflow(true);\n }\n }\n\n @Watch(\"htmlTabindex\")\n setLabelA11yAttrs(): void {\n if (this.hasContent && !this.labelButton) {\n return;\n }\n\n if (this.hasContent) {\n this.labelButton.tabIndex = this.htmlTabindex;\n\n return;\n }\n\n const slottedLabel = this.host.firstElementChild as HTMLElement;\n slottedLabel.role = \"menuitem\";\n slottedLabel.tabIndex = this.htmlTabindex;\n }\n\n @Listen(\"keydown\")\n onKeyDown(ev: KeyboardEvent): void {\n if (!this.hasContent) {\n return;\n }\n\n switch (ev.key) {\n case KeyboardCode.ESC:\n ev.stopPropagation();\n ev.preventDefault();\n this.open = false;\n this.setFocus();\n break;\n case KeyboardCode.ARROW_DOWN: {\n if (this.verticalContext && document.activeElement === this.host && !this.open) {\n break;\n }\n\n if (document.activeElement === this.host) {\n if (!this.open) {\n this.open = true;\n }\n ev.stopPropagation();\n ev.preventDefault();\n this.moveFocus(this.items[0]);\n break;\n }\n\n const currentIndex = this.items.indexOf(this.focusableItem);\n const receiver = this.items[currentIndex + 1];\n if (this.verticalContext && !receiver) {\n break;\n }\n\n ev.stopPropagation();\n ev.preventDefault();\n // if the last item is already focused, navigate to the first one\n this.moveFocus(receiver ?? this.items[0], this.focusableItem);\n break;\n }\n case KeyboardCode.ARROW_UP: {\n if (this.verticalContext && document.activeElement === this.host) {\n break;\n }\n\n if (document.activeElement === this.host) {\n // open the menu and focus the last item\n if (!this.open) {\n this.open = true;\n }\n ev.stopPropagation();\n ev.preventDefault();\n this.moveFocus(this.items[this.items.length - 1], this.focusableItem);\n break;\n }\n\n ev.stopPropagation();\n ev.preventDefault();\n const currentIndex = this.items.indexOf(this.focusableItem);\n const receiver = this.items[currentIndex - 1];\n if (!receiver && this.verticalContext) {\n this.setFocus();\n break;\n }\n\n if (isZMenuSection(receiver) && receiver.open) {\n isZMenuSection(this.focusableItem)\n ? (this.focusableItem.htmlTabindex = -1)\n : (this.focusableItem.tabIndex = -1);\n receiver.focusLastItem();\n break;\n }\n\n // if the first item is already focused, navigate to the last one\n this.moveFocus(receiver ?? this.items[this.items.length - 1], this.focusableItem);\n break;\n }\n }\n }\n\n constructor() {\n this.toggle = this.toggle.bind(this);\n this.checkContent = this.checkContent.bind(this);\n this.onLabelSlotChange = this.onLabelSlotChange.bind(this);\n this.onItemsChange = this.onItemsChange.bind(this);\n this.onLabelKeydown = this.onLabelKeydown.bind(this);\n }\n\n connectedCallback(): void {\n this.onItemsChange();\n this.setLabelA11yAttrs();\n }\n\n render(): HTMLDivElement | HTMLZMenuElement {\n if (!this.hasContent) {\n return (\n <div class=\"menu-wrapper\">\n <div class=\"menu-label\">\n <div class=\"menu-label-content\">\n <slot onSlotchange={this.onLabelSlotChange} />\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <Host>\n <div class=\"menu-wrapper\">\n <button\n ref={(el) => (this.labelButton = el)}\n class=\"menu-label\"\n aria-expanded={`${!!this.open}`}\n aria-haspopup={`${this.hasContent}`}\n aria-label={this.open ? \"Chiudi menù\" : \"Apri menù\"}\n role=\"menuitem\"\n tabindex={this.htmlTabindex}\n onClick={this.toggle}\n onKeyDown={this.onLabelKeydown}\n >\n <div class=\"menu-label-content\">\n <slot onSlotchange={this.onLabelSlotChange} />\n <z-icon name={this.open ? \"chevron-up\" : \"chevron-down\"} />\n </div>\n </button>\n </div>\n\n <div\n class=\"content\"\n ref={(el) => (this.content = el)}\n >\n {this.hasHeader && (\n <header class=\"header\">\n <slot\n name=\"header\"\n onSlotchange={this.checkContent}\n />\n </header>\n )}\n\n <div\n class=\"items\"\n role=\"menu\"\n >\n <slot\n name=\"item\"\n onSlotchange={this.onItemsChange}\n />\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"oGAAA,MAAMA,EAAY,w6HAClB,MAAAC,EAAeD,ECEf,MAAME,EAAkBC,IACtBA,IAAE,MAAFA,SAAE,SAAFA,EAAIC,WAAY,iB,MAaLC,EAAK,MAwDhB,iBAAYC,GACV,OAAOC,KAAKC,MAAMC,MAAMC,GAAUR,EAAeQ,GAAQA,EAAKC,eAAiB,EAAID,EAAKE,WAAa,G,CAG/F,MAAAC,GACN,IAAKN,KAAKO,WAAY,CACpB,M,CAGFP,KAAKQ,MAAQR,KAAKQ,I,CAOZ,iBAAAC,CAAkBC,GACxB,MAAMC,EAAgBD,EAAGE,OAA2BC,mBAAmB,GACvEF,EAAaG,QAAQC,KAAOJ,IAAY,MAAZA,SAAY,SAAZA,EAAcK,YAC1ChB,KAAKiB,mB,CAOC,MAAAC,CAAOC,EAAO,OACpB,GAAInB,KAAKoB,SAAWpB,KAAKO,WAAY,CACnC,MAAMc,MAACA,GAASrB,KAAKoB,QACrB,MAAME,KAACA,GAAQtB,KAAKuB,KAAKC,wBACzB,MAAMC,EAAUC,iBAAiB1B,KAAKoB,SAASO,MAC/C,MAAMA,EAAQF,EAAUG,WAAWH,EAAQI,QAAQ,KAAM,KAAO,IAChE,MAAMC,EAAqB,GAC3BT,EAAMC,KAAO,GAAGS,KAAKC,IAAIC,OAAOC,WAAaZ,EAAOK,EAAQG,EAAoB,M,CAElF,GAAIX,EAAM,CACRnB,KAAKmC,IAAMC,sBAAsBpC,KAAKkB,OAAOmB,KAAKrC,KAAMmB,G,EAOpD,YAAAmB,GACNtC,KAAKuC,YAAcvC,KAAKuB,KAAKiB,iBAAiB,iBAAiBC,OAC/DzC,KAAKO,aAAeP,KAAKuB,KAAKiB,iBAAiB,eAAeC,QAAUzC,KAAKuC,S,CAOvE,iBAAAG,GACN1C,KAAKC,MAAM0C,SAAQ,CAACxC,EAAMyC,KACxB,MAAMC,EAAWD,IAAU,EAAI,GAAK,EACpC,GAAIjD,EAAeQ,GAAO,CACxBA,EAAKC,aAAeyC,C,KACf,CACL1C,EAAK2C,aAAa,OAAQ,YAC1B3C,EAAKE,SAAWwC,C,KAKd,aAAAE,GACN/C,KAAKsC,eACLtC,KAAKC,MAAQ+C,MAAMC,KAAKjD,KAAKuB,KAAK2B,UAAUC,QAAO,EAAEC,UAAUA,IAAS,SACxEpD,KAAK0C,oBACL1C,KAAKC,MAAM0C,SAASxC,IAClB,IAAKR,EAAeQ,GAAO,CACzBA,EAAKW,QAAQC,KAAOZ,EAAKa,W,KAUvB,SAAAqC,CACNC,EACAC,GAEA,GAAI5D,EAAe2D,GAAW,CAC5BA,EAASE,U,KACJ,CACLF,EAASjD,SAAW,EACpBoD,YAAW,KACTH,EAASI,OAAO,GACf,I,CAEL,IAAKH,EAAS,CACZ,M,CAGF,GAAI5D,EAAe4D,GAAU,CAC3BA,EAAQnD,cAAgB,C,KACnB,CACLmD,EAAQlD,UAAY,C,EAIhB,cAAAsD,CAAejD,GACrB,GAAIA,EAAGkD,MAAQC,EAAaC,OAASpD,EAAGkD,MAAQC,EAAaE,MAAO,CAClErD,EAAGsD,iBACHtD,EAAGuD,kBACHjE,KAAKM,Q,CAGP,IAAKN,KAAKkE,gBAAiB,CACzB,M,CAGF,GAAIxD,EAAGkD,MAAQC,EAAaM,cAAgBnE,KAAKQ,KAAM,CACrDE,EAAGsD,iBACHtD,EAAGuD,kBACHjE,KAAKQ,KAAO,KAEZ,M,CAGF,GAAIE,EAAGkD,MAAQC,EAAaO,YAAcpE,KAAKQ,KAAM,CACnDE,EAAGsD,iBACHtD,EAAGuD,kBACHjE,KAAKQ,KAAO,K,EAMhB,cAAMgD,GACJxD,KAAKI,aAAe,EACpB,MAAMiE,EAAQrE,KAAKO,WAAaP,KAAKsE,YAAetE,KAAKuB,KAAKgD,kBAC9DF,EAAMX,O,CAKR,mBAAMc,GACJxE,KAAKI,aAAe,EACpBJ,KAAKqD,UAAUrD,KAAKC,MAAMD,KAAKC,MAAMwC,OAAS,G,CAIhD,aAAAgC,GACEzE,KAAK0C,oBACL,IAAK1C,KAAKQ,KAAM,CACdkE,qBAAqB1E,KAAKmC,KAC1BnC,KAAK2E,OAAOC,OACZ5E,KAAKC,MAAM0C,SAASxC,IAClB,GAAIR,EAAeQ,IAASA,EAAKK,KAAM,CACrCL,EAAKK,KAAO,K,KAIhB,M,CAGFR,KAAK6E,OAAOD,OACZ,GAAI5E,KAAK8E,SAAU,CACjB9E,KAAKkB,OAAO,K,EAKhB,iBAAAD,GACE,GAAIjB,KAAKO,aAAeP,KAAKsE,YAAa,CACxC,M,CAGF,GAAItE,KAAKO,WAAY,CACnBP,KAAKsE,YAAYjE,SAAWL,KAAKI,aAEjC,M,CAGF,MAAM2E,EAAe/E,KAAKuB,KAAKgD,kBAC/BQ,EAAaC,KAAO,WACpBD,EAAa1E,SAAWL,KAAKI,Y,CAI/B,SAAA6E,CAAUvE,GACR,IAAKV,KAAKO,WAAY,CACpB,M,CAGF,OAAQG,EAAGkD,KACT,KAAKC,EAAaqB,IAChBxE,EAAGuD,kBACHvD,EAAGsD,iBACHhE,KAAKQ,KAAO,MACZR,KAAKwD,WACL,MACF,KAAKK,EAAasB,WAAY,CAC5B,GAAInF,KAAKkE,iBAAmBkB,SAASC,gBAAkBrF,KAAKuB,OAASvB,KAAKQ,KAAM,CAC9E,K,CAGF,GAAI4E,SAASC,gBAAkBrF,KAAKuB,KAAM,CACxC,IAAKvB,KAAKQ,KAAM,CACdR,KAAKQ,KAAO,I,CAEdE,EAAGuD,kBACHvD,EAAGsD,iBACHhE,KAAKqD,UAAUrD,KAAKC,MAAM,IAC1B,K,CAGF,MAAMqF,EAAetF,KAAKC,MAAMsF,QAAQvF,KAAKD,eAC7C,MAAMuD,EAAWtD,KAAKC,MAAMqF,EAAe,GAC3C,GAAItF,KAAKkE,kBAAoBZ,EAAU,CACrC,K,CAGF5C,EAAGuD,kBACHvD,EAAGsD,iBAEHhE,KAAKqD,UAAUC,IAAQ,MAARA,SAAQ,EAARA,EAAYtD,KAAKC,MAAM,GAAID,KAAKD,eAC/C,K,CAEF,KAAK8D,EAAa2B,SAAU,CAC1B,GAAIxF,KAAKkE,iBAAmBkB,SAASC,gBAAkBrF,KAAKuB,KAAM,CAChE,K,CAGF,GAAI6D,SAASC,gBAAkBrF,KAAKuB,KAAM,CAExC,IAAKvB,KAAKQ,KAAM,CACdR,KAAKQ,KAAO,I,CAEdE,EAAGuD,kBACHvD,EAAGsD,iBACHhE,KAAKqD,UAAUrD,KAAKC,MAAMD,KAAKC,MAAMwC,OAAS,GAAIzC,KAAKD,eACvD,K,CAGFW,EAAGuD,kBACHvD,EAAGsD,iBACH,MAAMsB,EAAetF,KAAKC,MAAMsF,QAAQvF,KAAKD,eAC7C,MAAMuD,EAAWtD,KAAKC,MAAMqF,EAAe,GAC3C,IAAKhC,GAAYtD,KAAKkE,gBAAiB,CACrClE,KAAKwD,WACL,K,CAGF,GAAI7D,EAAe2D,IAAaA,EAAS9C,KAAM,CAC7Cb,EAAeK,KAAKD,eACfC,KAAKD,cAAcK,cAAgB,EACnCJ,KAAKD,cAAcM,UAAY,EACpCiD,EAASkB,gBACT,K,CAIFxE,KAAKqD,UAAUC,IAAQ,MAARA,SAAQ,EAARA,EAAYtD,KAAKC,MAAMD,KAAKC,MAAMwC,OAAS,GAAIzC,KAAKD,eACnE,K,GAKN,WAAA0F,CAAAC,G,4GAjTY,K,UAIL,M,qBAOW,M,mBAOF,E,mDAgSd1F,KAAKM,OAASN,KAAKM,OAAO+B,KAAKrC,MAC/BA,KAAKsC,aAAetC,KAAKsC,aAAaD,KAAKrC,MAC3CA,KAAKS,kBAAoBT,KAAKS,kBAAkB4B,KAAKrC,MACrDA,KAAK+C,cAAgB/C,KAAK+C,cAAcV,KAAKrC,MAC7CA,KAAK2D,eAAiB3D,KAAK2D,eAAetB,KAAKrC,K,CAGjD,iBAAA2F,GACE3F,KAAK+C,gBACL/C,KAAKiB,mB,CAGP,MAAA2E,GACE,IAAK5F,KAAKO,WAAY,CACpB,OACEsF,EAAA,OAAKC,MAAM,gBACTD,EAAA,OAAKC,MAAM,cACTD,EAAA,OAAKC,MAAM,sBACTD,EAAA,QAAME,aAAc/F,KAAKS,sB,CAOnC,OACEoF,EAACG,EAAI,KACHH,EAAA,OAAKC,MAAM,gBACTD,EAAA,UACEI,IAAMrG,GAAQI,KAAKsE,YAAc1E,EACjCkG,MAAM,aAAY,gBACH,KAAK9F,KAAKQ,OAAM,gBAChB,GAAGR,KAAKO,aAAY,aACvBP,KAAKQ,KAAO,cAAgB,YACxCwE,KAAK,WACLnC,SAAU7C,KAAKI,aACf8F,QAASlG,KAAKM,OACd2E,UAAWjF,KAAK2D,gBAEhBkC,EAAA,OAAKC,MAAM,sBACTD,EAAA,QAAME,aAAc/F,KAAKS,oBACzBoF,EAAA,UAAQM,KAAMnG,KAAKQ,KAAO,aAAe,oBAK/CqF,EAAA,OACEC,MAAM,UACNG,IAAMrG,GAAQI,KAAKoB,QAAUxB,GAE5BI,KAAKuC,WACJsD,EAAA,UAAQC,MAAM,UACZD,EAAA,QACEM,KAAK,SACLJ,aAAc/F,KAAKsC,gBAKzBuD,EAAA,OACEC,MAAM,QACNd,KAAK,QAELa,EAAA,QACEM,KAAK,OACLJ,aAAc/F,KAAK+C,kB","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import{r as t,c as e,h as s,a as i,g as o}from"./p-75c4a726.js";import{g as a}from"./p-6037cdf3.js";const n=':host{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;padding:0;font-family:var(--font-family-sans)}:host,::slotted(*),*{box-sizing:border-box}::slotted(a){text-decoration:none}::slotted(*){color:var(--color-default-text);font-family:var(--font-family-sans);font-weight:var(--font-rg)}.label{display:flex;width:100%;align-items:center;padding:var(--space-unit) 0;border:0;border-bottom:var(--border-size-small) solid var(--color-surface03);margin:0;background:transparent;border-radius:0;cursor:pointer;text-align:left}:host(:is([active],[open])) .label,.label:focus:focus-visible,.label:hover{border-color:var(--color-secondary01)}.label:focus:focus-visible{box-shadow:var(--shadow-focus-primary);outline:none}:host(:is([active],[open])) .label ::slotted(*),.label:focus:focus-visible ::slotted(*),.label:hover ::slotted(*){font-weight:var(--font-bd)}::slotted([data-text]){display:inline-flex;flex-direction:column}::slotted([data-text])::after{overflow:hidden;height:0;content:attr(data-text);content:attr(data-text) / "";font-weight:var(--font-bd);pointer-events:none;user-select:none;visibility:hidden}@media speech{::slotted([data-text])::after{display:none}}.label ::slotted(*){width:100%;margin:0;font-size:var(--font-size-3);line-height:1.5}.label z-icon{margin-left:calc(var(--space-unit) * 4);fill:var(--color-default-icon)}.items{display:flex;width:100%;flex-direction:column;padding:calc(var(--space-unit) / 2);padding-bottom:calc(var(--space-unit) * 1.5)}::slotted([slot="section"]){display:inline-flex;padding:calc(var(--space-unit) / 2);margin:0;font-size:var(--font-size-1);line-height:1.333;outline:none}::slotted([slot="section"]:last-of-type){border:none}::slotted([slot="section"]:focus:focus-visible){box-shadow:var(--shadow-focus-primary);color:var(--color-secondary01)}::slotted([slot="section"]:hover),::slotted([slot="section"]:focus:focus-visible),::slotted([slot="section"][active]){color:var(--color-secondary01);font-weight:var(--font-bd)}';const l=n;const h=class{get focusableItem(){return this.items.find((({tabIndex:t})=>t===0))}toggle(){if(!this.hasItems){return}this.open=!this.open;this.setFocus()}setItemsA11yAttrs(){if(!this.hasItems){return}this.items.forEach(((t,e)=>{t.setAttribute("role","menuitem");t.setAttribute("tabindex",e===0?"0":"-1")}))}onItemsChange(){this.items=Array.from(this.host.querySelectorAll('[slot="section"]'));this.hasItems=this.items.length>0;this.setItemsA11yAttrs()}onLabelSlotChange(t){const e=t.target.assignedElements()[0];e.dataset.text=e===null||e===void 0?void 0:e.textContent}onLabelKeydown(t){if(t.key===a.ENTER||t.key===a.SPACE){t.preventDefault();t.stopPropagation();this.toggle()}}moveFocus(t,e){t.tabIndex=0;setTimeout((()=>{t.focus()}),100);if(e){e.tabIndex=-1}}async setFocus(){this.htmlTabindex=0;setTimeout((()=>{this.label.focus()}),100)}async focusLastItem(){this.htmlTabindex=0;this.moveFocus(this.items[this.items.length-1])}onOpenChange(){if(!this.open){this.closed.emit();this.setItemsA11yAttrs()}else{this.opened.emit()}}onTabindexChange(){this.label.tabIndex=this.htmlTabindex}onItemsKeydown(t){switch(t.key){case a.ESC:case a.ARROW_LEFT:if(!this.open){break}t.preventDefault();t.stopPropagation();this.label.focus();this.open=false;break;case a.ARROW_RIGHT:if(this.open){break}t.preventDefault();t.stopPropagation();this.open=true;break;case a.ARROW_DOWN:{if(!this.open){break}if(document.activeElement===this.host){t.preventDefault();t.stopPropagation();this.moveFocus(this.items[0]);break}const e=this.items.indexOf(this.focusableItem);const s=this.items[e+1];if(s){t.preventDefault();t.stopPropagation();this.moveFocus(s,this.focusableItem)}break}case a.ARROW_UP:{if(!this.open||document.activeElement===this.host){break}const e=this.items.indexOf(this.focusableItem);const s=this.items[e-1];t.preventDefault();t.stopPropagation();if(s){this.moveFocus(s,this.focusableItem)}else{this.setFocus()}break}}}constructor(s){t(this,s);this.opened=e(this,"opened",7);this.closed=e(this,"closed",7);this.active=undefined;this.htmlTabindex=-1;this.open=undefined;this.hasItems=undefined;this.items=undefined;this.toggle=this.toggle.bind(this);this.onItemsChange=this.onItemsChange.bind(this);this.onLabelSlotChange=this.onLabelSlotChange.bind(this);this.onLabelKeydown=this.onLabelKeydown.bind(this);this.onItemsKeydown=this.onItemsKeydown.bind(this)}connectedCallback(){this.onItemsChange()}render(){return s(i,{key:"387e43b42ac8233f88d329a592bef924ebcf9ee9",open:this.open},s("button",{key:"d6014cdeb9a6ff2b4e95c43db7d2bae2b4d1c811",ref:t=>this.label=t,class:"label","aria-haspopup":`${this.hasItems}`,"aria-expanded":`${!!this.open}`,role:"menuitem",tabindex:this.htmlTabindex,onClick:this.toggle,onKeyDown:this.onLabelKeydown},s("slot",{key:"d0065cf62f83d83df43b5c2413d3e13b23a1bb6a",onSlotchange:this.onLabelSlotChange}),this.hasItems&&s("z-icon",{key:"e6adc51de79f1fbcb76b025cd6226388ff4d90f0",name:this.open?"chevron-up":"chevron-down"})),this.open&&s("div",{key:"151f31f24ec306ce4cb45b70b8ae5a6023fd063d",class:"items",role:"menu"},s("slot",{key:"d4d67539788121360de0e4dabf51ba22086c1345",name:"section",onSlotchange:this.onItemsChange})))}get host(){return o(this)}static get watchers(){return{open:["onOpenChange"],htmlTabindex:["onTabindexChange"]}}};h.style=l;export{h as z_menu_section};
2
- //# sourceMappingURL=p-0542a3c9.entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["stylesCss","ZMenuSectionStyle0","ZMenuSection","focusableItem","this","items","find","tabIndex","toggle","hasItems","open","setFocus","setItemsA11yAttrs","forEach","item","index","setAttribute","onItemsChange","Array","from","host","querySelectorAll","length","onLabelSlotChange","ev","labelElement","target","assignedElements","dataset","text","textContent","onLabelKeydown","key","KeyboardCode","ENTER","SPACE","preventDefault","stopPropagation","moveFocus","receiver","current","setTimeout","focus","htmlTabindex","label","focusLastItem","onOpenChange","closed","emit","opened","onTabindexChange","onItemsKeydown","ESC","ARROW_LEFT","ARROW_RIGHT","ARROW_DOWN","document","activeElement","currentIndex","indexOf","ARROW_UP","constructor","hostRef","bind","connectedCallback","render","h","Host","ref","el","class","role","tabindex","onClick","onKeyDown","onSlotchange","name"],"sources":["src/components/z-menu-section/styles.css?tag=z-menu-section&encapsulation=shadow","src/components/z-menu-section/index.tsx"],"sourcesContent":[":host {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n padding: 0;\n font-family: var(--font-family-sans);\n}\n\n:host,\n::slotted(*),\n* {\n box-sizing: border-box;\n}\n\n::slotted(a) {\n text-decoration: none;\n}\n\n::slotted(*) {\n color: var(--color-default-text);\n font-family: var(--font-family-sans);\n font-weight: var(--font-rg);\n}\n\n.label {\n display: flex;\n width: 100%;\n align-items: center;\n padding: var(--space-unit) 0;\n border: 0;\n border-bottom: var(--border-size-small) solid var(--color-surface03);\n margin: 0;\n background: transparent;\n border-radius: 0;\n cursor: pointer;\n text-align: left;\n}\n\n:host(:is([active], [open])) .label,\n.label:focus:focus-visible,\n.label:hover {\n border-color: var(--color-secondary01);\n}\n\n.label:focus:focus-visible {\n box-shadow: var(--shadow-focus-primary);\n outline: none;\n}\n\n:host(:is([active], [open])) .label ::slotted(*),\n.label:focus:focus-visible ::slotted(*),\n.label:hover ::slotted(*) {\n font-weight: var(--font-bd);\n}\n\n::slotted([data-text]) {\n display: inline-flex;\n flex-direction: column;\n}\n\n/* Trick to prevent layout shifts on font-weight changes.\nThe trick is to put an hidden copy of the text already set to bold,\nso the needed space is correctly calculated before any hover/active state changes the\nfont-weight of the real text.\nThe hidden text has an height of 0px so it can expand the width without changing the height\nwhen placed below the real text using `flex-direction: column`. */\n::slotted([data-text])::after {\n overflow: hidden;\n height: 0;\n content: attr(data-text);\n content: attr(data-text) / \"\";\n font-weight: var(--font-bd);\n pointer-events: none;\n user-select: none;\n visibility: hidden;\n}\n\n@media speech {\n ::slotted([data-text])::after {\n display: none;\n }\n}\n\n.label ::slotted(*) {\n width: 100%;\n margin: 0;\n font-size: var(--font-size-3);\n line-height: 1.5;\n}\n\n.label z-icon {\n margin-left: calc(var(--space-unit) * 4);\n fill: var(--color-default-icon);\n}\n\n.items {\n display: flex;\n width: 100%;\n flex-direction: column;\n padding: calc(var(--space-unit) / 2);\n padding-bottom: calc(var(--space-unit) * 1.5);\n}\n\n::slotted([slot=\"section\"]) {\n display: inline-flex;\n padding: calc(var(--space-unit) / 2);\n margin: 0;\n font-size: var(--font-size-1);\n line-height: 1.333;\n outline: none;\n}\n\n::slotted([slot=\"section\"]:last-of-type) {\n border: none;\n}\n\n::slotted([slot=\"section\"]:focus:focus-visible) {\n box-shadow: var(--shadow-focus-primary);\n color: var(--color-secondary01);\n}\n\n::slotted([slot=\"section\"]:hover),\n::slotted([slot=\"section\"]:focus:focus-visible),\n::slotted([slot=\"section\"][active]) {\n color: var(--color-secondary01);\n font-weight: var(--font-bd);\n}\n","import {Component, Element, Event, EventEmitter, Host, Listen, Method, Prop, State, Watch, h} from \"@stencil/core\";\nimport {KeyboardCode} from \"../../beans\";\n\n/**\n * A component to create submenus inside the ZMenu.\n * @slot - Label of the menu section.\n * @slot item - Single entry of the section. Set the same slot name to different items to put many of them. Add the `active` attribute to a slotted item to highlight it.\n */\n@Component({\n tag: \"z-menu-section\",\n styleUrl: \"styles.css\",\n shadow: true,\n})\nexport class ZMenuSection {\n @Element() host: HTMLZMenuSectionElement;\n\n /** Active state */\n @Prop({reflect: true})\n active?: boolean;\n\n /**\n * Tabindex value to set on the label button.\n * Useful to manage keyboard navigation focus with roving tabindex handled by this component's parent (usually ZMenu).\n */\n @Prop()\n htmlTabindex = -1;\n\n /** The opening state of the section. */\n @Prop({mutable: true})\n open: boolean;\n\n @State()\n hasItems: boolean;\n\n @State()\n items: HTMLElement[];\n\n /** The section has been opened. */\n @Event()\n opened: EventEmitter;\n\n /** The section has been closed. */\n @Event()\n closed: EventEmitter;\n\n private label: HTMLButtonElement;\n\n private get focusableItem(): HTMLElement {\n return this.items.find(({tabIndex}) => tabIndex === 0);\n }\n\n private toggle(): void {\n if (!this.hasItems) {\n return;\n }\n\n this.open = !this.open;\n this.setFocus();\n }\n\n private setItemsA11yAttrs(): void {\n if (!this.hasItems) {\n return;\n }\n\n this.items.forEach((item, index) => {\n item.setAttribute(\"role\", \"menuitem\");\n item.setAttribute(\"tabindex\", index === 0 ? \"0\" : \"-1\");\n });\n }\n\n private onItemsChange(): void {\n this.items = Array.from(this.host.querySelectorAll('[slot=\"section\"]')) as HTMLElement[];\n this.hasItems = this.items.length > 0;\n this.setItemsA11yAttrs();\n }\n\n /**\n * Sets slotted item text as `data-text` attribute value, to let CSS use it through `attr()`.\n * @param ev Slotchange event\n */\n private onLabelSlotChange(ev: Event): void {\n const labelElement = (ev.target as HTMLSlotElement).assignedElements()[0] as HTMLElement;\n labelElement.dataset.text = labelElement?.textContent;\n }\n\n private onLabelKeydown(ev: KeyboardEvent): void {\n if (ev.key === KeyboardCode.ENTER || ev.key === KeyboardCode.SPACE) {\n ev.preventDefault();\n ev.stopPropagation();\n this.toggle();\n }\n }\n\n /**\n * Move focus and adjust the tabindex value of `receiver` and `current` elements,\n * setting -1 to the `current` and 0 to the `receiver`, then focus the `receiver` element.\n */\n private moveFocus(receiver: HTMLElement, current?: HTMLElement): void {\n receiver.tabIndex = 0;\n setTimeout(() => {\n receiver.focus();\n }, 100);\n if (current) {\n current.tabIndex = -1;\n }\n }\n\n /** Set tabindex of the label to 0, then focus it. */\n @Method()\n async setFocus(): Promise<void> {\n this.htmlTabindex = 0;\n setTimeout(() => {\n this.label.focus();\n }, 100);\n }\n\n /** Focus the last item. */\n @Method()\n async focusLastItem(): Promise<void> {\n this.htmlTabindex = 0;\n this.moveFocus(this.items[this.items.length - 1]);\n }\n\n @Watch(\"open\")\n onOpenChange(): void {\n if (!this.open) {\n this.closed.emit();\n this.setItemsA11yAttrs();\n } else {\n this.opened.emit();\n }\n }\n\n @Watch(\"htmlTabindex\")\n onTabindexChange(): void {\n this.label.tabIndex = this.htmlTabindex;\n }\n\n @Listen(\"keydown\")\n private onItemsKeydown(ev: KeyboardEvent): void {\n switch (ev.key) {\n case KeyboardCode.ESC:\n case KeyboardCode.ARROW_LEFT:\n if (!this.open) {\n break;\n }\n ev.preventDefault();\n ev.stopPropagation();\n this.label.focus();\n this.open = false;\n break;\n case KeyboardCode.ARROW_RIGHT:\n if (this.open) {\n break;\n }\n ev.preventDefault();\n ev.stopPropagation();\n this.open = true;\n break;\n case KeyboardCode.ARROW_DOWN: {\n if (!this.open) {\n break;\n }\n if (document.activeElement === this.host) {\n ev.preventDefault();\n ev.stopPropagation();\n this.moveFocus(this.items[0]);\n break;\n }\n const currentIndex = this.items.indexOf(this.focusableItem);\n const receiver = this.items[currentIndex + 1];\n if (receiver) {\n ev.preventDefault();\n ev.stopPropagation();\n this.moveFocus(receiver, this.focusableItem);\n }\n break;\n }\n case KeyboardCode.ARROW_UP: {\n if (!this.open || document.activeElement === this.host) {\n break;\n }\n const currentIndex = this.items.indexOf(this.focusableItem);\n const receiver = this.items[currentIndex - 1];\n ev.preventDefault();\n ev.stopPropagation();\n if (receiver) {\n this.moveFocus(receiver, this.focusableItem);\n } else {\n // since there isn't a previous item to focus, give the focus to the label element\n this.setFocus();\n }\n break;\n }\n }\n }\n\n constructor() {\n this.toggle = this.toggle.bind(this);\n this.onItemsChange = this.onItemsChange.bind(this);\n this.onLabelSlotChange = this.onLabelSlotChange.bind(this);\n this.onLabelKeydown = this.onLabelKeydown.bind(this);\n this.onItemsKeydown = this.onItemsKeydown.bind(this);\n }\n\n connectedCallback(): void {\n this.onItemsChange();\n }\n\n render(): HTMLZMenuSectionElement {\n return (\n <Host open={this.open}>\n <button\n ref={(el) => (this.label = el)}\n class=\"label\"\n aria-haspopup={`${this.hasItems}`}\n aria-expanded={`${!!this.open}`}\n role=\"menuitem\"\n tabindex={this.htmlTabindex}\n onClick={this.toggle}\n onKeyDown={this.onLabelKeydown}\n >\n <slot onSlotchange={this.onLabelSlotChange} />\n {this.hasItems && <z-icon name={this.open ? \"chevron-up\" : \"chevron-down\"} />}\n </button>\n {this.open && (\n <div\n class=\"items\"\n role=\"menu\"\n >\n <slot\n name=\"section\"\n onSlotchange={this.onItemsChange}\n />\n </div>\n )}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}