{%- doc -%} Renders a header drawer menu triggered by the top details element. @param {object} linklist - The linklist to render @param {string} [class] - Additional classes to add to the drawer @param {string} [data_header_drawer_type] - The type of header drawer to render @param {object} [block] - The block that can be used to provide settings @param {object} [section] - The section that can be used to provide settings @example {% render 'header-drawer', linklist: section.settings.menu, class: 'header-drawer--mobile' %} {%- enddoc -%} {% liquid assign block_settings = block.settings assign max_featured_items = 4 assign image_border_radius = block_settings.image_corner_radius if block_settings.menu_style == 'featured_collections' assign ratio = block_settings.featured_collections_aspect_ratio elsif block_settings.menu_style == 'featured_products' assign ratio = block_settings.featured_products_aspect_ratio endif ## # We only eager load heavy elements of the page when rendering this template # through the Section Rendering API. # # This keeps the initial render lightweight, minimizing the impact on TTFB. # The second render then refreshes the page with additional content. # # At the moment, we check if the Section Rendering API is being used by # checking if section.index is blank. assign eager_loading = false if section.index == blank assign eager_loading = true endif %} {% stylesheet %} .header__icon--menu { position: initial; } @media screen and (min-width: 750px) { .header--desktop header-menu + .header__drawer header-drawer { display: none; } } .menu-drawer-container .header__icon--summary { color: var(--color-foreground); display: flex; justify-content: center; align-items: center; padding: var(--padding-lg); } .header__icon--summary .header-drawer-icon { margin: auto; width: var(--icon-size-md); height: var(--icon-size-md); } .header__drawer { display: flex; min-height: 60px; align-items: center; @media screen and (min-width: 750px) { min-height: 0; } } .header--compact .header__drawer { min-height: var(--minimum-touch-target); } .menu-drawer__navigation { padding: 0; @media screen and (min-width: 750px) { margin-top: var(--drawer-header-desktop-top); } } details:not([open]) .header__icon--menu .header-drawer-icon--close { display: none; } details[open] .header__icon--menu .header-drawer-icon--close { @media screen and (min-width: 750px) { display: none; } } details[open] .header__icon--menu .header-drawer-icon--open { display: none; @media screen and (min-width: 750px) { display: flex; } } .menu-drawer { position: fixed; transform: translateX(-100%); visibility: hidden; height: var(--drawer-height); width: var(--drawer-width); max-width: var(--drawer-max-width); z-index: var(--layer-menu-drawer); left: 0; top: 0; padding: 0; background-color: var(--color-background); overflow: auto; display: flex; border-right: var(--style-border-drawer); box-shadow: var(--shadow-drawer); flex-direction: column; @media screen and (min-width: 750px) { width: 25rem; } .header__drawer--desktop & { height: 100vh; } } .menu-drawer:has(details[open]) { overflow: initial; } .menu-drawer__backdrop { position: fixed; top: 0; left: 0; width: 100vw; height: 100dvh; backdrop-filter: brightness(0.75); z-index: var(--layer-heightened); opacity: 0; transition: opacity var(--drawer-animation-speed) ease; .menu-open & { opacity: 1; } } .menu-drawer, details[open] > .menu-drawer__submenu { transition: transform var(--drawer-animation-speed) ease, visibility var(--drawer-animation-speed) ease, opacity var(--drawer-animation-speed) ease; } .menu-open > .menu-drawer, .menu-open > .menu-drawer__submenu:not(.menu-drawer__menu--childlist) { transform: translateX(0); visibility: visible; opacity: 1; display: flex; flex-direction: column; will-change: transform; } .menu-drawer__inner-container { position: relative; height: 100%; } .menu-drawer__navigation-container { display: grid; grid-template-rows: 1fr auto; align-content: space-between; overflow-y: auto; height: 100%; } .menu-drawer__inner-submenu { display: flex; flex-direction: column; height: 100%; overflow-y: auto; @media screen and (min-width: 750px) { margin-top: var(--drawer-header-desktop-top); } } .menu-drawer__nav-buttons { display: flex; justify-content: space-between; align-items: center; } .menu-drawer__menu { --menu-drawer-inline-padding: calc(var(--padding-sm) + 7px); list-style: none; padding-inline: var(--drawer-padding); margin-inline: 0; margin-block-start: 0; } .menu-drawer__menu--grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--padding-sm); padding-inline-end: var(--menu-drawer-inline-padding); padding-block-start: var(--padding-xs); } .menu-drawer__menu--childlist:not(.menu-drawer__menu--grid) { flex-grow: 1; } .menu-drawer__menu.has-submenu, .menu-drawer__menu--childlist:not(:has(.menu-drawer__animated-element)) { margin-block-end: var(--margin-xs); @media screen and (min-width: 750px) { margin-block-end: 2.5rem; } } .menu-drawer__list-item--divider { border-block-end: 1px solid var(--color-border); } .menu-drawer__list-item--deep:not(.menu-drawer__list-item--divider) .menu-drawer__menu { margin-block-start: -0.3rem; } .menu-drawer__list-item--flat.menu-drawer__list-item--divider .menu-drawer__menu { margin-block-start: -0.4rem; } .menu-drawer__menu-container--divider { border-block-end: 1px solid var(--color-border); } .menu-drawer__menu > .menu-drawer__list-item { display: flex; min-height: calc(2 * var(--padding-lg) + var(--icon-size-xs)); } .menu-drawer__list-item--deep .menu-drawer__list-item, .menu-drawer__list-item--flat .menu-drawer__list-item { min-height: auto; } .menu-drawer__menu .menu-drawer__list-item--flat { display: flex; flex-direction: column; align-items: flex-start; margin-block-end: var(--margin-md); } .menu-drawer__menu--childlist .menu-drawer__list-item--flat { margin-block-end: var(--margin-sm); @media screen and (min-width: 750px) { margin-block-end: var(--margin-lg); } } .menu-drawer__menu--childlist .menu-drawer__list-item--flat.menu-drawer__list-item--divider { margin-block-end: 0; } .menu-drawer__list-item--flat .menu-drawer__menu--childlist { width: 100%; padding-inline-start: 0; } .menu-drawer-container[open] .menu-drawer__animated-element { animation: menu-drawer-nav-open var(--drawer-animation-speed) ease-in-out; animation-delay: calc(var(--drawer-animation-speed) + (var(--menu-drawer-animation-index) - 1) * 0.1s); animation-fill-mode: backwards; } .menu-drawer__menu details, .menu-drawer__menu-item, .menu-drawer__menu accordion-custom { width: 100%; } .menu-drawer__list-item--divider .menu-drawer__menu-item:not(.menu-drawer__menu-item--child) { min-height: calc(2 * var(--padding-lg) + var(--icon-size-xs)); } .menu-drawer__menu-item--mainlist { min-height: calc(2 * var(--padding-lg) + var(--icon-size-xs)); font-family: var(--menu-top-level-font-family); font-style: var(--menu-top-level-font-style); font-weight: var(--menu-top-level-font-weight); font-size: var(--menu-top-level-font-size); line-height: var(--menu-top-level-font-line-height); text-transform: var(--menu-top-level-font-case); color: var(--menu-top-level-font-color); justify-content: space-between; &:hover { color: var(--menu-top-level-font-color); } } .menu-drawer__menu-item--parent { font-family: var(--menu-parent-font-family); font-style: var(--menu-parent-font-style); font-weight: var(--menu-parent-font-weight); font-size: var(--menu-parent-font-size); line-height: var(--menu-parent-font-line-height); text-transform: var(--menu-parent-font-case); color: var(--menu-parent-font-color); &:hover { color: var(--menu-parent-font-color); } } .menu-drawer__menu-item--child { font-family: var(--menu-child-font-family); font-style: var(--menu-child-font-style); font-weight: var(--menu-child-font-weight); font-size: var(--menu-child-font-size); line-height: var(--menu-child-font-line-height); text-transform: var(--menu-child-font-case); color: var(--menu-child-font-color); &:hover { color: var(--menu-child-font-color); } } .menu-drawer__menu--childlist summary.menu-drawer__menu-item { display: flex; width: 100%; padding-inline-end: 0; } .menu-drawer__list-item--deep .menu-drawer__menu, .menu-drawer__menu--grandchildlist { padding-inline-start: 0; } .menu-drawer__list-item--deep .menu-drawer__menu { padding-block-end: 0.5rem; } .menu-drawer__list-item--deep.menu-drawer__list-item--divider .menu-drawer__menu { padding-block-end: 0.3rem; } .menu-drawer__list-item--flat.menu-drawer__list-item--divider .menu-drawer__menu--grandchildlist { padding-block-end: 0.5rem; } .menu-drawer__menu-item { display: flex; padding: var(--padding-2xs) 0; position: relative; text-decoration: none; justify-content: space-between; align-items: center; } .menu-drawer__menu-item:has(> .menu-drawer__link-image) { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; row-gap: var(--padding-3xs); padding: 0; } .menu-drawer__link-image { width: 100%; position: relative; aspect-ratio: 16 / 9; object-fit: cover; } /* Fix alignment for collection image mode links without images in drawer */ /* Target menu items in grids that have images */ .menu-drawer__menu--grid:has(.menu-drawer__link-image) .menu-drawer__menu-item:not(:has(> .menu-drawer__link-image)) { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; row-gap: var(--padding-3xs); padding: 0; } .menu-drawer__menu--grid:has(.menu-drawer__link-image) .menu-drawer__menu-item:not(:has(> .menu-drawer__link-image))::before { content: ''; display: block; width: 100%; aspect-ratio: 16 / 9; background-color: var(--color-foreground-muted); opacity: 0.1; border-radius: var(--menu-image-border-radius); } .menu-drawer__close-button { position: relative; right: auto; top: auto; width: fit-content; height: fit-content; padding: var(--padding-lg); will-change: transform; } .menu-drawer__back-button { display: flex; width: 100%; padding: var(--padding-md) var(--padding-xl); border: none; align-items: center; color: var(--color-foreground); background-color: transparent; text-align: left; text-decoration: none; white-space: nowrap; overflow-x: hidden; line-height: 1.2; box-shadow: none; } .menu-drawer__menu-item-text { overflow: hidden; text-overflow: ellipsis; } /** Styles when the country selector is hidden */ .menu-drawer .language-selector:not(.menu-drawer__submenu *) { width: fit-content; padding-inline-start: 0; .localization-form__select { text-align: left; } } .menu-drawer__menu-item > .svg-wrapper { width: fit-content; height: fit-content; margin: 0; padding-block: var(--padding-lg); padding-inline-start: var(--padding-xl); flex-shrink: 0; } .menu-drawer__list-item--divider .menu-drawer__menu-item > .svg-wrapper { padding-block: var(--padding-md); } .menu-drawer svg { width: var(--icon-size-xs); height: var(--icon-size-xs); } .menu-drawer__submenu { position: absolute; width: 100%; top: 0; height: 100dvh; left: 0; background-color: var(--color-background); z-index: var(--layer-flat); transform: translateX(-5%); visibility: hidden; overflow-y: auto; opacity: 0; } .menu-drawer__back-button > .svg-wrapper { margin-right: var(--padding-md); width: var(--icon-size-xs); height: var(--icon-size-xs); } .menu-drawer__utility-links { display: flex; flex-direction: column; padding: 0; margin-block: auto var(--padding-sm); margin-inline-start: var(--padding-xl); background-color: rgb(var(--color-foreground) 0.03); } .menu-drawer__account { display: inline-flex; align-items: center; gap: var(--gap-xs); text-decoration: none; height: 44px; font-size: 1.4rem; color: rgb(var(--color-foreground)); } .menu-drawer__account svg { height: var(--icon-size-sm); width: var(--icon-size-sm); } .menu-drawer__account shop-user-avatar { --shop-avatar-size: 2.4rem; margin-right: 0.55rem; margin-left: -0.45rem; } .menu-drawer__link-image, .menu-drawer__featured-product-image, .menu-drawer__featured-collection-image, .menu-drawer__featured-collection-link::before { border-radius: var(--menu-image-border-radius); } @keyframes menu-drawer-nav-open { 0% { visibility: hidden; opacity: 0; transform: translateX(-0.5rem); } 100% { visibility: visible; opacity: 1; transform: translateX(0); } } @keyframes menu-drawer-subnav-open { 0% { visibility: visible; opacity: 1; transform: translateX(0); } 100% { visibility: hidden; opacity: 0; transform: translateX(-1rem); } } {% endstylesheet %}