Mega menus (Vertical/Horizontal)Burger menu (desktop overlay + fixed panel)Simple menu (classic dropdown behavior)SectionHeader).{
"unReadAnnouncements": 0,
"navigations": [
{
"navigationTitle": "Sample navigation title",
"url": "/sample",
"image": {},
"banners": [],
"bannersLink": "",
"bannersText": "Sample text",
"menuIcon": {},
"navigations": [
{
"navigationTitle": "Sample navigation title",
"url": "/sample",
"image": {
"id": "Image Id",
"link": "https://example.com/media/sample.jpg"
},
"banners": [
{
"image": {
"id": "Banner image Id",
"link": "https://example.com/media/sample-banner.jpg"
}
},
"..."
],
"bannersLink": "",
"bannersText": "Sample text",
"menuIcon": {},
"navigations": [
{
"navigationTitle": "Sample navigation title",
"url": "/sample",
"image": {
"id": "Image Id",
"link": "https://example.com/media/sample.jpg"
},
"banners": [],
"bannersLink": "",
"bannersText": "",
"menuIcon": {},
"navigations": [
{
"navigationTitle": "Sample navigation title",
"url": "/sample",
"image": {
"id": "Image Id"
},
"banners": [],
"bannersLink": "",
"bannersText": "",
"menuIcon": {}
},
"..."
]
},
"..."
]
},
"..."
]
},
"..."
],
"name": "NavBar",
"view": "Default",
"section": "SectionHeader",
"settings": {
"showSearch": true,
"showLanguage": false,
"showMenuIcons": false,
"displayCategoryImages": false,
"menuType": "Mega",
"menuOrientation": "Vertical",
"subMenuLevels": "AllLevels",
"menuHelperText": "Sample text",
"id": "Component Id",
"section": "SectionHeader",
"type": "NoirNavBar",
"name": "NavBar",
"configuredInContentApi": true,
"view": "Default",
"displayName": "",
"cssClass": "",
"header": "",
"alignment": "Left"
},
"translations": {
"navbarLogoFor": "Sample text",
"goToHomepage": "Sample text",
"openLoginModal": "Sample text",
"...": "..."
}
}model.Settings.Idmodel.Settings.showSearchmodel.Settings.menuTypemodel.Settings.menuOrientationmodel.Settings.subMenuLevelsmodel.Settings.enableMiniCartmodel.Settings.miniCartTriggerid="comp-{{ id }}".Mega, Burger, Simple (and anything else treated as “not simple” in some branches).menuType == 'Mega' to change layout and which submenu types open on click. Values used: Vertical / Horizontal.OneLevel, TwoLevels, AllLevels).enableMiniCart turns the header cart icon into a mini-cart trigger. miniCartTrigger selects how it opens: Hover (open on pointer enter / keyboard focus, click still navigates to /cart) or Click (click toggles the panel instead of navigating). Both are passed into initComponent(...)./cart link, regardless of these settings.navigations[] (the template supports deep nesting up to level 4).navigationTitleurlmenuIcon.link (used only for Burger menu + when showMenuIcons = true)image.link (used for category image previews in Mega Horizontal when displayCategoryImages = true)banners[] (used for Mega Vertical to show promotional banners to the side)bannersText, bannersLink (note: the template checks these, but the link is referenced as nav.bannerLink in one place—see Notes)$store.announcements$store.loginModal$store.shoppingLists$store.cartmodel.Settings.CssClassmodel.Settings.menuHelperTextmodel.Settings.showLanguagemodel.Settings.showMenuIconsmodel.Settings.displayCategoryImagesGlobalData.Settings.logo.link, logoLight.link, favicon.linkGlobalData.Settings.noImage.link (fallback) + theme fallback Assets/images/no-image.svgGlobalData.Company.Name, GlobalData.Company.LanguagesGlobalData.CurrentLanguage / GlobalData.Company.DefaultLanguageGlobalData.Settings.EnableShoppingLists, EnableWishlistisMenuVisible controls whether the element should be present/visible at all.isMenuOpen controls the slide-in/out class toggles.isMiniCartOpen controls the mini-cart panel; miniCartCloseTimeoutId holds the pending hover-close timer.init(): wires resize/scroll listeners and recalculates measurements used by sticky/fixed header UI.resize it also force-closes the mini cart when the viewport drops below the 1440px desktop breakpoint, so the panel can't stay open after the layout switches to mobile.enableMiniCart and miniCartTrigger. Every handler below returns early when enableMiniCart is false or isMobile is true.Alpine.store("cart").items (or []), so the panel renders straight from the shared cart store and stays in sync with any other component that updates it.miniCartTrigger === "Click": calls preventDefault() and toggles isMiniCartOpen.miniCartTrigger === "Hover": does nothing, letting the click navigate to /cart as normal.miniCartTrigger === "Hover", cancelling any pending close timer first.miniCartTrigger === "Hover", so moving the cursor from the trigger into the panel does not dismiss it.handleCartMouseEnter: opens the panel when the trigger receives focus, but only in Hover mode — in Click mode Enter/Space already toggles it via handleCartClick, so auto-opening on focus would fight that.event.relatedTarget is null the handler returns without closing. Clicking non-focusable content inside the panel, or removing the element that held focus, reports no next target; closing there would dismiss the panel on an interaction the user made inside it. Click-away, Escape or mouse-leave close it instead.event.currentTarget.contains(nextFocusTarget) so focus moving within the cart area is ignored.item.isUpdating = true while the request is in flight.servicesreusabledefault.removeCartLineById(item.id) when the line has an id, otherwise falls back to servicesreusabledefault.removeFromCart(item.productVariantId).response.success === false as a failure and shows removeFromCartErrorMessage via Alpine.store("toast").item.isUpdating afterwards.searchComponent(): returns a nested Alpine object used by the search UI.search(): debounced product search.servicesreusabledefault.findProductsByCriteria(criteria).searchLoading = false in finally.redirectToSearch(): navigates to /search?s=<encoded query>.triggerVoiceSearch(): starts voice input (when supported by the browser).servicesreusabledefault.findProductsByCriteria(criteria) and updates resultProducts.product, listName, position).menuHeight: the current computed menu height.menuPaddingTop: the current computed padding/top offset used in menu positioning.updateNavbarHeight(): re-measures the navbar element height.updateTopbarHeight(): re-measures the topbar height.updateLanguageHeight(): re-measures the language selector section height..navbar element height and stores it in state..topbar height and stores it in state.action(...): generic wrapper used by click handlers.handler(...): event handler used by menu interactions.run(...): small runner used to sequence DOM measurement updates.isMenuVisible = trueisMenuOpen = truedocument.body.style.overflow = "hidden")languageHeightisMenuOpen = true immediatelyisMenuOpen = falsetransitionend (menu slide-out), then:hiddenSiblingsisMenuVisible = falseisMenuVisible = false)index is missing.submenuHeight / bannersHeight.submenu${index} (including nested .navbar__menu__sub elements).height: auto / maxHeight: noneclone.scrollHeightComponents/NavBar/Default.js this function wraps its work in setTimeout(..., 300) and the return is inside that callback.undefined).this.submenuHeight to actually get a numeric value, refactor to either:setTimeout), orawait it.#submenu${index} .banners-wrap > div) using scrollHeight.setTimeout(..., 300) so it does not return a value synchronously.submenuVisibleLevelN (controls display)submenuOpenLevelN (controls the slide transition state)submenuVisibleLevelN.toggleSubmenuLevelN(index), so the close branch (including thetransitionend cleanup) runs unchangedaria-expandedvisible keeps the element in the DOM for animation.open controls translate classes.@click.away="resetMenu" in Liquid).handleResize() but doesn’t recompute isMobile.Alpine.store("modal").open(...).cartToken, cartData, checkoutTokencurrentCustomerId when it exists in multiCustomerList; otherwise leaves the radio group unselected.Alpine.store("modal").open(...) with a required radio-group input built from multiCustomerList.servicesreusabledefault.accountLoginWithCustomerId(selectedCustomerId).Alpine.store("toast").add(...) and re-enables the login button./checkout (when returning from checkout), / (from the login page), or reloads the current page.navbardefault.handleLogout(...) to show a confirmation modal.findProductsByCriteria).sendGAEvent(...)prepareListProducts(...)1440px.GlobalData.Settings.logo.link or logoLight.link exists, the navbar renders <img> logo(s).x-data="navbardefault.initComponent('{{ menuType }}','{{ menuOrientation }}',{{ enableMiniCart }},'{{ miniCartTrigger }}')"isMobile = window.innerWidth < 1440)menuOrientation and subMenuLevelssubmenuOpenLevel1, submenuVisibleLevel2submenuOpenLevel2, submenuVisibleLevel3submenuOpenLevel3, submenuVisibleLevel4submenuOpenLevel4display: styles based on open/visible properties.<input type="search"> bound to searchText.GlobalData.Company.Languages.size > 1):x-data="{ open: false }".