{%- 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 %}