@zanichelli/zanichelli-it-frontend-kit 1.3.0-RC2 → 1.3.0-RC3

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 (33) hide show
  1. package/dist/cjs/zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.cjs.js.map +1 -1
  2. package/dist/cjs/zanit-menubar_3.cjs.entry.js +3 -3
  3. package/dist/cjs/zanit-menubar_3.cjs.entry.js.map +1 -1
  4. package/dist/collection/components/menubar/menubar.css +1 -0
  5. package/dist/collection/components/menubar/mobile-menubar/mobile-menubar.css +1 -0
  6. package/dist/collection/components/menubar/search-form/search-form.css +2 -1
  7. package/dist/components/{p-Bk8_DaVU.js → p-ZtXP-Url.js} +3 -3
  8. package/dist/components/{p-Bk8_DaVU.js.map → p-ZtXP-Url.js.map} +1 -1
  9. package/dist/components/{p-Cs52y6qp.js → p-mjHId4_R.js} +4 -4
  10. package/dist/components/p-mjHId4_R.js.map +1 -0
  11. package/dist/components/zanit-menubar.js +3 -3
  12. package/dist/components/zanit-menubar.js.map +1 -1
  13. package/dist/components/zanit-mobile-menubar.js +1 -1
  14. package/dist/components/zanit-search-form.js +1 -1
  15. package/dist/esm/zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.js.map +1 -1
  16. package/dist/esm/zanit-menubar_3.entry.js +3 -3
  17. package/dist/esm/zanit-menubar_3.entry.js.map +1 -1
  18. package/dist/zanichelli-it-frontend-kit/p-d53e0a87.entry.js +2 -0
  19. package/dist/zanichelli-it-frontend-kit/p-d53e0a87.entry.js.map +1 -0
  20. package/dist/zanichelli-it-frontend-kit/zanichelli-it-frontend-kit.esm.js +1 -1
  21. package/dist/zanichelli-it-frontend-kit/zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.esm.js.map +1 -1
  22. package/package.json +1 -1
  23. package/www/build/{p-d121e671.js → p-82a399e5.js} +1 -1
  24. package/www/build/p-d53e0a87.entry.js +2 -0
  25. package/www/build/p-d53e0a87.entry.js.map +1 -0
  26. package/www/build/zanichelli-it-frontend-kit.esm.js +1 -1
  27. package/www/build/zanit-menubar.zanit-mobile-menubar.zanit-search-form.entry.esm.js.map +1 -1
  28. package/www/index.html +1 -5
  29. package/dist/components/p-Cs52y6qp.js.map +0 -1
  30. package/dist/zanichelli-it-frontend-kit/p-1dddc763.entry.js +0 -2
  31. package/dist/zanichelli-it-frontend-kit/p-1dddc763.entry.js.map +0 -1
  32. package/www/build/p-1dddc763.entry.js +0 -2
  33. package/www/build/p-1dddc763.entry.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ import{h as e,r as t,a as i,F as a,c as r,H as n}from"./p-B82IapZZ.js";const s=(e,t)=>t.composedPath().filter((e=>e!==document&&e!==window.window)).some((t=>e.contains(t)));const o=(e,t)=>{e.tabIndex=-1;t.tabIndex=0;t.focus({preventScroll:true})};const h=e=>e.key==="ArrowUp";const c=e=>e.key==="ArrowDown";const u=e=>e.key==="Tab";const l=e=>e.key==="Escape";const d="default";const m={id:d,label:d};const p=e=>{const t=e.reduce(((e,t)=>{const i=e.find((({group:e})=>e.id===(t.group?.id||m.id)));if(!i){e.push({group:t.group??m,items:[t]})}else{i.items.push(t)}return e}),[]);return t.sort(((e,t)=>e.group.id===d?1:t.group.id===d?-1:0))};const f=({controlledBy:t,items:i,currentPath:a=[],onItemKeyDown:r})=>{if(!i?.length){return null}const n=p(i);const s=e=>a.includes(t)&&a.includes(e.id);return e("div",{class:"menu-wrapper",role:"none"},e("div",{class:"menu","aria-labelledby":t??undefined,role:"menu"},n.map((({group:t,items:i})=>e("div",{class:{group:true,highlight:i.some((e=>e.highlight))}},t.id!==d?e("div",{class:"group-name",id:t.id},t.label):n.length>1?e("div",{class:"group-name"}):null,e("ul",{class:"menu-list",role:"group","aria-labelledby":t.id!==d?t.id:undefined},i.map((t=>e("li",{role:"none"},t.href&&e("a",{class:{"menu-item":true,active:s(t)},href:t.href,role:"menuitem",tabIndex:-1,"aria-current":s(t)?"page":"false",onKeyDown:e=>r(e),target:t.target},t.label))))))))))};var b;(function(e){e["DEV"]="dev";e["TEST"]="test";e["PROD"]="prod"})(b||(b={}));const g={dev:"https://zanichelli-shop-dev.s3.eu-west-1.amazonaws.com",test:"https://zanichelli-shop-test.s3.eu-west-1.amazonaws.com",prod:"https://zanichelli-shop.s3.eu-west-1.amazonaws.com"};async function w(e){try{const t=await fetch(`${g[e]}/categories.json`);if(!t.ok){throw new Error(`HTTP ${t.status}`)}return await t.json()}catch(e){console.error("Error fetching subjects:",e);return{}}}const x=":host{position:relative;z-index:2;display:flex;width:100%;background-color:#fff;color:var(--gray900);font-family:var(--font-family-sans)}:host,*,::before,::after{box-sizing:border-box}*:focus:focus-visible{box-shadow:var(--shadow-focus-primary);outline:none}ul{padding:0;margin:0;list-style:none}a{color:var(--gray900);cursor:pointer;text-decoration:none}button{all:unset;cursor:pointer}:host nav{width:100%}.shadow-wrapper{position:relative;z-index:1;display:flex;width:100%}.shadow-wrapper::after{position:absolute;top:0;right:0;width:100%;height:100%;background:transparent;box-shadow:var(--shadow-1);content:'';pointer-events:none}.width-limiter{position:relative;display:flex;width:100%;max-width:var(--zanit-menubar-max-width, 1366px);margin:0 auto}.shadow-wrapper+.shadow-wrapper{z-index:0}.sub-menubar>ul{gap:28px}.width-limiter>ul,.sub-menubar>ul{position:relative;z-index:3;display:flex;width:100%;align-items:center;padding:0 var(--grid-margin);margin-right:auto;margin-left:auto;gap:20px}.shadow-wrapper>.width-limiter,.shadow-wrapper>ul{width:100%;max-width:var(--zanit-menubar-max-width, 1366px)}ul.menubar{padding-right:0;height:3rem}.menubar z-ghost-loading{display:block;width:120px;height:1.25rem}.menubar>li[role='separator']{width:1px;height:1.25rem;background-color:#000}.menubar-item{position:relative;display:flex;align-items:center;padding:14px 0;font-size:1rem;gap:8px;line-height:1.25rem}.menubar .menubar-item{text-transform:uppercase}.menubar-item [data-text]{display:flex;flex-direction:column}.menubar-item.active>[data-text],.menubar-item:hover>[data-text],.menubar-item:focus:focus-visible>[data-text]{font-weight:var(--font-bd)}.menubar-item>[data-text]::after{height:0;content:attr(data-text) / '';font-weight:var(--font-bd);letter-spacing:normal;pointer-events:none;user-select:none;visibility:hidden}.sub-menubar .menubar-item.active::after{position:absolute;z-index:-1;bottom:0;left:-4px;width:calc(100% + 8px);height:4px;background-color:var(--red500);content:''}zanit-search-form{margin-left:auto}";const y=".menu-wrapper{width:100%;background-color:#fff}.menu{position:relative;display:flex;width:100%;flex-direction:column;gap:32px 0}.menu .group{display:flex;flex-direction:column}.menu .group .group-name{border-bottom:1px solid currentcolor;margin-bottom:4px;color:var(--red500);font-size:0.875rem;font-weight:var(--font-md)}.menu .group .menu-list{display:flex;flex-direction:column;gap:8px}.menu .group .menu-list .menu-item{display:block;border-bottom:2px solid transparent;font-size:0.875rem;font-weight:var(--font-md)}.menu .menu-list .menu-item.active,.menu .menu-list .menu-item:hover{border-bottom-color:var(--red500)}.menu .group.highlight .menu-list .menu-item{font-size:1rem}@media (width >= 768px){.menu-wrapper{position:absolute;top:100%;left:0;display:flex;justify-content:center;box-shadow:var(--shadow-1)}.menu{display:grid;width:100%;max-width:var(--zanit-menubar-max-width, 1366px);padding:16px var(--grid-margin);gap:0 24px;grid-auto-columns:minmax(0, max-content);grid-auto-flow:column;grid-template-rows:minmax(0, max-content) max-content}.menu .group{display:grid;grid-row:1 / -1;grid-template-columns:1fr;grid-template-rows:subgrid}@supports not (grid-template-rows: subgrid){.menu .group{grid-template-rows:repeat(auto-fit, minmax(0, max-content))}}.menu .group .group-name{border:none;margin-bottom:16px}.menu .group .menu-list .menu-item{font-size:1rem}.menu .group.highlight .menu-list .menu-item{font-size:1.5rem}}";const v=class{constructor(e){t(this,e)}get host(){return i(this)}items=[];openMenu=undefined;openNavbar=undefined;currentPath=[];isMobile=false;loading=false;data;current=undefined;searchQuery=undefined;searchEnv=b.PROD;searchArea;timerId;async parseData(e){if(!e){return}if(e instanceof URL){this.items=await this.fetchData(e)}else if(e instanceof Promise){this.loading=true;this.items=await e;this.loading=false}else if(typeof e==="string"){try{this.items=JSON.parse(e);if(!Array.isArray(this.items)||!this.items?.every((e=>e))){throw new Error("Expected an array of MenubarItem objects.")}}catch{let t;try{t=new URL(e)}catch{throw new Error("Invalid string provided for `data` property: not a valid url or JSON.")}this.items=await this.fetchData(t)}}else if(Array.isArray(e)&&e.every((e=>e))){this.items=e}else{throw new Error("Invalid `data` property value. Expected an url, a JSON or an array/promise of MenubarItem objects.")}}onItemsChange(){this.initTabindex()}onCurrentChange(){this.currentPath=this.current?.split("/").filter(Boolean)||[]}async connectedCallback(){const e=window.matchMedia("(width < 768px)");this.isMobile=e.matches;e.onchange=e=>{this.isMobile=e.matches;this.initTabindex();this.openMenu=undefined};await this.parseData(this.data);this.onCurrentChange();this.initTabindex()}handleOutsideClick(e){if(!this.openMenu||s(this.host,e)){return}this.openMenu=undefined}handleKeydown(e){switch(e.key){case"Escape":{if(this.openMenu){e.preventDefault();const t=this.openMenu;this.openMenu=undefined;setTimeout((()=>{const e=this.host.shadowRoot.getElementById(t);if(e){e.focus()}}),0)}break}case"Tab":this.openMenu=undefined;break}}handleMouseover(){clearTimeout(this.timerId)}handleMouseout(e){this.timerId=window.setTimeout((()=>{if(!this.openMenu||s(this.host,e)){return}this.openMenu=undefined}),500)}handleFocusout(e){const t=e.relatedTarget;if(!this.openMenu||this.host.shadowRoot.querySelector(".menu")?.contains(t)){return}this.openMenu=undefined}async fetchData(e){try{this.loading=true;const t=await(await fetch(e)).json();this.loading=false;if(!Array.isArray(t)||!t.every((e=>e))){throw new Error("Invalid data structure. Expected an array of MenuItem objects.")}return t}catch(e){this.loading=false;console.error("Error fetching menubar data:",e);throw new Error("Failed to fetch menubar data from the provided URL.",{cause:e})}}initTabindex(){setTimeout((()=>{this.host.shadowRoot.querySelectorAll('[role="menubar"]')?.forEach((e=>{e.querySelectorAll('[role="menuitem"]')?.forEach(((e,t)=>e.setAttribute("tabindex",t===0?"0":"-1")))}))}),100)}isActive(e){if(this.currentPath.length===0){return false}if(this.currentPath.includes(e.id)){return true}if(e.menuItems?.length){return e.menuItems.some((e=>e.id===this.current))}if(e.navbarItems?.length){const t=e.navbarItems.some((e=>this.isActive(e)));if(t){return true}}return false}showMenu(e){this.openMenu=undefined;if(!e.menuItems?.length){return}this.openMenu=e.id}getParentMenubarElements(e){return Array.from(e?.closest('[role="menubar"]')?.querySelectorAll(':scope > li a[role="menuitem"]')??[])}focusPreviousItem(e){this.openMenu=undefined;const t=this.getParentMenubarElements(e);const i=t.indexOf(e);const a=t[(i-1+t.length)%t.length];o(e,a);if(a.ariaHasPopup==="true"&&this.openMenu){this.openMenu=a.id}}focusNextItem(e){this.openMenu=undefined;const t=this.getParentMenubarElements(e);const i=t.indexOf(e);const a=t[(i+1)%t.length];o(e,a);if(a.ariaHasPopup==="true"&&this.openMenu){this.openMenu=a.id}}handleItemKeydown(e,t){const i=e.target;switch(e.key){case"Home":{e.preventDefault();e.stopPropagation();const t=this.getParentMenubarElements(i)[0];o(i,t);break}case"End":{e.preventDefault();e.stopPropagation();const t=this.getParentMenubarElements(i).pop();o(i,t);break}case"ArrowUp":{if(!t.menuItems?.length){break}e.preventDefault();e.stopPropagation();this.openMenu=t.id;setTimeout((()=>{const e=Array.from(this.host.shadowRoot.querySelectorAll(`[aria-labelledby=${t.id}] [role="menuitem"]`));o(i,e[e.length-1])}),100);break}case"ArrowRight":{e.preventDefault();e.stopPropagation();this.focusNextItem(i);break}case"ArrowDown":{if(!t.menuItems?.length){break}this.openItemMenu(t);break}case"ArrowLeft":{e.preventDefault();e.stopPropagation();this.focusPreviousItem(i);break}case" ":{e.preventDefault();e.stopPropagation();if(this.openMenu===t.id){this.openMenu=undefined;break}else if(t.menuItems?.length){this.openItemMenu(t);break}}}}getPreviousGroup(e){const t=Array.from(e?.closest('[role="menu"]')?.querySelectorAll('[role="group"]')??[]);const i=t.indexOf(e);return t[i-1]}getNextGroup(e){const t=Array.from(e?.closest('[role="menu"]')?.querySelectorAll('[role="group"]')??[]);const i=t.indexOf(e);return t[i+1]}openItemMenu(e){this.openMenu=e.id;setTimeout((()=>{const t=this.host.shadowRoot.querySelector(`[aria-labelledby=${e.id}] [role="menuitem"]`);t.tabIndex=0;t.focus({preventScroll:true})}),100)}handleMenuKeydown(e){const t=e.target;const i=Array.from(t.closest('[role="menu"]')?.querySelectorAll('[role="menuitem"]')??[]);const a=i.indexOf(t);switch(e.key){case"ArrowUp":{e.preventDefault();e.stopPropagation();const r=i[a-1]||i[i.length-1];o(t,r);break}case"ArrowRight":{e.preventDefault();e.stopPropagation();const i=t.closest("[role=group]");const a=this.getNextGroup(i);if(!a){t.tabIndex=-1;const e=t.closest('[role="menu"][aria-labelledby]').getAttribute("aria-labelledby");const i=this.host.shadowRoot.getElementById(e);this.focusNextItem(i);break}const r=a.querySelectorAll('[role="menuitem"]')??[];o(t,r[0]);break}case"ArrowDown":{e.preventDefault();e.stopPropagation();const r=i[a+1]||i[0];o(t,r);break}case"ArrowLeft":{e.preventDefault();e.stopPropagation();const i=t.closest("[role=group]");const a=this.getPreviousGroup(i);if(!a){t.tabIndex=-1;const e=t.closest('[role="menu"][aria-labelledby]').getAttribute("aria-labelledby");const i=this.host.shadowRoot.getElementById(e);this.focusPreviousItem(i);break}const r=a.querySelectorAll('[role="menuitem"]')??[];o(t,r[0]);break}case"Home":e.preventDefault();e.stopPropagation();o(t,i[0]);break;case"End":e.preventDefault();e.stopPropagation();o(t,i[i.length-1]);break}}render(){if(this.isMobile){return e("zanit-mobile-menubar",{items:this.items,currentPath:this.currentPath,searchQuery:this.searchQuery,loading:this.loading,searchArea:this.searchArea,searchEnv:this.searchEnv})}return e("nav",{"aria-label":"Zanichelli.it"},e("div",{class:"shadow-wrapper"},e("div",{class:"width-limiter"},e("ul",{class:"menubar",role:"menubar","aria-label":"Zanichelli.it"},this.loading&&[...new Array(4)].map(((t,i)=>e(a,null,e("li",{role:"none"},e("div",{class:"menubar-item"},e("z-ghost-loading",null))),i<3&&e("li",{role:"separator"})))),this.items?.map(((t,i)=>e(a,null,e("li",{role:"none"},e("a",{class:{"menubar-item":true,active:this.isActive(t)},href:t.href,id:t.id,role:"menuitem",tabIndex:-1,"aria-expanded":t.menuItems?.length?this.openMenu===t.id?"true":"false":undefined,"aria-haspopup":t.menuItems?.length?"true":"false","aria-current":this.current.includes(t.id)?"page":"false",onPointerOver:()=>this.showMenu(t),onKeyDown:e=>this.handleItemKeydown(e,t),target:t.target},e("span",{"data-text":t.label},t.label),t.menuItems?.length>0&&e("z-icon",{name:this.openMenu===t.id?"chevron-up":"chevron-down",width:"0.875rem",height:"0.875rem"}))),i<this.items?.length-1&&e("li",{role:"separator"}))))),e("zanit-search-form",{searchQuery:this.searchQuery,searchArea:this.searchArea,searchEnv:this.searchEnv,onResetSearch:()=>this.searchQuery=undefined})),this.items.map((t=>this.openMenu===t.id&&e(f,{controlledBy:t.id,items:t.menuItems,currentPath:this.currentPath,onItemKeyDown:e=>this.handleMenuKeydown(e)})))),this.items?.filter((e=>this.isActive(e))).map((t=>t.navbarItems?.length&&e("nav",{class:{"sub-menubar":true,"shadow-wrapper":true},"aria-label":`Sezioni: ${t.label}`},e("ul",{role:"menubar"},t.navbarItems.map((i=>e(a,null,e("li",{role:"none"},e("a",{class:{"menubar-item":true,active:this.isActive(i)},href:i.href,id:i.id,role:"menuitem",tabIndex:-1,"aria-haspopup":i.menuItems?.length?"true":"false","aria-expanded":i.menuItems?.length?this.openMenu===i.id?"true":"false":undefined,"aria-current":this.current.includes(i.id)?"page":"false",onPointerOver:()=>this.showMenu(i),onKeyDown:e=>this.handleItemKeydown(e,i),target:t.target},e("span",null,i.label),i.menuItems?.length>0&&e("z-icon",{name:this.openMenu===i.id?"chevron-up":"chevron-down",width:"0.75rem",height:"0.75rem"}))))))),t.navbarItems.map((t=>this.openMenu===t.id&&e(f,{controlledBy:t.id,items:t.menuItems,currentPath:this.currentPath,onItemKeyDown:e=>this.handleMenuKeydown(e)})))))))}static get delegatesFocus(){return true}static get watchers(){return{data:["parseData"],items:["onItemsChange"],current:["onCurrentChange"]}}};v.style=x+y;const k=":host{position:relative;z-index:2;display:block;width:100%;max-width:100%;height:3rem;background-color:#fff;color:var(--gray900);fill:var(--gray900);font-family:var(--font-family-sans)}:host,*,::before,::after{box-sizing:border-box}*:focus:focus-visible{box-shadow:var(--shadow-focus-primary);outline:none}ul{padding:0;margin:0;list-style:none}a{color:var(--gray900);cursor:pointer;text-decoration:none}button{all:unset;cursor:pointer}nav{display:flex;width:100%;align-items:center;padding-left:var(--grid-margin);gap:8px}nav::after{position:absolute;top:0;right:0;width:100%;height:100%;background:transparent;box-shadow:var(--shadow-1);content:'';pointer-events:none}z-logo{margin:8px 0}.mobile-menu{position:absolute;top:100%;left:0;display:flex;overflow:auto;width:100%;max-height:calc(100vh - 48px - var(--zanit-menubar-top-offset, 0px));flex-direction:column;padding:16px var(--grid-margin) 32px;background-color:#fff;box-shadow:var(--shadow-2);gap:8px}.mobile-menu li{width:100%}.mobile-menu .items-container{display:flex;min-height:256px;flex-direction:column;gap:8px}.mobile-menu .items-container z-ghost-loading{width:40%;height:1.2rem}.mobile-menu .items-container .menubar-item{display:block;width:100%;padding:8px 0;font-size:1rem;text-align:left}.mobile-menu .items-container li:not(:last-child) .menubar-item{border-bottom:1px solid #000}[role='menuitem'].parent{display:flex;width:fit-content;align-items:center;padding:0;border:none;font-size:0.875rem;gap:8px}zanit-search-form{margin-left:auto}";const z=".menu-wrapper{width:100%;background-color:#fff}.menu{position:relative;display:flex;width:100%;flex-direction:column;gap:32px 0}.menu .group{display:flex;flex-direction:column}.menu .group .group-name{border-bottom:1px solid currentcolor;margin-bottom:4px;color:var(--red500);font-size:0.875rem;font-weight:var(--font-md)}.menu .group .menu-list{display:flex;flex-direction:column;gap:8px}.menu .group .menu-list .menu-item{display:block;border-bottom:2px solid transparent;font-size:0.875rem;font-weight:var(--font-md)}.menu .menu-list .menu-item.active,.menu .menu-list .menu-item:hover{border-bottom-color:var(--red500)}.menu .group.highlight .menu-list .menu-item{font-size:1rem}@media (width >= 768px){.menu-wrapper{position:absolute;top:100%;left:0;display:flex;justify-content:center;box-shadow:var(--shadow-1)}.menu{display:grid;width:100%;max-width:var(--zanit-menubar-max-width, 1366px);padding:16px var(--grid-margin);gap:0 24px;grid-auto-columns:minmax(0, max-content);grid-auto-flow:column;grid-template-rows:minmax(0, max-content) max-content}.menu .group{display:grid;grid-row:1 / -1;grid-template-columns:1fr;grid-template-rows:subgrid}@supports not (grid-template-rows: subgrid){.menu .group{grid-template-rows:repeat(auto-fit, minmax(0, max-content))}}.menu .group .group-name{border:none;margin-bottom:16px}.menu .group .menu-list .menu-item{font-size:1rem}.menu .group.highlight .menu-list .menu-item{font-size:1.5rem}}";const S=class{constructor(e){t(this,e)}get host(){return i(this)}currentPath=[];items=[];searchQuery=undefined;loading=false;searchEnv=b.PROD;searchArea;lastCurrent=undefined;parentItem=undefined;menuItems=undefined;menuType=undefined;open;onItemsChange(){this.lastCurrent=this.currentPath?.length?this.currentPath[this.currentPath.length-1]:undefined;this.setupData(this.items)}setupData(e,t){if(this.lastCurrent===undefined){this.parentItem=undefined;this.menuType="menubar";this.menuItems=e;return}for(const i of e){if(i.id===this.lastCurrent){this.parentItem=t;this.menuType=i.menuItems?.length?"menu":"menubar";this.menuItems=i.menuItems||i.navbarItems;return}if(this.currentPath.length>1&&i.id===this.currentPath[this.currentPath.length-2]&&i.menuItems?.some((({id:e})=>e===this.lastCurrent))){this.parentItem=i;this.menuType=i.menuItems?.length?"menu":"menubar";this.menuItems=i.menuItems||i.navbarItems;return}if(i.navbarItems?.length){this.setupData(i.navbarItems,i)}}}get menuItemsElement(){return Array.from(this.host.shadowRoot.querySelectorAll('[role="menuitem"]'))}initTabindex(){this.menuItemsElement.forEach(((e,t)=>e.setAttribute("tabindex",t===0?"0":"-1")))}toggleMenu(){if(this.open){this.open=false}else{this.open=true;setTimeout((()=>{this.initTabindex();this.menuItemsElement[0]?.focus({preventScroll:true})}),200)}}handleItemKeydown(e){switch(e.key){case"ArrowUp":{e.preventDefault();e.stopPropagation();const t=this.menuItemsElement;const i=t.indexOf(e.target);const a=t[(i-1+t.length)%t.length];o(t[i],a);break}case"ArrowDown":{e.preventDefault();e.stopPropagation();const t=this.menuItemsElement;const i=t.indexOf(e.target);const a=t[(i+1)%t.length];o(t[i],a);break}case"Home":{e.preventDefault();e.stopPropagation();o(e.target,this.menuItemsElement[0]);break}case"End":{e.preventDefault();e.stopPropagation();o(e.target,this.menuItemsElement.pop());break}}}connectedCallback(){this.lastCurrent=this.currentPath?.length?this.currentPath[this.currentPath.length-1]:undefined;this.setupData(this.items)}handleOutsideClick(e){if(s(this.host,e)){return}this.open=false}handleKeydown(e){switch(e.key){case"Escape":this.open=false;break;case"Tab":if(s(this.host,e)){break}this.open=false;break}}handleFocusout(e){if(s(this.host,e)){return}this.open=false}render(){return e("nav",{key:"f21d484bf0c81aa8e4583f71bf8a8523c57b791f","aria-label":"Zanichelli.it"},e("button",{key:"5331948d9f25ebf2812b9538ba2654ccd98a376a",class:"burger-button",type:"button","aria-expanded":this.open?"true":"false","aria-controls":"mobile-menu","aria-label":this.open?"Chiudi menù":"Apri menù",onClick:()=>this.toggleMenu()},e("z-icon",{key:"14b6264bd1aa3383a90d0f38924cc73b407af7fb",name:this.open?"multiply":"burger-menu",width:"1.5rem",height:"1.5rem"})),e("z-logo",{key:"ad25511bb218bdfae227a6f84c2f84790da5495a",imageAlt:"Logo Zanichelli",link:"/",height:32,width:126}),e("zanit-search-form",{key:"a76767d008e17c8c22baef76eb5ef6237764a665",searchQuery:this.searchQuery,onResetSearch:()=>this.searchQuery=undefined,searchArea:this.searchArea,searchEnv:this.searchEnv}),this.open&&e("ul",{key:"dc7159a8a0342825a7828323204dd10e32ea30ee",class:"mobile-menu",role:"menubar"},!this.loading&&this.currentPath&&this.currentPath.length>0&&e("li",{key:"60f03b21375d3cdc89242a67b89c42a6d2aad5ca",role:"none"},e("a",{key:"143c13385480d4860d95cc073af0d53aa8f622f2",class:"parent",href:this.parentItem?.href??"/",id:this.parentItem?.id??undefined,role:"menuitem",tabIndex:-1,onKeyDown:e=>this.handleItemKeydown(e),target:this.parentItem?.target},e("z-icon",{key:"a433613bd001bcbd44ba98305291d8d585349f21",name:"arrow-left",width:"0.5rem",height:"0.5rem"}),e("span",{key:"237cc68a00c57e71ef564444ab872a4d47bf7071"},this.parentItem?.label||"Home"))),this.loading?e("div",{class:"items-container",role:"none"},[...new Array(4)].map((()=>e("li",{role:"none"},e("div",{class:"menubar-item",role:"none"},e("z-ghost-loading",null)))))):this.menuType==="menu"?e(f,{items:this.menuItems,controlledBy:this.parentItem?.id,currentPath:this.currentPath,onItemKeyDown:e=>this.handleItemKeydown(e)}):this.menuItems?.length>0&&e("div",{class:"items-container",role:"none"},this.menuItems.map((t=>e("li",{role:"none"},e("a",{class:{"menu-item":this.menuType==="menu","menubar-item":this.menuType==="menubar"},href:t.href,id:t.id,role:"menuitem","aria-current":this.lastCurrent===t.id?"page":"false",tabIndex:-1,onKeyDown:e=>this.handleItemKeydown(e),target:t.target},e("span",{"data-text":t.label},t.label))))))))}static get delegatesFocus(){return true}static get watchers(){return{items:["onItemsChange"],currentPath:["onItemsChange"]}}};S.style=k+z;var A;(function(e){e["SCUOLA"]="Scuola";e["UNIVERSITÀ"]="Università";e["GIURIDICO"]="Giuridico";e["DIZIONARI"]="Dizionari";e["SAGGISTICA"]="Saggistica"})(A||(A={}));const I=Object.keys(A);function C(e,t,i){const a=K(e,t);const r=a.length>0;const n=r?e.toUpperCase():undefined;const s=[];if(i)s.push(E(e,i));s.push(E(e));if(r){if(i){const t=[...a.filter((e=>e===i)),...a.filter((e=>e!==i)).sort(((e,t)=>_(e)-_(t)))];t.forEach((t=>s.push(D(e,t,n))))}else{a.sort(((e,t)=>_(e)-_(t))).forEach((t=>s.push(D(e,t,n))))}}return s}const E=(e,t)=>({id:T(`word-${e}-${t}`),label:j(e,t,false,false),html_label:j(e,t,false,true),url:$({q:e,...t?{area:t}:{},user_query:e}),...P(e,e,t)});const D=(e,t,i)=>({id:T(`subj-${e}-${t}-${i}`),label:j(e,t,true,false),html_label:j(e,t,true,true),url:$({area:t,materia:i,user_query:e}),...P(e,undefined,t,i)});const T=e=>e.split("").map((e=>e.charCodeAt(0).toString(16))).join("");const $=e=>`ricerca?${new URLSearchParams(e).toString()}`;const P=(e,t,i,a)=>({user_query:e,...t?{query:t}:{},...i?{area:i}:{},...a?{subject:a}:{}});const j=(e,t,i=false,a=false)=>{const r=a?`<strong>`:``;const n=a?`</strong>`:``;return`Cerca la ${i?`materia`:`parola`} ${r}${e}${n} ${t?`nel catalogo ${r}${A[t]??t}${n}`:`in tutto il sito`}`};function K(e,t){const i=M(e);return Object.entries(t).filter((([,e])=>e.some((e=>e.toLowerCase()===i)))).map((([e])=>e))}const M=e=>e.toLowerCase().replace(/\s+/g," ");const _=e=>{const t=I.indexOf(e);return t>=0?t:100};const O=":host,*,::before,::after{box-sizing:border-box}*:focus:focus-visible{box-shadow:var(--shadow-focus-primary);outline:none}button{all:unset;cursor:pointer}.searchbar{--searchbar-button-x-padding:14px;--searchbar-button-icon-width:1.75rem;--closed-searchbar-width:calc((var(--searchbar-button-x-padding) * 2) + var(--searchbar-button-icon-width) + 1px);position:absolute;z-index:5;top:0;right:0;display:flex;width:var(--closed-searchbar-width);height:3rem;justify-content:flex-end;transition:width 0.4s ease-in-out}.searchbar.searchbar-open{width:100%}.searchbar .input-wrapper{display:flex;overflow:hidden;width:100%;align-items:center;padding:8px;padding-left:var(--grid-margin);background-color:#fff;gap:8px;transition-duration:0.4s;transition-property:padding-right, padding-left, width;transition-timing-function:ease-in-out}.searchbar:not(.searchbar-open) .input-wrapper{overflow:hidden;width:0;padding:0}.searchbar button[type='reset']{--z-icon-width:1rem;--z-icon-height:1rem;display:flex;align-items:center;cursor:pointer}.searchbar input{z-index:1;width:100%;height:100%;padding:0;border:none;background-color:#fff;font-family:var(--font-family-sans);font-size:1rem}.searchbar.searchbar-open input:first-child{padding-left:4px;margin-left:-4px;}.searchbar input[type='search']::-webkit-search-cancel-button,.searchbar input[type='search']::-webkit-search-decoration{appearance:none}.searchbar input::placeholder{color:var(--gray500)}.searchbar .searchbar-button{display:flex;align-items:center;justify-content:center;padding:10px var(--searchbar-button-x-padding);border-left:1px solid #000;background:var(--zanit-accent-color);font-family:inherit;font-size:inherit;gap:64px;line-height:1}.searchbar .searchbar-button:focus-visible{z-index:1}.searchbar-button z-icon{--z-icon-width:var(--searchbar-button-icon-width);--z-icon-height:var(--searchbar-button-icon-width)}.suggestions-wrapper{position:absolute;z-index:4;width:100vw;margin-left:-50vw;left:50%;top:3rem;background:#fff;box-shadow:var(--shadow-1);border-top:1px solid var(--gray200)}.suggestions-wrapper.hidden{display:none}.suggestions{display:flex;padding:var(--space-unit);flex-direction:column;align-items:stretch;width:100%;margin:0 auto}.suggestion{cursor:pointer;padding:calc(var(--space-unit) * 0.75) var(--space-unit);font-size:1rem;line-height:1.5rem}.suggestion strong{font-size:1.125rem}.suggestion:hover,.suggestion[aria-selected='true']{background:var(--gray100)}@media (width < 1152px){.searchbar .searchbar-button>.searchbar-button-label{display:none}}@media (width >= 768px){.searchbar{--searchbar-button-x-padding:16px;--searchbar-button-icon-width:2rem}.searchbar .input-wrapper{gap:14px}.searchbar button[type='reset']{--z-icon-width:1.5rem;--z-icon-height:1.5rem}.searchbar input,.searchbar .searchbar-button{font-size:1.5rem}.searchbar .searchbar-button{padding:8px var(--searchbar-button-x-padding)}.suggestions{padding:var(--space-unit) calc(var(--space-unit) * 2)}}@media (width >= 1152px){.searchbar{--closed-searchbar-width:190px}}@media (width >= 1366px){.searchbar .searchbar-button{border-right:1px solid #000}.suggestions{padding:var(--space-unit) calc(var(--space-unit) * 3);max-width:1366px}}";const Q=class{constructor(e){t(this,e);this.search=r(this,"search");this.resetSearch=r(this,"resetSearch")}formElement;subjectsByArea={};timer;get host(){return i(this)}showSearchbar=false;_searchQuery=undefined;suggestions=[];activeSuggestion="";showSuggestions=false;searchQuery=undefined;searchEnv=b.PROD;searchArea;onSearchQueryChange(){this._searchQuery=this.searchQuery;if(this.searchQuery){this.openSearchbar()}this.resetSuggestions()}onSearchAreaChange(){this.resetSuggestions()}onShowSearchbarChange(){if(!this.showSearchbar){this.showSuggestions=false}}onShowSuggestionsChange(){this.activeSuggestion=""}search;resetSearch;async connectedCallback(){this.subjectsByArea=await w(this.searchEnv);this.showSearchbar=!!this.searchQuery;this._searchQuery=this.searchQuery}handleOutsideClick(e){if(this.showSearchbar&&this.host&&!s(this.host,e)){this.showSearchbar=false}}handleEsc(e){if(!l(e)){return}if(this.showSuggestions){this.showSuggestions=false}else{this.showSearchbar=false}}handleTab(e){if(!u(e)){return}this.showSuggestions=false;if(!s(this.host,e)){this.showSearchbar=false}}openSearchbar(){this.showSearchbar=true;setTimeout((()=>{const e=this.host.shadowRoot.querySelector("#searchbar-input");e.focus({preventScroll:true})}),500)}resetSearchQuery(){this.searchQuery=undefined;this.resetSearch.emit()}resetSuggestions(){this.suggestions=[];this.showSuggestions=false}handleInputChange(e){this._searchQuery=e.target.value;if(!this._searchQuery){this.searchQuery=undefined}this.updateSuggestions()}updateSuggestions(){clearTimeout(this.timer);const e=(this._searchQuery||"").trim();if(e.length<3){this.resetSuggestions();return}this.timer=setTimeout((()=>{this.resetSuggestions();this.suggestions=C(e,this.subjectsByArea,this.searchArea?.toUpperCase());this.showSuggestions=true}),300)}onSearchSubmit(e){e.preventDefault();if(!this._searchQuery){return}if(this.activeSuggestion){const e=this.suggestions.find((e=>e.id===this.activeSuggestion));if(e){this.submitSuggestionSearch(e);this.showSuggestions=false;return}}this.showSearchbar=false;const t=this.search.emit({query:this._searchQuery,area:this.searchArea});if(t.defaultPrevented){return}this.formElement.submit()}submitSuggestionSearch(e){const t=this.search.emit({user_query:e.user_query,query:e.query,area:e.area,subject:e.subject});if(!t.defaultPrevented){window.location.href=e.url}}handleSuggestionsNav(e){if(!c(e)&&!h(e)){return}if(!this.suggestions.length){return}const t=this.suggestions.map((e=>e.id));if(!t.length){return}e.preventDefault();e.stopPropagation();if(!this.showSuggestions){this.showSuggestions=true}let i=null;const a=t[0];const r=t[t.length-1];const n=t.indexOf(this.activeSuggestion);if(n<0){i=c(e)?a:r}else{if(c(e)){i=t[n+1]||r}else{i=t[n-1]||a}}this.activeSuggestion=i}renderSuggestions(){return e("div",{class:{"suggestions-wrapper":true,hidden:!this.showSuggestions||!this.suggestions.length},onPointerOver:e=>e.preventDefault()},e("div",{id:"search-suggestions",class:"suggestions",role:"listbox","aria-label":"Seleziona tra i suggerimenti"},this.suggestions.map(((t,i)=>e("span",{key:i,innerHTML:t.html_label,id:t.id,class:"suggestion",role:"option","aria-label":t.label,"aria-selected":this.activeSuggestion===t.id?"true":undefined,onClick:()=>this.submitSuggestionSearch(t)})))))}render(){return e(n,{key:"7ac06128ddbb7b5eed2d579d615607f725a3d922"},e("form",{key:"238b35f0aa41c95b3329da5fc80e17f3a47dfff6",class:{searchbar:true,"searchbar-open":this.showSearchbar},ref:e=>this.formElement=e,role:"search","aria-label":"Cerca nel sito",method:"get",action:"/ricerca",onSubmit:e=>this.onSearchSubmit(e),onReset:()=>this.resetSearchQuery()},!!this.searchArea&&e("input",{key:"bdd71f66a0947eeae7f657298cc2397f512884ab",type:"hidden",name:"area",value:this.searchArea}),e("div",{key:"9e40abc78a5d1910ace9bc628f10035696df7e7f",class:"input-wrapper",role:"none"},this.searchQuery&&e("button",{key:"f84706b7c06dabb0b6a81eae6530e26eddc95a04",type:"reset","aria-label":"Svuota campo di ricerca",disabled:!this.showSearchbar,"aria-hidden":!this.showSearchbar?"true":undefined,tabIndex:!this.showSearchbar?-1:0},e("z-icon",{key:"6ff774cf791dc2f7ebb1861a5697e27ae040206f",name:"multiply-circled"})),e("input",{key:"e53291d60e203c72a79af09eb9072dde62b6a916",id:"searchbar-input",name:"q",type:"search",disabled:!this.showSearchbar,placeholder:"Cerca per parola chiave o ISBN",value:this.searchQuery,required:true,autocomplete:"off",role:"combobox","aria-autocomplete":"list","aria-expanded":this.showSuggestions?"true":"false","aria-controls":"search-suggestions","aria-activedescendant":this.activeSuggestion,"aria-label":"Cerca per parola chiave o ISBN","aria-hidden":!this.showSearchbar?"true":undefined,tabIndex:!this.showSearchbar?-1:0,onInput:e=>this.handleInputChange(e),onKeyDown:e=>{if(l(e)){e.preventDefault()}this.handleSuggestionsNav(e)}})),e("button",{key:"836604e75ca90d451cba93236509f20a3a22cf16",class:"searchbar-button","aria-label":this.showSearchbar?"Esegui ricerca":"Apri il campo di ricerca","aria-controls":"searchbar-input",type:this.showSearchbar?"submit":"button",onClick:()=>this.openSearchbar()},this.showSearchbar?null:e("span",{class:"searchbar-button-label"},"Cerca"),e("z-icon",{key:"1616128d97c04a1e4768f163fcc20a21664daca4",name:"search"}))),this.renderSuggestions())}static get watchers(){return{searchQuery:["onSearchQueryChange"],searchArea:["onSearchAreaChange"],showSearchbar:["onShowSearchbarChange"],showSuggestions:["onShowSuggestionsChange"]}}};Q.style=O;export{v as zanit_menubar,S as zanit_mobile_menubar,Q as zanit_search_form};
2
+ //# sourceMappingURL=p-d53e0a87.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["containsTarget","ancestor","event","composedPath","filter","el","document","window","some","contains","moveFocus","current","next","tabIndex","focus","preventScroll","isArrowUpKey","key","isArrowDownKey","isTabKey","isEscKey","DEFAULT_GROUP_KEY","DEFAULT_GROUP","id","label","getGroupedItems","items","groups","reduce","grouped","item","itemGroup","find","group","push","sort","a","b","Menu","controlledBy","currentPath","onItemKeyDown","length","isActive","includes","h","class","role","undefined","map","highlight","href","active","onKeyDown","target","SearchEnv","S3_SHOP_URL","dev","test","prod","async","getSubjectsByArea","searchEnv","response","fetch","ok","Error","status","json","err","console","error","menubarCss","menuCss","ZanitMenubar","openMenu","openNavbar","isMobile","loading","data","searchQuery","PROD","searchArea","timerId","parseData","URL","this","fetchData","Promise","JSON","parse","Array","isArray","every","url","onItemsChange","initTabindex","onCurrentChange","split","Boolean","connectedCallback","mobileMediaQuery","matchMedia","matches","onchange","mql","handleOutsideClick","host","handleKeydown","preventDefault","menuTriggerId","setTimeout","menuTrigger","shadowRoot","getElementById","handleMouseover","clearTimeout","handleMouseout","handleFocusout","relatedTarget","querySelector","cause","querySelectorAll","forEach","menubar","index","setAttribute","menuItems","menuItem","navbarItems","navbarItem","showMenu","getParentMenubarElements","itemEl","from","closest","focusPreviousItem","menubarElements","currentIndex","indexOf","prevItem","ariaHasPopup","focusNextItem","nextItem","handleItemKeydown","stopPropagation","firstItem","lastItem","pop","openItemMenu","getPreviousGroup","groupContainer","getNextGroup","firstMenuItem","handleMenuKeydown","itemElement","currentGroup","nextGroup","getAttribute","focusedItem","nextGroupItems","prevGroup","prevGroupItems","render","_","Fragment","onPointerOver","name","width","height","onResetSearch","subitem","mobileMenubarCss","ZanitMobileMenubar","lastCurrent","parentItem","menuType","open","setupData","parent","menuItemsElement","toggleMenu","type","onClick","imageAlt","link","AREA_LABELS","AREA_ORDER","Object","keys","buildSuggestions","query","subjectsByArea","selectedArea","matchingSubjectAreas","findSubjectAreas","hasSubject","subject","toUpperCase","suggestions","buildWordSuggestion","orderedSubjectAreas","area","getAreaOrder","buildSubjectSuggestion","subjectArea","user_query","buildId","buildLabel","html_label","buildUrl","q","buildDetail","materia","string","c","charCodeAt","toString","join","params","URLSearchParams","isSubject","isHtml","openStrong","closeStrong","cleanedQuery","cleanSearch","entries","subjects","toLowerCase","s","replace","searchFormCss","ZanitSearchForm","formElement","timer","showSearchbar","_searchQuery","activeSuggestion","showSuggestions","onSearchQueryChange","openSearchbar","resetSuggestions","onSearchAreaChange","onShowSearchbarChange","onShowSuggestionsChange","search","resetSearch","handleEsc","handleTab","searchbarInput","resetSearchQuery","emit","handleInputChange","value","updateSuggestions","trim","onSearchSubmit","suggestion","submitSuggestionSearch","searchEv","defaultPrevented","submit","ev","location","handleSuggestionsNav","options","o","nextId","firstId","lastId","currOption","renderSuggestions","hidden","e","k","innerHTML","Host","searchbar","ref","method","action","onSubmit","onReset","disabled","placeholder","required","autocomplete","onInput"],"sources":["src/utils/utils.ts","src/components/menubar/menu/menu.tsx","src/utils/subjects.api.ts","src/components/menubar/menubar.css?tag=zanit-menubar&encapsulation=shadow","src/components/menubar/menu/menu.css?tag=zanit-menubar&encapsulation=shadow","src/components/menubar/menubar.tsx","src/components/menubar/mobile-menubar/mobile-menubar.css?tag=zanit-mobile-menubar&encapsulation=shadow","src/components/menubar/menu/menu.css?tag=zanit-mobile-menubar&encapsulation=shadow","src/components/menubar/mobile-menubar/mobile-menubar.tsx","src/components/menubar/search-form/suggestions.ts","src/components/menubar/search-form/search-form.css?tag=zanit-search-form&encapsulation=shadow","src/components/menubar/search-form/search-form.tsx"],"sourcesContent":["/**\n * Check if an element contains an event target by checking its composedPath.\n * Useful when an event target may come from a component's shadow DOM.\n */\nexport const containsTarget = (ancestor: HTMLElement, event: Event) => {\n return event\n .composedPath()\n .filter((el) => el !== document && el !== window.window)\n .some((el) => ancestor.contains(el as HTMLElement));\n};\n\n/** Move the focus to `next` element, set tabindex to 0 for `next` and -1 to `current`. */\nexport const moveFocus = (current: HTMLElement, next: HTMLElement) => {\n current.tabIndex = -1;\n next.tabIndex = 0;\n next.focus({ preventScroll: true });\n};\n\n/** Check if event key is ArrowUp */\nexport const isArrowUpKey = (event: KeyboardEvent) => event.key === 'ArrowUp';\n\n/** Check if event key is ArrowDown */\nexport const isArrowDownKey = (event: KeyboardEvent) => event.key === 'ArrowDown';\n\n/** Check if event key is Tab */\nexport const isTabKey = (event: KeyboardEvent) => event.key === 'Tab';\n\n/** Check if event key is Escape */\nexport const isEscKey = (event: KeyboardEvent) => event.key === 'Escape';\n","import { FunctionalComponent, h } from '@stencil/core';\nimport { MenuItem } from '../../../utils';\n\n/**\n * Menu of items that can be grouped.\n * @member {string} controlledBy - The HTML id of the element that controls the menu.\n * @member {MenuItem[]} items - The items to show in the menu.\n * @member {string[]} currentPath - Path of current item.\n * @member {function} onItemKeyDown - The function to call when a key is pressed from a menuitem.\n */\nexport interface MenuProps {\n controlledBy?: string;\n items?: MenuItem[];\n currentPath?: string[];\n onItemKeyDown?: (event: KeyboardEvent) => void;\n}\n\nconst DEFAULT_GROUP_KEY = 'default';\nconst DEFAULT_GROUP = {\n id: DEFAULT_GROUP_KEY,\n label: DEFAULT_GROUP_KEY,\n};\n\n/** Get the items grouped by their group. */\nconst getGroupedItems = (items: MenuItem[]) => {\n const groups = items.reduce<{ group: MenuProps['items'][number]['group']; items: MenuItem[] }[]>((grouped, item) => {\n const itemGroup = grouped.find(({ group }) => group.id === (item.group?.id || DEFAULT_GROUP.id));\n if (!itemGroup) {\n grouped.push({ group: item.group ?? DEFAULT_GROUP, items: [item] });\n } else {\n itemGroup.items.push(item);\n }\n\n return grouped;\n }, []);\n\n // Sort to keep default group at the end\n return groups.sort((a, b) => (a.group.id === DEFAULT_GROUP_KEY ? 1 : b.group.id === DEFAULT_GROUP_KEY ? -1 : 0));\n};\n\n/**\n * Floating menu component. It shows a list of items that can be grouped.\n */\nexport const Menu: FunctionalComponent<MenuProps> = ({ controlledBy, items, currentPath = [], onItemKeyDown }) => {\n if (!items?.length) {\n return null;\n }\n\n const groups = getGroupedItems(items);\n\n const isActive = (item: MenuItem) => currentPath.includes(controlledBy) && currentPath.includes(item.id);\n\n return (\n <div\n class=\"menu-wrapper\"\n role=\"none\"\n >\n <div\n class=\"menu\"\n aria-labelledby={controlledBy ?? undefined}\n role=\"menu\"\n >\n {groups.map(({ group, items }) => (\n <div class={{ group: true, highlight: items.some((item) => item.highlight) }}>\n {group.id !== DEFAULT_GROUP_KEY ? (\n <div\n class=\"group-name\"\n id={group.id}\n >\n {group.label}\n </div>\n ) : groups.length > 1 ? (\n // empty div to keep the same height as the other groups\n <div class=\"group-name\" />\n ) : null}\n <ul\n class=\"menu-list\"\n role=\"group\"\n aria-labelledby={group.id !== DEFAULT_GROUP_KEY ? group.id : undefined}\n >\n {items.map((item) => (\n <li role=\"none\">\n {item.href && (\n <a\n class={{\n 'menu-item': true,\n 'active': isActive(item),\n }}\n href={item.href}\n role=\"menuitem\"\n tabIndex={-1}\n aria-current={isActive(item) ? 'page' : 'false'}\n onKeyDown={(event) => onItemKeyDown(event)}\n target={item.target}\n >\n {item.label}\n </a>\n )}\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n </div>\n );\n};\n","export enum SearchEnv {\n DEV = 'dev',\n TEST = 'test',\n PROD = 'prod',\n}\n\nconst S3_SHOP_URL: Record<string, string> = {\n dev: 'https://zanichelli-shop-dev.s3.eu-west-1.amazonaws.com',\n test: 'https://zanichelli-shop-test.s3.eu-west-1.amazonaws.com',\n prod: 'https://zanichelli-shop.s3.eu-west-1.amazonaws.com',\n};\n\nexport async function getSubjectsByArea(searchEnv: SearchEnv): Promise<Record<string, string[]>> {\n try {\n const response = await fetch(`${S3_SHOP_URL[searchEnv]}/categories.json`);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n return await response.json();\n } catch (err) {\n console.error('Error fetching subjects:', err);\n return {};\n }\n}\n",":host {\n --zanit-menubar-max-width: ;\n --zanit-menubar-top-offset: ;\n\n position: relative;\n z-index: 2;\n display: flex;\n width: 100%;\n background-color: #fff;\n color: var(--gray900);\n font-family: var(--font-family-sans);\n}\n\n:host,\n*,\n::before,\n::after {\n box-sizing: border-box;\n}\n\n*:focus:focus-visible {\n box-shadow: var(--shadow-focus-primary);\n outline: none;\n}\n\nul {\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\na {\n color: var(--gray900);\n cursor: pointer;\n text-decoration: none;\n}\n\nbutton {\n all: unset;\n cursor: pointer;\n}\n\n:host nav {\n width: 100%;\n}\n\n.shadow-wrapper {\n position: relative;\n z-index: 1;\n display: flex;\n width: 100%;\n}\n\n.shadow-wrapper::after {\n position: absolute;\n top: 0;\n right: 0;\n width: 100%;\n height: 100%;\n background: transparent;\n box-shadow: var(--shadow-1);\n content: '';\n pointer-events: none;\n}\n\n.width-limiter {\n position: relative;\n display: flex;\n width: 100%;\n max-width: var(--zanit-menubar-max-width, 1366px);\n margin: 0 auto;\n}\n\n.shadow-wrapper + .shadow-wrapper {\n z-index: 0;\n}\n\n.sub-menubar > ul {\n gap: 28px;\n}\n\n.width-limiter > ul,\n.sub-menubar > ul {\n position: relative;\n z-index: 3;\n display: flex;\n width: 100%;\n align-items: center;\n padding: 0 var(--grid-margin);\n margin-right: auto;\n margin-left: auto;\n gap: 20px;\n}\n\n.shadow-wrapper > .width-limiter,\n.shadow-wrapper > ul {\n width: 100%;\n max-width: var(--zanit-menubar-max-width, 1366px);\n}\n\nul.menubar {\n padding-right: 0;\n height: 3rem;\n}\n\n.menubar z-ghost-loading {\n display: block;\n width: 120px;\n height: 1.25rem;\n}\n\n/* separator bar */\n.menubar > li[role='separator'] {\n width: 1px;\n height: 1.25rem;\n background-color: #000;\n}\n\n.menubar-item {\n position: relative;\n display: flex;\n align-items: center;\n padding: 14px 0;\n font-size: 1rem;\n gap: 8px;\n line-height: 1.25rem;\n}\n\n.menubar .menubar-item {\n text-transform: uppercase;\n}\n\n.menubar-item [data-text] {\n display: flex;\n flex-direction: column;\n}\n\n.menubar-item.active > [data-text],\n.menubar-item:hover > [data-text],\n.menubar-item:focus:focus-visible > [data-text] {\n font-weight: var(--font-bd);\n}\n\n/* To avoid size changes in the element, when it is hovered and becomes bold,\nwe put the same text already bold with height 0, so as to always occupy the maximum necessary width. */\n.menubar-item > [data-text]::after {\n height: 0;\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/* active item bottom border */\n.sub-menubar .menubar-item.active::after {\n position: absolute;\n z-index: -1;\n bottom: 0;\n left: -4px;\n width: calc(100% + 8px); /* the border is 4px per side larger than its container */\n height: 4px;\n background-color: var(--red500);\n content: '';\n}\n\nzanit-search-form {\n margin-left: auto;\n}\n",".menu-wrapper {\n width: 100%;\n background-color: #fff;\n}\n\n.menu {\n position: relative;\n display: flex;\n width: 100%;\n flex-direction: column;\n gap: 32px 0;\n}\n\n.menu .group {\n display: flex;\n flex-direction: column;\n}\n\n.menu .group .group-name {\n border-bottom: 1px solid currentcolor;\n margin-bottom: 4px;\n color: var(--red500);\n font-size: 0.875rem;\n font-weight: var(--font-md);\n}\n\n.menu .group .menu-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.menu .group .menu-list .menu-item {\n display: block;\n border-bottom: 2px solid transparent;\n font-size: 0.875rem;\n font-weight: var(--font-md);\n}\n\n.menu .menu-list .menu-item.active,\n.menu .menu-list .menu-item:hover {\n border-bottom-color: var(--red500);\n}\n\n.menu .group.highlight .menu-list .menu-item {\n font-size: 1rem;\n}\n\n@media (width >= 768px) {\n .menu-wrapper {\n position: absolute;\n top: 100%;\n left: 0;\n display: flex;\n justify-content: center;\n box-shadow: var(--shadow-1);\n }\n\n .menu {\n display: grid;\n width: 100%;\n max-width: var(--zanit-menubar-max-width, 1366px);\n padding: 16px var(--grid-margin);\n gap: 0 24px;\n grid-auto-columns: minmax(0, max-content);\n grid-auto-flow: column;\n grid-template-rows: minmax(0, max-content) max-content;\n }\n\n .menu .group {\n display: grid;\n grid-row: 1 / -1;\n grid-template-columns: 1fr;\n grid-template-rows: subgrid;\n }\n\n @supports not (grid-template-rows: subgrid) {\n .menu .group {\n grid-template-rows: repeat(auto-fit, minmax(0, max-content));\n }\n }\n\n .menu .group .group-name {\n border: none;\n margin-bottom: 16px;\n }\n\n .menu .group .menu-list .menu-item {\n font-size: 1rem;\n }\n\n .menu .group.highlight .menu-list .menu-item {\n font-size: 1.5rem;\n }\n}\n","import { Component, Element, Fragment, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport { MenubarItem, containsTarget, moveFocus } from '../../utils';\nimport { Menu } from './menu/menu';\nimport { SearchEnv } from '../../utils/subjects.api';\n\n/**\n * Main menubar component. Each item can have a menu with subitems\n * When a main menubar item is the current active one, a sub-menubar is shown and each subitem can have a menu with subitems.\n * @cssprop {--zanit-menubar-max-width} Maximum width of the menubar.\n */\n@Component({\n tag: 'zanit-menubar',\n styleUrls: ['menubar.css', 'menu/menu.css'],\n shadow: {\n delegatesFocus: true,\n },\n})\nexport class ZanitMenubar {\n @Element() host: HTMLZanitMenubarElement;\n\n /** Menubar items extracted from `data`. */\n @State()\n items: MenubarItem[] = [];\n\n /** ID of the currently open menu. */\n @State()\n openMenu: string | undefined = undefined;\n\n /** ID of the item to show the subitems navbar for. */\n @State()\n openNavbar: string | undefined = undefined;\n\n /** IDs of the current prop */\n @State()\n currentPath: string[] = [];\n\n @State()\n isMobile: boolean = false;\n\n @State()\n loading: boolean = false;\n\n /** The data to build the menu (as an array of `MenubarItem` or a JSON array) or the url to fetch to retrieve it. */\n @Prop()\n data: Promise<MenubarItem[]> | MenubarItem[] | URL | string;\n\n /** Path of the current item. */\n @Prop()\n current: string | undefined = undefined;\n\n /** Initial search query. */\n @Prop({ mutable: true })\n searchQuery: string | undefined = undefined;\n\n /** Environment for search suggestions */\n @Prop() searchEnv: SearchEnv = SearchEnv.PROD;\n\n /** Search area (e.g. \"SCUOLA\", \"UNIVERSITÀ\", \"DIZIONARI\"). */\n @Prop() searchArea?: string | undefined;\n\n private timerId: number;\n\n /** Setup the list of items. */\n @Watch('data')\n async parseData(data: typeof this.data) {\n if (!data) {\n return;\n }\n\n if (data instanceof URL) {\n this.items = await this.fetchData(data);\n } else if (data instanceof Promise) {\n this.loading = true;\n this.items = await data;\n this.loading = false;\n } else if (typeof data === 'string') {\n try {\n this.items = JSON.parse(data);\n if (!Array.isArray(this.items) || !this.items?.every((item) => item satisfies MenubarItem)) {\n throw new Error('Expected an array of MenubarItem objects.');\n }\n } catch {\n let url: URL;\n try {\n url = new URL(data);\n } catch {\n throw new Error('Invalid string provided for `data` property: not a valid url or JSON.');\n }\n\n this.items = await this.fetchData(url);\n }\n } else if (Array.isArray(data) && data.every((item) => item satisfies MenubarItem)) {\n this.items = data;\n } else {\n throw new Error(\n 'Invalid `data` property value. Expected an url, a JSON or an array/promise of MenubarItem objects.'\n );\n }\n }\n\n @Watch('items')\n onItemsChange() {\n this.initTabindex();\n }\n\n @Watch('current')\n onCurrentChange() {\n this.currentPath = this.current?.split('/').filter(Boolean) || [];\n }\n\n async connectedCallback() {\n const mobileMediaQuery = window.matchMedia('(width < 768px)');\n this.isMobile = mobileMediaQuery.matches;\n mobileMediaQuery.onchange = (mql) => {\n this.isMobile = mql.matches;\n this.initTabindex();\n this.openMenu = undefined;\n };\n await this.parseData(this.data);\n this.onCurrentChange();\n this.initTabindex();\n }\n\n /** Close any open menu when clicking outside. */\n @Listen('click', { target: 'document', passive: true })\n handleOutsideClick(event: MouseEvent) {\n if (!this.openMenu || containsTarget(this.host, event)) {\n return;\n }\n\n this.openMenu = undefined;\n }\n\n /** Close any open menu when pressing Escape or Tab.\n * Uses document-level listener to ensure Escape works from any focus location within the menu.\n */\n @Listen('keydown', { target: 'document', passive: true })\n handleKeydown(event: KeyboardEvent) {\n switch (event.key) {\n case 'Escape': {\n if (this.openMenu) {\n event.preventDefault();\n // Return focus to the menu trigger after closing\n const menuTriggerId = this.openMenu;\n this.openMenu = undefined;\n // Use setTimeout(0) to defer focus until after Stencil's render cycle completes\n setTimeout(() => {\n const menuTrigger = this.host.shadowRoot.getElementById(menuTriggerId);\n if (menuTrigger) {\n menuTrigger.focus();\n }\n }, 0);\n }\n break;\n }\n case 'Tab':\n this.openMenu = undefined;\n break;\n }\n }\n\n @Listen('mouseover', { passive: true })\n handleMouseover() {\n clearTimeout(this.timerId);\n }\n\n /**\n * Automatically close any open menu on mouseout after with a little delay.\n * The delay is useful to avoid immediate closing when the pointer briefly leaves the component.\n */\n @Listen('mouseout', { passive: true })\n handleMouseout(event: MouseEvent) {\n this.timerId = window.setTimeout(() => {\n if (!this.openMenu || containsTarget(this.host, event)) {\n return;\n }\n\n this.openMenu = undefined;\n }, 500);\n }\n\n /** Close the menu when it loses focus. */\n @Listen('focusout', { passive: true })\n handleFocusout(event: FocusEvent) {\n const relatedTarget = event.relatedTarget as HTMLElement;\n if (!this.openMenu || this.host.shadowRoot.querySelector('.menu')?.contains(relatedTarget)) {\n return;\n }\n\n this.openMenu = undefined;\n }\n\n /** Fetch data from passed URL. */\n private async fetchData(url: URL) {\n try {\n this.loading = true;\n const data = await (await fetch(url)).json();\n this.loading = false;\n if (!Array.isArray(data) || !data.every((item) => item satisfies MenubarItem)) {\n throw new Error('Invalid data structure. Expected an array of MenuItem objects.');\n }\n\n return data as MenubarItem[];\n } catch (error) {\n this.loading = false;\n console.error('Error fetching menubar data:', error);\n throw new Error('Failed to fetch menubar data from the provided URL.', { cause: error });\n }\n }\n\n /** Initialize tabindex on menuitems of menubars, setting -1 to all but the first one. */\n private initTabindex() {\n setTimeout(() => {\n this.host.shadowRoot.querySelectorAll('[role=\"menubar\"]')?.forEach((menubar) => {\n menubar\n .querySelectorAll('[role=\"menuitem\"]')\n ?.forEach((item, index) => item.setAttribute('tabindex', index === 0 ? '0' : '-1'));\n });\n }, 100);\n }\n\n /** Indicates whether the element has to be highlighted by checking whether it is set as current or one of its descendants is. */\n private isActive(item: MenubarItem) {\n if (this.currentPath.length === 0) {\n return false;\n }\n\n if (this.currentPath.includes(item.id)) {\n return true;\n }\n\n if (item.menuItems?.length) {\n return item.menuItems.some((menuItem) => menuItem.id === this.current);\n }\n\n if (item.navbarItems?.length) {\n const isActive = item.navbarItems.some((navbarItem) => this.isActive(navbarItem));\n if (isActive) {\n return true;\n }\n }\n\n return false;\n }\n\n /** Opens the menu associated with the menubar `item`, if any. */\n private showMenu(item: MenubarItem) {\n this.openMenu = undefined; // close any open menu first\n if (!item.menuItems?.length) {\n return;\n }\n\n this.openMenu = item.id;\n }\n\n /** Get all elements with `menuitem` role inside parent's `menubar`. * */\n private getParentMenubarElements(itemEl: HTMLElement) {\n return Array.from(\n itemEl?.closest('[role=\"menubar\"]')?.querySelectorAll(':scope > li a[role=\"menuitem\"]') ?? []\n ) as HTMLElement[];\n }\n\n /** Move the focus to the previous menubar item, or the last one. Then open its menu if any other menu was open. */\n private focusPreviousItem(itemEl: HTMLElement) {\n this.openMenu = undefined; // close any open menu first\n const menubarElements = this.getParentMenubarElements(itemEl);\n const currentIndex = menubarElements.indexOf(itemEl);\n const prevItem = menubarElements[(currentIndex - 1 + menubarElements.length) % menubarElements.length]; // get previous item or last one\n moveFocus(itemEl, prevItem);\n // open the item's menu if any other menu was open\n if (prevItem.ariaHasPopup === 'true' && this.openMenu) {\n this.openMenu = prevItem.id;\n }\n }\n\n /** Move the focus to the next menubar item, or the first one. Then open its menu if any other menu was open. */\n private focusNextItem(itemEl: HTMLElement) {\n this.openMenu = undefined; // close any open menu first\n const menubarElements = this.getParentMenubarElements(itemEl);\n const currentIndex = menubarElements.indexOf(itemEl);\n const nextItem = menubarElements[(currentIndex + 1) % menubarElements.length]; // get next item or first one\n moveFocus(itemEl, nextItem);\n // open the item's menu if any other menu was open\n if (nextItem.ariaHasPopup === 'true' && this.openMenu) {\n this.openMenu = nextItem.id;\n }\n }\n\n /** Handles keyboard navigation on menubar items. */\n private handleItemKeydown(event: KeyboardEvent, item: MenubarItem) {\n const target = event.target as HTMLElement;\n switch (event.key) {\n case 'Home': {\n event.preventDefault();\n event.stopPropagation();\n const firstItem = this.getParentMenubarElements(target)[0];\n moveFocus(target, firstItem);\n break;\n }\n case 'End': {\n event.preventDefault();\n event.stopPropagation();\n const lastItem = this.getParentMenubarElements(target).pop();\n moveFocus(target, lastItem);\n break;\n }\n case 'ArrowUp': {\n if (!item.menuItems?.length) {\n break;\n }\n event.preventDefault();\n event.stopPropagation();\n this.openMenu = item.id;\n // focus last item of the menu\n setTimeout(() => {\n const menuItems = Array.from(\n this.host.shadowRoot.querySelectorAll(`[aria-labelledby=${item.id}] [role=\"menuitem\"]`)\n ) as HTMLElement[];\n moveFocus(target, menuItems[menuItems.length - 1]);\n }, 100);\n break;\n }\n case 'ArrowRight': {\n event.preventDefault();\n event.stopPropagation();\n this.focusNextItem(target);\n break;\n }\n case 'ArrowDown': {\n if (!item.menuItems?.length) {\n break;\n }\n\n this.openItemMenu(item);\n break;\n }\n case 'ArrowLeft': {\n event.preventDefault();\n event.stopPropagation();\n this.focusPreviousItem(target);\n break;\n }\n case ' ': {\n event.preventDefault();\n event.stopPropagation();\n if (this.openMenu === item.id) {\n this.openMenu = undefined;\n break;\n } else if (item.menuItems?.length) {\n this.openItemMenu(item);\n break;\n }\n }\n }\n }\n\n /** Get the previous element with `role=group`. */\n private getPreviousGroup(groupContainer: HTMLElement) {\n const groups = Array.from(\n groupContainer?.closest('[role=\"menu\"]')?.querySelectorAll('[role=\"group\"]') ?? []\n ) as HTMLElement[];\n const currentIndex = groups.indexOf(groupContainer);\n\n return groups[currentIndex - 1];\n }\n\n /** Get the next element with `role=group`. */\n private getNextGroup(groupContainer: HTMLElement) {\n const groups = Array.from(\n groupContainer?.closest('[role=\"menu\"]')?.querySelectorAll('[role=\"group\"]') ?? []\n ) as HTMLElement[];\n const currentIndex = groups.indexOf(groupContainer);\n\n return groups[currentIndex + 1];\n }\n\n private openItemMenu(item: MenubarItem) {\n this.openMenu = item.id;\n setTimeout(() => {\n // focus first item of the menu\n const firstMenuItem = this.host.shadowRoot.querySelector(\n `[aria-labelledby=${item.id}] [role=\"menuitem\"]`\n ) as HTMLElement;\n firstMenuItem.tabIndex = 0;\n firstMenuItem.focus({ preventScroll: true });\n }, 100);\n }\n\n /** Handles keyboard navigation events from `Menu` component. */\n private handleMenuKeydown(event: KeyboardEvent) {\n const itemElement = event.target as HTMLElement;\n const items = Array.from(\n itemElement.closest('[role=\"menu\"]')?.querySelectorAll('[role=\"menuitem\"]') ?? []\n ) as HTMLElement[];\n const currentIndex = items.indexOf(itemElement);\n switch (event.key) {\n case 'ArrowUp': {\n event.preventDefault();\n event.stopPropagation();\n const prevItem = items[currentIndex - 1] || items[items.length - 1];\n moveFocus(itemElement, prevItem);\n break;\n }\n // Move the focus to the first item of the next group if any, otherwise move it to the next menubar item\n case 'ArrowRight': {\n event.preventDefault();\n event.stopPropagation();\n const currentGroup = itemElement.closest('[role=group]') as HTMLElement;\n const nextGroup = this.getNextGroup(currentGroup);\n if (!nextGroup) {\n itemElement.tabIndex = -1;\n const menuTriggerId = itemElement.closest('[role=\"menu\"][aria-labelledby]').getAttribute('aria-labelledby');\n const focusedItem = this.host.shadowRoot.getElementById(menuTriggerId);\n this.focusNextItem(focusedItem);\n break;\n }\n\n const nextGroupItems = (nextGroup.querySelectorAll('[role=\"menuitem\"]') ?? []) as HTMLElement[];\n moveFocus(itemElement, nextGroupItems[0]);\n break;\n }\n case 'ArrowDown': {\n event.preventDefault();\n event.stopPropagation();\n const nextItem = items[currentIndex + 1] || items[0];\n moveFocus(itemElement, nextItem);\n break;\n }\n // Move the focus to the first item of the previous group if any, otherwise move it to the previous menubar item\n case 'ArrowLeft': {\n event.preventDefault();\n event.stopPropagation();\n const currentGroup = itemElement.closest('[role=group]') as HTMLElement;\n const prevGroup = this.getPreviousGroup(currentGroup);\n if (!prevGroup) {\n itemElement.tabIndex = -1;\n const menuTriggerId = itemElement.closest('[role=\"menu\"][aria-labelledby]').getAttribute('aria-labelledby');\n const focusedItem = this.host.shadowRoot.getElementById(menuTriggerId);\n this.focusPreviousItem(focusedItem);\n break;\n }\n\n const prevGroupItems = (prevGroup.querySelectorAll('[role=\"menuitem\"]') ?? []) as HTMLElement[];\n moveFocus(itemElement, prevGroupItems[0]);\n break;\n }\n case 'Home':\n // Move to the first menu item\n event.preventDefault();\n event.stopPropagation();\n moveFocus(itemElement, items[0]);\n break;\n case 'End':\n // Move to the last menu item\n event.preventDefault();\n event.stopPropagation();\n moveFocus(itemElement, items[items.length - 1]);\n break;\n }\n }\n\n render() {\n if (this.isMobile) {\n return (\n <zanit-mobile-menubar\n items={this.items}\n currentPath={this.currentPath}\n searchQuery={this.searchQuery}\n loading={this.loading}\n searchArea={this.searchArea}\n searchEnv={this.searchEnv}\n />\n );\n }\n\n return (\n <nav aria-label=\"Zanichelli.it\">\n <div class=\"shadow-wrapper\">\n <div class=\"width-limiter\">\n <ul\n class=\"menubar\"\n role=\"menubar\"\n aria-label=\"Zanichelli.it\"\n >\n {this.loading &&\n [...new Array(4)].map((_, index) => (\n <Fragment>\n <li role=\"none\">\n <div class=\"menubar-item\">\n <z-ghost-loading></z-ghost-loading>\n </div>\n </li>\n {index < 3 && <li role=\"separator\"></li>}\n </Fragment>\n ))}\n {this.items?.map((item, index) => (\n <Fragment>\n <li role=\"none\">\n <a\n class={{\n 'menubar-item': true,\n 'active': this.isActive(item),\n }}\n href={item.href}\n id={item.id}\n role=\"menuitem\"\n tabIndex={-1}\n aria-expanded={\n item.menuItems?.length ? (this.openMenu === item.id ? 'true' : 'false') : undefined\n }\n aria-haspopup={item.menuItems?.length ? 'true' : 'false'}\n aria-current={this.current.includes(item.id) ? 'page' : 'false'}\n onPointerOver={() => this.showMenu(item)}\n onKeyDown={(event) => this.handleItemKeydown(event, item)}\n target={item.target}\n >\n <span data-text={item.label}>{item.label}</span>\n {item.menuItems?.length > 0 && (\n <z-icon\n name={this.openMenu === item.id ? 'chevron-up' : 'chevron-down'}\n width=\"0.875rem\"\n height=\"0.875rem\"\n />\n )}\n </a>\n </li>\n {index < this.items?.length - 1 && <li role=\"separator\"></li>}\n </Fragment>\n ))}\n </ul>\n <zanit-search-form\n searchQuery={this.searchQuery}\n searchArea={this.searchArea}\n searchEnv={this.searchEnv}\n onResetSearch={() => (this.searchQuery = undefined)}\n />\n </div>\n\n {this.items.map(\n (item) =>\n this.openMenu === item.id && (\n <Menu\n controlledBy={item.id}\n items={item.menuItems}\n currentPath={this.currentPath}\n onItemKeyDown={(event) => this.handleMenuKeydown(event)}\n />\n )\n )}\n </div>\n\n {this.items\n ?.filter((item) => this.isActive(item))\n .map(\n (item) =>\n item.navbarItems?.length && (\n <nav\n class={{ 'sub-menubar': true, 'shadow-wrapper': true }}\n aria-label={`Sezioni: ${item.label}`}\n >\n <ul role=\"menubar\">\n {item.navbarItems.map((subitem) => (\n <Fragment>\n <li role=\"none\">\n <a\n class={{\n 'menubar-item': true,\n 'active': this.isActive(subitem),\n }}\n href={subitem.href}\n id={subitem.id}\n role=\"menuitem\"\n tabIndex={-1}\n aria-haspopup={subitem.menuItems?.length ? 'true' : 'false'}\n aria-expanded={\n subitem.menuItems?.length ? (this.openMenu === subitem.id ? 'true' : 'false') : undefined\n }\n aria-current={this.current.includes(subitem.id) ? 'page' : 'false'}\n onPointerOver={() => this.showMenu(subitem)}\n onKeyDown={(event) => this.handleItemKeydown(event, subitem)}\n target={item.target}\n >\n <span>{subitem.label}</span>\n {subitem.menuItems?.length > 0 && (\n <z-icon\n name={this.openMenu === subitem.id ? 'chevron-up' : 'chevron-down'}\n width=\"0.75rem\"\n height=\"0.75rem\"\n />\n )}\n </a>\n </li>\n </Fragment>\n ))}\n </ul>\n {item.navbarItems.map(\n (subitem) =>\n this.openMenu === subitem.id && (\n <Menu\n controlledBy={subitem.id}\n items={subitem.menuItems}\n currentPath={this.currentPath}\n onItemKeyDown={(event) => this.handleMenuKeydown(event)}\n />\n )\n )}\n </nav>\n )\n )}\n </nav>\n );\n }\n}\n",":host {\n position: relative;\n z-index: 2;\n display: block;\n width: 100%;\n max-width: 100%;\n height: 3rem;\n background-color: #fff;\n color: var(--gray900);\n fill: var(--gray900);\n font-family: var(--font-family-sans);\n}\n\n:host,\n*,\n::before,\n::after {\n box-sizing: border-box;\n}\n\n*:focus:focus-visible {\n box-shadow: var(--shadow-focus-primary);\n outline: none;\n}\n\nul {\n padding: 0;\n margin: 0;\n list-style: none;\n}\n\na {\n color: var(--gray900);\n cursor: pointer;\n text-decoration: none;\n}\n\nbutton {\n all: unset;\n cursor: pointer;\n}\n\nnav {\n display: flex;\n width: 100%;\n align-items: center;\n padding-left: var(--grid-margin);\n gap: 8px;\n}\n\nnav::after {\n position: absolute;\n top: 0;\n right: 0;\n width: 100%;\n height: 100%;\n background: transparent;\n box-shadow: var(--shadow-1);\n content: '';\n pointer-events: none;\n}\n\nz-logo {\n margin: 8px 0;\n}\n\n.mobile-menu {\n position: absolute;\n top: 100%;\n left: 0;\n display: flex;\n overflow: auto;\n width: 100%;\n max-height: calc(100vh - 48px - var(--zanit-menubar-top-offset, 0px));\n flex-direction: column;\n padding: 16px var(--grid-margin) 32px;\n background-color: #fff;\n box-shadow: var(--shadow-2);\n gap: 8px;\n}\n\n.mobile-menu li {\n width: 100%;\n}\n\n.mobile-menu .items-container {\n display: flex;\n min-height: 256px;\n flex-direction: column;\n gap: 8px;\n}\n\n.mobile-menu .items-container z-ghost-loading {\n width: 40%;\n height: 1.2rem;\n}\n\n.mobile-menu .items-container .menubar-item {\n display: block;\n width: 100%;\n padding: 8px 0;\n font-size: 1rem;\n text-align: left;\n}\n\n.mobile-menu .items-container li:not(:last-child) .menubar-item {\n border-bottom: 1px solid #000;\n}\n\n[role='menuitem'].parent {\n display: flex;\n width: fit-content;\n align-items: center;\n padding: 0;\n border: none;\n font-size: 0.875rem;\n gap: 8px;\n}\n\nzanit-search-form {\n margin-left: auto;\n}\n",".menu-wrapper {\n width: 100%;\n background-color: #fff;\n}\n\n.menu {\n position: relative;\n display: flex;\n width: 100%;\n flex-direction: column;\n gap: 32px 0;\n}\n\n.menu .group {\n display: flex;\n flex-direction: column;\n}\n\n.menu .group .group-name {\n border-bottom: 1px solid currentcolor;\n margin-bottom: 4px;\n color: var(--red500);\n font-size: 0.875rem;\n font-weight: var(--font-md);\n}\n\n.menu .group .menu-list {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.menu .group .menu-list .menu-item {\n display: block;\n border-bottom: 2px solid transparent;\n font-size: 0.875rem;\n font-weight: var(--font-md);\n}\n\n.menu .menu-list .menu-item.active,\n.menu .menu-list .menu-item:hover {\n border-bottom-color: var(--red500);\n}\n\n.menu .group.highlight .menu-list .menu-item {\n font-size: 1rem;\n}\n\n@media (width >= 768px) {\n .menu-wrapper {\n position: absolute;\n top: 100%;\n left: 0;\n display: flex;\n justify-content: center;\n box-shadow: var(--shadow-1);\n }\n\n .menu {\n display: grid;\n width: 100%;\n max-width: var(--zanit-menubar-max-width, 1366px);\n padding: 16px var(--grid-margin);\n gap: 0 24px;\n grid-auto-columns: minmax(0, max-content);\n grid-auto-flow: column;\n grid-template-rows: minmax(0, max-content) max-content;\n }\n\n .menu .group {\n display: grid;\n grid-row: 1 / -1;\n grid-template-columns: 1fr;\n grid-template-rows: subgrid;\n }\n\n @supports not (grid-template-rows: subgrid) {\n .menu .group {\n grid-template-rows: repeat(auto-fit, minmax(0, max-content));\n }\n }\n\n .menu .group .group-name {\n border: none;\n margin-bottom: 16px;\n }\n\n .menu .group .menu-list .menu-item {\n font-size: 1rem;\n }\n\n .menu .group.highlight .menu-list .menu-item {\n font-size: 1.5rem;\n }\n}\n","import { Component, Element, h, Listen, Prop, State, Watch } from '@stencil/core';\nimport { MenubarItem, MenuItem } from '../../../utils';\nimport { Menu } from '../menu/menu';\nimport { containsTarget, moveFocus } from '../../../utils';\nimport { SearchEnv } from '../../../utils/subjects.api';\n\n/** Mobile menubar component. */\n@Component({\n tag: 'zanit-mobile-menubar',\n styleUrls: ['mobile-menubar.css', '../menu/menu.css'],\n shadow: {\n delegatesFocus: true,\n },\n})\nexport class ZanitMobileMenubar {\n @Element() host: HTMLZanitMobileMenubarElement;\n\n /** IDs path of the current item. */\n @Prop() currentPath: string[] = [];\n\n /** Menubar items. */\n @Prop() items: MenubarItem[] = [];\n\n /** Initial search query. */\n @Prop({ mutable: true }) searchQuery: string | undefined = undefined;\n\n /** Whether the menubar is loading the data. */\n @Prop() loading: boolean = false;\n\n /** Environment for search suggestions */\n @Prop() searchEnv: SearchEnv = SearchEnv.PROD;\n\n /** Search area (e.g. \"SCUOLA\", \"UNIVERSITÀ\", \"DIZIONARI\"). */\n @Prop() searchArea?: string | undefined;\n\n /** Last active item ID. */\n @State() lastCurrent: string | undefined = undefined;\n @State() parentItem: MenubarItem | undefined = undefined;\n @State() menuItems: MenubarItem[] | MenuItem[] | undefined = undefined;\n /** Whether the items to render come from a menubar or a menu. */\n @State() menuType: 'menubar' | 'menu' | undefined = undefined;\n @State() open: boolean;\n\n @Watch('items')\n @Watch('currentPath')\n onItemsChange() {\n this.lastCurrent = this.currentPath?.length ? this.currentPath[this.currentPath.length - 1] : undefined;\n this.setupData(this.items);\n }\n\n /**\n * Find the current item and take its parent, `menuItems` or the `navbarItems`.\n */\n private setupData(items: MenubarItem[], parent?: MenubarItem) {\n // If no current item is defined, we show all items\n if (this.lastCurrent === undefined) {\n this.parentItem = undefined;\n this.menuType = 'menubar';\n this.menuItems = items;\n return;\n }\n\n for (const item of items) {\n if (item.id === this.lastCurrent) {\n this.parentItem = parent;\n this.menuType = item.menuItems?.length ? 'menu' : 'menubar';\n this.menuItems = item.menuItems || item.navbarItems;\n return;\n }\n\n if (\n this.currentPath.length > 1 &&\n item.id === this.currentPath[this.currentPath.length - 2] &&\n item.menuItems?.some(({ id }) => id === this.lastCurrent)\n ) {\n this.parentItem = item;\n this.menuType = item.menuItems?.length ? 'menu' : 'menubar';\n this.menuItems = item.menuItems || item.navbarItems;\n return;\n }\n\n if (item.navbarItems?.length) {\n this.setupData(item.navbarItems, item);\n }\n }\n }\n\n private get menuItemsElement() {\n return Array.from(this.host.shadowRoot.querySelectorAll('[role=\"menuitem\"]')) as HTMLElement[];\n }\n\n /** Initialize tabindex on menuitems, setting -1 to all but the first one. */\n private initTabindex() {\n this.menuItemsElement.forEach((item, index) => item.setAttribute('tabindex', index === 0 ? '0' : '-1'));\n }\n\n private toggleMenu() {\n if (this.open) {\n this.open = false;\n } else {\n this.open = true;\n setTimeout(() => {\n this.initTabindex();\n this.menuItemsElement[0]?.focus({ preventScroll: true });\n }, 200);\n }\n }\n\n /** Handles keyboard navigation on mobile menu. */\n private handleItemKeydown(event: KeyboardEvent) {\n switch (event.key) {\n case 'ArrowUp': {\n event.preventDefault();\n event.stopPropagation();\n const items = this.menuItemsElement;\n const currentIndex = items.indexOf(event.target as HTMLElement);\n const prevItem = items[(currentIndex - 1 + items.length) % items.length];\n moveFocus(items[currentIndex], prevItem);\n break;\n }\n case 'ArrowDown': {\n event.preventDefault();\n event.stopPropagation();\n const items = this.menuItemsElement;\n const currentIndex = items.indexOf(event.target as HTMLElement);\n const nextItem = items[(currentIndex + 1) % items.length];\n moveFocus(items[currentIndex], nextItem);\n break;\n }\n case 'Home': {\n event.preventDefault();\n event.stopPropagation();\n moveFocus(event.target as HTMLElement, this.menuItemsElement[0]);\n break;\n }\n case 'End': {\n event.preventDefault();\n event.stopPropagation();\n moveFocus(event.target as HTMLElement, this.menuItemsElement.pop());\n break;\n }\n }\n }\n\n connectedCallback() {\n this.lastCurrent = this.currentPath?.length ? this.currentPath[this.currentPath.length - 1] : undefined;\n this.setupData(this.items);\n }\n\n /** Close the menu when clicking outside. */\n @Listen('click', { target: 'document', passive: true })\n handleOutsideClick(event: MouseEvent) {\n if (containsTarget(this.host, event)) {\n return;\n }\n\n this.open = false;\n }\n\n /** Close the menu when pressing Escape or Tab. */\n @Listen('keydown', { passive: true })\n handleKeydown(event: KeyboardEvent) {\n switch (event.key) {\n case 'Escape':\n this.open = false;\n break;\n case 'Tab':\n if (containsTarget(this.host, event)) {\n break;\n }\n\n this.open = false;\n break;\n }\n }\n\n /** Close the menu when the focus goes out. */\n @Listen('focusin', { target: 'document', passive: true })\n handleFocusout(event: FocusEvent) {\n if (containsTarget(this.host, event)) {\n return;\n }\n\n this.open = false;\n }\n\n render() {\n return (\n <nav aria-label=\"Zanichelli.it\">\n <button\n class=\"burger-button\"\n type=\"button\"\n aria-expanded={this.open ? 'true' : 'false'}\n aria-controls=\"mobile-menu\"\n aria-label={this.open ? 'Chiudi menù' : 'Apri menù'}\n onClick={() => this.toggleMenu()}\n >\n <z-icon\n name={this.open ? 'multiply' : 'burger-menu'}\n width=\"1.5rem\"\n height=\"1.5rem\"\n ></z-icon>\n </button>\n\n <z-logo\n imageAlt=\"Logo Zanichelli\"\n link=\"/\"\n height={32}\n width={126}\n ></z-logo>\n\n <zanit-search-form\n searchQuery={this.searchQuery}\n onResetSearch={() => (this.searchQuery = undefined)}\n searchArea={this.searchArea}\n searchEnv={this.searchEnv}\n />\n\n {this.open && (\n <ul\n class=\"mobile-menu\"\n role=\"menubar\"\n >\n {!this.loading && this.currentPath && this.currentPath.length > 0 && (\n <li role=\"none\">\n <a\n class=\"parent\"\n href={this.parentItem?.href ?? '/'}\n id={this.parentItem?.id ?? undefined}\n role=\"menuitem\"\n tabIndex={-1}\n onKeyDown={(event) => this.handleItemKeydown(event)}\n target={this.parentItem?.target}\n >\n <z-icon\n name=\"arrow-left\"\n width=\"0.5rem\"\n height=\"0.5rem\"\n ></z-icon>\n <span>\n {/* Show the 'Home' label if the current item is a root child. */}\n {this.parentItem?.label || 'Home'}\n </span>\n </a>\n </li>\n )}\n\n {this.loading ? (\n <div\n class=\"items-container\"\n role=\"none\"\n >\n {[...new Array(4)].map(() => (\n <li role=\"none\">\n <div\n class=\"menubar-item\"\n role=\"none\"\n >\n <z-ghost-loading></z-ghost-loading>\n </div>\n </li>\n ))}\n </div>\n ) : this.menuType === 'menu' ? (\n <Menu\n items={this.menuItems}\n controlledBy={this.parentItem?.id}\n currentPath={this.currentPath}\n onItemKeyDown={(event) => this.handleItemKeydown(event)}\n />\n ) : (\n this.menuItems?.length > 0 && (\n <div\n class=\"items-container\"\n role=\"none\"\n >\n {this.menuItems.map((item) => (\n <li role=\"none\">\n <a\n class={{\n 'menu-item': this.menuType === 'menu',\n 'menubar-item': this.menuType === 'menubar',\n }}\n href={item.href}\n id={item.id}\n role=\"menuitem\"\n aria-current={this.lastCurrent === item.id ? 'page' : 'false'}\n tabIndex={-1}\n onKeyDown={(event) => this.handleItemKeydown(event)}\n target={item.target}\n >\n <span data-text={item.label}>{item.label}</span>\n </a>\n </li>\n ))}\n </div>\n )\n )}\n </ul>\n )}\n </nav>\n );\n }\n}\n","enum AREA_LABELS {\n SCUOLA = 'Scuola',\n UNIVERSITÀ = 'Università',\n GIURIDICO = 'Giuridico',\n DIZIONARI = 'Dizionari',\n SAGGISTICA = 'Saggistica',\n}\n\nconst AREA_ORDER = Object.keys(AREA_LABELS);\n\nexport type SearchSuggestion = {\n id: string;\n label: string;\n html_label: string;\n url: string;\n user_query: string;\n query?: string;\n area?: string;\n subject?: string;\n};\n\nexport function buildSuggestions(\n query: string,\n subjectsByArea: Record<string, string[]>,\n selectedArea?: string\n): SearchSuggestion[] {\n const matchingSubjectAreas = findSubjectAreas(query, subjectsByArea);\n const hasSubject = matchingSubjectAreas.length > 0;\n const subject = hasSubject ? query.toUpperCase() : undefined;\n\n const suggestions: SearchSuggestion[] = [];\n\n if (selectedArea) suggestions.push(buildWordSuggestion(query, selectedArea));\n\n suggestions.push(buildWordSuggestion(query));\n\n if (hasSubject) {\n if (selectedArea) {\n const orderedSubjectAreas = [\n ...matchingSubjectAreas.filter((area) => area === selectedArea),\n ...matchingSubjectAreas\n .filter((area) => area !== selectedArea)\n .sort((a, b) => getAreaOrder(a) - getAreaOrder(b)),\n ];\n orderedSubjectAreas.forEach((area) => suggestions.push(buildSubjectSuggestion(query, area, subject)));\n } else {\n matchingSubjectAreas\n .sort((a, b) => getAreaOrder(a) - getAreaOrder(b))\n .forEach((subjectArea) => suggestions.push(buildSubjectSuggestion(query, subjectArea, subject)));\n }\n }\n\n return suggestions;\n}\n\nconst buildWordSuggestion = (user_query: string, area?: string): SearchSuggestion => {\n return {\n id: buildId(`word-${user_query}-${area}`),\n label: buildLabel(user_query, area, false, false),\n html_label: buildLabel(user_query, area, false, true),\n url: buildUrl({ q: user_query, ...(area ? { area } : {}), user_query }),\n ...buildDetail(user_query, user_query, area),\n };\n};\n\nconst buildSubjectSuggestion = (user_query: string, area: string, subject: string): SearchSuggestion => {\n return {\n id: buildId(`subj-${user_query}-${area}-${subject}`),\n label: buildLabel(user_query, area, true, false),\n html_label: buildLabel(user_query, area, true, true),\n url: buildUrl({ area, materia: subject, user_query }),\n ...buildDetail(user_query, undefined, area, subject),\n };\n};\n\nconst buildId = (string: string) =>\n string\n .split('')\n .map((c) => c.charCodeAt(0).toString(16))\n .join('');\n\nconst buildUrl = (params: Record<string, string>): string => {\n return `ricerca?${new URLSearchParams(params).toString()}`;\n};\n\nconst buildDetail = (user_query: string, query?: string, area?: string, subject?: string) => ({\n user_query,\n ...(query ? { query } : {}),\n ...(area ? { area } : {}),\n ...(subject ? { subject } : {}),\n});\n\nconst buildLabel = (user_query: string, area?: string, isSubject: boolean = false, isHtml: boolean = false) => {\n const openStrong = isHtml ? `<strong>` : ``;\n const closeStrong = isHtml ? `</strong>` : ``;\n\n return `Cerca la ${isSubject ? `materia` : `parola`} ${openStrong}${user_query}${closeStrong} ${area ? `nel catalogo ${openStrong}${AREA_LABELS[area] ?? area}${closeStrong}` : `in tutto il sito`}`;\n};\n\nfunction findSubjectAreas(query: string, subjectsByArea: Record<string, string[]>): string[] {\n const cleanedQuery = cleanSearch(query);\n return Object.entries(subjectsByArea)\n .filter(([, subjects]) => subjects.some((subject) => subject.toLowerCase() === cleanedQuery))\n .map(([area]) => area);\n}\n\n/** Clear search string: lowercase, remove multiple spaces */\nconst cleanSearch = (s: string) => s.toLowerCase().replace(/\\s+/g, ' ');\n\nconst getAreaOrder = (area: string) => {\n const index = AREA_ORDER.indexOf(area);\n return index >= 0 ? index : 100;\n};\n",":host,\n*,\n::before,\n::after {\n box-sizing: border-box;\n}\n\n*:focus:focus-visible {\n box-shadow: var(--shadow-focus-primary);\n outline: none;\n}\n\nbutton {\n all: unset;\n cursor: pointer;\n}\n\n.searchbar {\n --searchbar-button-x-padding: 14px;\n --searchbar-button-icon-width: 1.75rem;\n\n /* button horizontal padding + icon size + left border */\n --closed-searchbar-width: calc((var(--searchbar-button-x-padding) * 2) + var(--searchbar-button-icon-width) + 1px);\n\n position: absolute;\n z-index: 5;\n top: 0;\n right: 0;\n display: flex;\n width: var(--closed-searchbar-width);\n height: 3rem;\n justify-content: flex-end;\n transition: width 0.4s ease-in-out;\n}\n\n.searchbar.searchbar-open {\n width: 100%;\n}\n\n.searchbar .input-wrapper {\n display: flex;\n overflow: hidden;\n width: 100%;\n align-items: center;\n padding: 8px;\n padding-left: var(--grid-margin);\n background-color: #fff;\n gap: 8px;\n transition-duration: 0.4s;\n transition-property: padding-right, padding-left, width;\n transition-timing-function: ease-in-out;\n}\n\n.searchbar:not(.searchbar-open) .input-wrapper {\n overflow: hidden;\n width: 0;\n padding: 0;\n}\n\n.searchbar button[type='reset'] {\n --z-icon-width: 1rem;\n --z-icon-height: 1rem;\n\n display: flex;\n align-items: center;\n cursor: pointer;\n}\n\n.searchbar input {\n z-index: 1;\n width: 100%;\n height: 100%;\n padding: 0;\n border: none;\n background-color: #fff;\n font-family: var(--font-family-sans);\n font-size: 1rem;\n}\n\n.searchbar.searchbar-open input:first-child {\n padding-left: 4px;\n margin-left: -4px; /* per evitare che la focus shadow vada fuori dallo schermo */\n}\n\n.searchbar input[type='search']::-webkit-search-cancel-button,\n.searchbar input[type='search']::-webkit-search-decoration {\n appearance: none;\n}\n\n.searchbar input::placeholder {\n color: var(--gray500);\n}\n\n.searchbar .searchbar-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 10px var(--searchbar-button-x-padding);\n border-left: 1px solid #000;\n background: var(--zanit-accent-color);\n font-family: inherit;\n font-size: inherit;\n gap: 64px;\n line-height: 1;\n}\n\n.searchbar .searchbar-button:focus-visible {\n z-index: 1;\n}\n\n.searchbar-button z-icon {\n --z-icon-width: var(--searchbar-button-icon-width);\n --z-icon-height: var(--searchbar-button-icon-width);\n}\n\n.suggestions-wrapper {\n position: absolute;\n z-index: 4;\n width: 100vw;\n margin-left: -50vw;\n left: 50%;\n top: 3rem;\n background: #fff;\n box-shadow: var(--shadow-1);\n border-top: 1px solid var(--gray200);\n}\n\n.suggestions-wrapper.hidden {\n display: none;\n}\n\n.suggestions {\n display: flex;\n padding: var(--space-unit);\n flex-direction: column;\n align-items: stretch;\n width: 100%;\n margin: 0 auto;\n}\n\n.suggestion {\n cursor: pointer;\n padding: calc(var(--space-unit) * 0.75) var(--space-unit);\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.suggestion strong {\n font-size: 1.125rem;\n}\n\n.suggestion:hover,\n.suggestion[aria-selected='true'] {\n background: var(--gray100);\n}\n\n@media (width < 1152px) {\n .searchbar .searchbar-button > .searchbar-button-label {\n display: none;\n }\n}\n\n@media (width >= 768px) {\n .searchbar {\n --searchbar-button-x-padding: 16px;\n --searchbar-button-icon-width: 2rem;\n }\n\n .searchbar .input-wrapper {\n gap: 14px;\n }\n\n .searchbar button[type='reset'] {\n --z-icon-width: 1.5rem;\n --z-icon-height: 1.5rem;\n }\n\n .searchbar input,\n .searchbar .searchbar-button {\n font-size: 1.5rem;\n }\n\n .searchbar .searchbar-button {\n padding: 8px var(--searchbar-button-x-padding);\n }\n\n .suggestions {\n padding: var(--space-unit) calc(var(--space-unit) * 2);\n }\n}\n\n@media (width >= 1152px) {\n .searchbar {\n --closed-searchbar-width: 190px;\n }\n}\n\n@media (width >= 1366px) {\n .searchbar .searchbar-button {\n border-right: 1px solid #000;\n }\n\n .suggestions {\n padding: var(--space-unit) calc(var(--space-unit) * 3);\n max-width: 1366px;\n }\n}\n","import { Component, Element, Event, EventEmitter, h, Host, Listen, Prop, State, Watch } from '@stencil/core';\nimport { containsTarget, isArrowDownKey, isArrowUpKey, isEscKey, isTabKey, SearchEvent } from '../../../utils';\nimport { getSubjectsByArea, SearchEnv } from '../../../utils/subjects.api';\nimport { buildSuggestions, SearchSuggestion } from './suggestions';\n\n@Component({\n tag: 'zanit-search-form',\n styleUrl: 'search-form.css',\n shadow: true,\n})\nexport class ZanitSearchForm {\n private formElement: HTMLFormElement;\n private subjectsByArea: Record<string, string[]> = {};\n private timer: NodeJS.Timeout;\n\n @Element() host: HTMLZanitSearchFormElement;\n\n /** Indicates whether the searchbar is visible and usable. */\n @State()\n showSearchbar: boolean = false;\n\n /** Search query to apply. */\n @State()\n _searchQuery: string | undefined = undefined;\n\n /** Search suggestions to show in the autocomplete dropdown. */\n @State() suggestions: SearchSuggestion[] = [];\n\n /** Active suggestion - used for keyboard navigation */\n @State() activeSuggestion: string = '';\n\n /** Show suggestions list */\n @State() showSuggestions: boolean = false;\n\n /** Initial search query */\n @Prop({ mutable: true })\n searchQuery: string | undefined = undefined;\n\n /** Environment for search suggestions */\n @Prop() searchEnv: SearchEnv = SearchEnv.PROD;\n\n /** Search area (e.g. \"SCUOLA\", \"UNIVERSITÀ\", \"DIZIONARI\"). */\n @Prop() searchArea?: string | undefined;\n\n @Watch('searchQuery')\n onSearchQueryChange() {\n this._searchQuery = this.searchQuery;\n if (this.searchQuery) {\n this.openSearchbar();\n }\n this.resetSuggestions();\n }\n\n @Watch('searchArea')\n onSearchAreaChange() {\n this.resetSuggestions();\n }\n\n @Watch('showSearchbar')\n onShowSearchbarChange() {\n if (!this.showSearchbar) {\n this.showSuggestions = false;\n }\n }\n\n @Watch('showSuggestions')\n onShowSuggestionsChange() {\n this.activeSuggestion = '';\n }\n\n /** Emitted on search form submission. */\n @Event({ cancelable: true }) search: EventEmitter<SearchEvent>;\n\n @Event() resetSearch: EventEmitter<void>;\n\n async connectedCallback() {\n this.subjectsByArea = await getSubjectsByArea(this.searchEnv);\n this.showSearchbar = !!this.searchQuery;\n this._searchQuery = this.searchQuery;\n }\n\n /** Close open searchbar when clicking outside. */\n @Listen('click', { target: 'document', passive: true })\n handleOutsideClick(event: MouseEvent) {\n if (this.showSearchbar && this.host && !containsTarget(this.host, event)) {\n this.showSearchbar = false;\n }\n }\n\n /** Close the searchbar/suggestions when pressing Escape. */\n @Listen('keydown', { passive: true })\n handleEsc(event: KeyboardEvent) {\n if (!isEscKey(event)) {\n return;\n }\n\n if (this.showSuggestions) {\n this.showSuggestions = false;\n } else {\n this.showSearchbar = false;\n }\n }\n\n /** Close the searchbar/suggestions when pressing Tab. */\n @Listen('keyup', { target: 'document', passive: true })\n handleTab(event: KeyboardEvent) {\n if (!isTabKey(event)) {\n return;\n }\n\n this.showSuggestions = false;\n\n if (!containsTarget(this.host, event)) {\n this.showSearchbar = false;\n }\n }\n\n private openSearchbar() {\n this.showSearchbar = true;\n setTimeout(() => {\n const searchbarInput = this.host.shadowRoot.querySelector('#searchbar-input') as HTMLInputElement;\n searchbarInput.focus({ preventScroll: true });\n }, 500);\n }\n\n private resetSearchQuery() {\n this.searchQuery = undefined;\n this.resetSearch.emit();\n }\n\n private resetSuggestions() {\n this.suggestions = [];\n this.showSuggestions = false;\n }\n\n private handleInputChange(event: InputEvent) {\n this._searchQuery = (event.target as HTMLInputElement).value;\n if (!this._searchQuery) {\n this.searchQuery = undefined;\n }\n\n this.updateSuggestions();\n }\n\n private updateSuggestions() {\n clearTimeout(this.timer);\n\n const query = (this._searchQuery || '').trim();\n\n if (query.length < 3) {\n this.resetSuggestions();\n return;\n }\n\n this.timer = setTimeout(() => {\n this.resetSuggestions();\n this.suggestions = buildSuggestions(query, this.subjectsByArea, this.searchArea?.toUpperCase());\n this.showSuggestions = true;\n }, 300);\n }\n\n private onSearchSubmit(event: Event) {\n event.preventDefault();\n if (!this._searchQuery) {\n return;\n }\n\n if (this.activeSuggestion) {\n const suggestion = this.suggestions.find((s) => s.id === this.activeSuggestion);\n if (suggestion) {\n this.submitSuggestionSearch(suggestion);\n this.showSuggestions = false;\n return;\n }\n }\n\n this.showSearchbar = false;\n\n const searchEv = this.search.emit({ query: this._searchQuery, area: this.searchArea });\n // do not submit the form if the event default behavior was prevented\n if (searchEv.defaultPrevented) {\n return;\n }\n\n this.formElement.submit();\n }\n\n private submitSuggestionSearch(suggestion: SearchSuggestion) {\n const ev = this.search.emit({\n user_query: suggestion.user_query,\n query: suggestion.query,\n area: suggestion.area,\n subject: suggestion.subject,\n });\n if (!ev.defaultPrevented) {\n window.location.href = suggestion.url;\n }\n }\n\n private handleSuggestionsNav(event: KeyboardEvent) {\n if (!isArrowDownKey(event) && !isArrowUpKey(event)) {\n return;\n }\n\n if (!this.suggestions.length) {\n return;\n }\n\n const options = this.suggestions.map((o) => o.id);\n\n if (!options.length) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.showSuggestions) {\n this.showSuggestions = true;\n }\n\n let nextId = null;\n const firstId = options[0];\n const lastId = options[options.length - 1];\n const currOption = options.indexOf(this.activeSuggestion);\n if (currOption < 0) {\n nextId = isArrowDownKey(event) ? firstId : lastId;\n } else {\n if (isArrowDownKey(event)) {\n nextId = options[currOption + 1] || lastId;\n } else {\n nextId = options[currOption - 1] || firstId;\n }\n }\n this.activeSuggestion = nextId;\n }\n\n private renderSuggestions() {\n return (\n <div\n class={{ 'suggestions-wrapper': true, 'hidden': !this.showSuggestions || !this.suggestions.length }}\n onPointerOver={(e) => e.preventDefault()}\n >\n <div\n id=\"search-suggestions\"\n class=\"suggestions\"\n role=\"listbox\"\n aria-label=\"Seleziona tra i suggerimenti\"\n >\n {this.suggestions.map((suggestion, k) => {\n return (\n <span\n key={k}\n innerHTML={suggestion.html_label}\n id={suggestion.id}\n class=\"suggestion\"\n role=\"option\"\n aria-label={suggestion.label}\n aria-selected={this.activeSuggestion === suggestion.id ? 'true' : undefined}\n onClick={() => this.submitSuggestionSearch(suggestion)}\n />\n );\n })}\n </div>\n </div>\n );\n }\n\n render() {\n return (\n <Host>\n <form\n class={{ 'searchbar': true, 'searchbar-open': this.showSearchbar }}\n ref={(el) => (this.formElement = el)}\n role=\"search\"\n aria-label=\"Cerca nel sito\"\n method=\"get\"\n action=\"/ricerca\"\n onSubmit={(event) => this.onSearchSubmit(event)}\n onReset={() => this.resetSearchQuery()}\n >\n {!!this.searchArea && (\n <input\n type=\"hidden\"\n name=\"area\"\n value={this.searchArea}\n />\n )}\n\n <div\n class=\"input-wrapper\"\n role=\"none\"\n >\n {this.searchQuery && (\n <button\n type=\"reset\"\n aria-label=\"Svuota campo di ricerca\"\n disabled={!this.showSearchbar}\n aria-hidden={!this.showSearchbar ? 'true' : undefined}\n tabIndex={!this.showSearchbar ? -1 : 0}\n >\n <z-icon name=\"multiply-circled\" />\n </button>\n )}\n <input\n id=\"searchbar-input\"\n name=\"q\"\n type=\"search\"\n disabled={!this.showSearchbar}\n placeholder=\"Cerca per parola chiave o ISBN\"\n value={this.searchQuery}\n required\n autocomplete=\"off\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded={this.showSuggestions ? 'true' : 'false'}\n aria-controls=\"search-suggestions\"\n aria-activedescendant={this.activeSuggestion}\n aria-label=\"Cerca per parola chiave o ISBN\"\n aria-hidden={!this.showSearchbar ? 'true' : undefined}\n tabIndex={!this.showSearchbar ? -1 : 0}\n onInput={(event) => this.handleInputChange(event)}\n onKeyDown={(e) => {\n // INFO: prevent ESC from clearing input\n if (isEscKey(e)) {\n e.preventDefault();\n }\n\n this.handleSuggestionsNav(e);\n }}\n />\n </div>\n\n <button\n class=\"searchbar-button\"\n aria-label={this.showSearchbar ? 'Esegui ricerca' : 'Apri il campo di ricerca'}\n aria-controls=\"searchbar-input\"\n type={this.showSearchbar ? 'submit' : 'button'}\n onClick={() => this.openSearchbar()}\n >\n {this.showSearchbar ? null : <span class=\"searchbar-button-label\">Cerca</span>}\n <z-icon name=\"search\"></z-icon>\n </button>\n </form>\n\n {this.renderSuggestions()}\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{p as e,g as a,b as r}from"./p-B82IapZZ.js";export{s as setNonce}from"./p-B82IapZZ.js";var n=()=>{const a=import.meta.url;const r={};if(a!==""){r.resourcesUrl=new URL(".",a).href}return e(r)};n().then((async e=>{await a();return r([["p-1dddc763",[[17,"zanit-menubar",{data:[1],current:[1],searchQuery:[1025,"search-query"],searchEnv:[1,"search-env"],searchArea:[1,"search-area"],items:[32],openMenu:[32],openNavbar:[32],currentPath:[32],isMobile:[32],loading:[32]},[[5,"click","handleOutsideClick"],[5,"keydown","handleKeydown"],[1,"mouseover","handleMouseover"],[1,"mouseout","handleMouseout"],[1,"focusout","handleFocusout"]],{data:["parseData"],items:["onItemsChange"],current:["onCurrentChange"]}],[17,"zanit-mobile-menubar",{currentPath:[16,"current-path"],items:[16],searchQuery:[1025,"search-query"],loading:[4],searchEnv:[1,"search-env"],searchArea:[1,"search-area"],lastCurrent:[32],parentItem:[32],menuItems:[32],menuType:[32],open:[32]},[[5,"click","handleOutsideClick"],[1,"keydown","handleKeydown"],[5,"focusin","handleFocusout"]],{items:["onItemsChange"],currentPath:["onItemsChange"]}],[1,"zanit-search-form",{searchQuery:[1025,"search-query"],searchEnv:[1,"search-env"],searchArea:[1,"search-area"],showSearchbar:[32],_searchQuery:[32],suggestions:[32],activeSuggestion:[32],showSuggestions:[32]},[[5,"click","handleOutsideClick"],[1,"keydown","handleEsc"],[5,"keyup","handleTab"]],{searchQuery:["onSearchQueryChange"],searchArea:["onSearchAreaChange"],showSearchbar:["onShowSearchbarChange"],showSuggestions:["onShowSuggestionsChange"]}]]]],e)}));
1
+ import{p as e,g as a,b as r}from"./p-B82IapZZ.js";export{s as setNonce}from"./p-B82IapZZ.js";var n=()=>{const a=import.meta.url;const r={};if(a!==""){r.resourcesUrl=new URL(".",a).href}return e(r)};n().then((async e=>{await a();return r([["p-d53e0a87",[[17,"zanit-menubar",{data:[1],current:[1],searchQuery:[1025,"search-query"],searchEnv:[1,"search-env"],searchArea:[1,"search-area"],items:[32],openMenu:[32],openNavbar:[32],currentPath:[32],isMobile:[32],loading:[32]},[[5,"click","handleOutsideClick"],[5,"keydown","handleKeydown"],[1,"mouseover","handleMouseover"],[1,"mouseout","handleMouseout"],[1,"focusout","handleFocusout"]],{data:["parseData"],items:["onItemsChange"],current:["onCurrentChange"]}],[17,"zanit-mobile-menubar",{currentPath:[16,"current-path"],items:[16],searchQuery:[1025,"search-query"],loading:[4],searchEnv:[1,"search-env"],searchArea:[1,"search-area"],lastCurrent:[32],parentItem:[32],menuItems:[32],menuType:[32],open:[32]},[[5,"click","handleOutsideClick"],[1,"keydown","handleKeydown"],[5,"focusin","handleFocusout"]],{items:["onItemsChange"],currentPath:["onItemsChange"]}],[1,"zanit-search-form",{searchQuery:[1025,"search-query"],searchEnv:[1,"search-env"],searchArea:[1,"search-area"],showSearchbar:[32],_searchQuery:[32],suggestions:[32],activeSuggestion:[32],showSuggestions:[32]},[[5,"click","handleOutsideClick"],[1,"keydown","handleEsc"],[5,"keyup","handleTab"]],{searchQuery:["onSearchQueryChange"],searchArea:["onSearchAreaChange"],showSearchbar:["onShowSearchbarChange"],showSuggestions:["onShowSuggestionsChange"]}]]]],e)}));
2
2
  //# sourceMappingURL=zanichelli-it-frontend-kit.esm.js.map