Compatibility: Dawn version 9 to 12, and other Shopify 2.0 FREE themes only
Welcome to our latest tutorial, designed specifically for users of the Dawn theme (versions 9 to 12) and other Shopify 2.0 free themes. As of December 2021, Dawn introduced an exciting thumbnail slider feature for desktop users. But what if you want to take your product display a step further? Our guide is here to help you create a custom vertical slider, complete with scrolling and zoom capabilities, to showcase your products in a style that's uniquely yours.
Key Features of Our Enhanced Slider
Compatibility and Version Support:
- Our solution is compatible with Dawn versions 9 to 12 and other Shopify 2.0 free themes.
- For those using Dawn 2.5 or lower, check out our dedicated guide for vertical sliders on product pages.
- Our tutorial provides straightforward, step-by-step instructions.
- We've included a major code update to ensure seamless integration with the latest version of Dawn.
- View the accompanying image to see the stunning end result.
Setting Up Your Slider: Make sure to configure your Shopify theme editor to use the "thumbnail carousel" layout for desktop displays and to have "hide thumbnails" on mobile layout. This settings are crucial for the proper functioning of our enhanced slider.
We had a major code change to make this work with the latest version. We have removed the section settings as shown on the video. Please check the image below to see how it looks like.
You can also view the demo store here. Password: made4uo
What you are buying:
- A fully responsive code that enhances your product page.
- A product page section designed exclusively for this feature.
- Efficient, well-structured code that operates without external libraries.
- An innovative product image zoom feature that activates on hover.
- A stand-alone solution that requires no additional apps.
What makes our code better:
- We do not use external libraries, with that being said, our code will have no to minimal effect to your website's speed performance
- We do not leave or add codes use to advertise for our website
- Our code is mobile friendly
Any issues related to the code will be fix with no additional cost, excluding code customization requests. Simply contact us with "Chat with us." We are just a button away.
To start:
1. We have to go to our code editor. Shopify admin store > Themes > Edit code.
2. Look for the product-media-gallery.liquoid under the Snippet folder and replace the code below.
{% comment %} Renders a product media gallery. Should be used with 'media-gallery.js' Also see 'product-media-modal' Accepts: - product: {Object} Product liquid object - variant_images: {Array} Product images associated with a variant - is_duplicate: {Boolean} Prevents rendering uneeded elements and duplicate ids for subsequent instances Usage: {% render 'product-media-gallery', is_duplicate: true %} {% endcomment %} {{ 'main-product-vertical.css' | asset_url | stylesheet_tag }} {%- liquid if section.settings.hide_variants and variant_images.size == product.media.size assign single_media_visible = true endif assign media_count = product.media.size if section.settings.hide_variants and media_count > 1 and variant_images.size > 0 assign media_count = media_count | minus: variant_images.size | plus: 1 endif if media_count == 1 or single_media_visible assign single_media_visible_mobile = true endif if media_count == 0 or single_media_visible_mobile or section.settings.mobile_thumbnails == 'show' or section.settings.mobile_thumbnails == 'columns' and media_count < 3 assign hide_mobile_slider = true endif if section.settings.media_size == 'large' assign media_width = 0.65 elsif section.settings.media_size == 'medium' assign media_width = 0.55 elsif section.settings.media_size == 'small' assign media_width = 0.45 endif assign id_append = '' if is_duplicate assign id_append = '-duplicate' endif -%} <media-gallery id="MediaGallery-{{ section.id }}{{ id_append }}" role="region" {% if section.settings.enable_sticky_info %} class="product__column-sticky" {% endif %} aria-label="{{ 'products.product.media.gallery_viewer' | t }}" data-desktop-layout="{{ section.settings.gallery_layout }}" > {%- for media in product.media -%} {%- unless media.id == product.selected_or_first_available_variant.featured_media.id -%} {% assign no_thumbails_media = true %} {% endunless %} {% endfor %} <div id="GalleryStatus-{{ section.id }}" class="visually-hidden" role="status"></div> <main-slider id="GalleryViewer-{{ section.id }}{{ id_append }}" class="slider-mobile-gutter {% unless no_thumbails_media %}more--media{% endunless %}" > {%- unless is_duplicate -%} <a class="skip-to-content-link button visually-hidden quick-add-hidden" href="#ProductInfo-{{ section.id }}"> {{ 'accessibility.skip_to_product_info' | t }} </a> {%- endunless -%} <button type="button" class="slider-button slider-button--prev main-button--prev" name="previous" aria-label="{{ 'general.slider.previous_slide' | t }}" {% if product.media.size <= 1 %} style="display: none" {% endif %} > <svg class="icon" viewBox="0 0 15 15"> <path class="st0" d="M1.17,0.78l12.97,6.05c0.14,0.07,0.15,0.26,0.01,0.33L1.08,14.21c-0.2,0.11-0.4-0.13-0.26-0.29l4.46-6.78 c0.07-0.08,0.06-0.19-0.01-0.26l-4.34-5.8C0.77,0.94,0.96,0.69,1.17,0.78z"></path> </svg> </button> <ul id="Slider-Gallery-{{ section.id }}{{ id_append }}" class="product__media-list contains-media grid grid--peek list-unstyled slider slider--mobile" role="list" > {%- if product.selected_or_first_available_variant.featured_media != null -%} {%- assign featured_media = product.selected_or_first_available_variant.featured_media -%} <li id="Slide-{{ section.id }}-{{ featured_media.id }}{{ id_append }}" class="product__media-item grid__item slider__slide is-active{% if single_media_visible %} product__media-item--single{% endif %}{% if featured_media.media_type != 'image' %} product__media-item--full{% endif %}{% if section.settings.hide_variants and variant_images contains featured_media.src %} product__media-item--variant{% endif %}" data-media-id="{{ section.id }}-{{ featured_media.id }}" > {%- assign media_position = 1 -%} {% render 'product-thumbnail', media: featured_media, media_count: media_count, position: media_position, desktop_layout: section.settings.gallery_layout, mobile_layout: section.settings.mobile_thumbnails, loop: section.settings.enable_video_looping, modal_id: section.id, xr_button: true, media_width: media_width, media_fit: section.settings.media_fit, constrain_to_viewport: section.settings.constrain_to_viewport, lazy_load: false %} </li> {%- endif -%} {%- for media in product.media -%} {%- unless media.id == product.selected_or_first_available_variant.featured_media.id -%} <li id="Slide-{{ section.id }}-{{ media.id }}{{ id_append }}" class="product__media-item grid__item slider__slide{% if single_media_visible %} product__media-item--single{% endif %}{% if product.selected_or_first_available_variant.featured_media == null and forloop.index == 1 %} is-active{% endif %}{% if media.media_type != 'image' %} product__media-item--full{% endif %}{% if section.settings.hide_variants and variant_images contains media.src %} product__media-item--variant{% endif %}" data-media-id="{{ section.id }}-{{ media.id }}" > {%- liquid assign media_position = media_position | default: 0 | plus: 1 assign lazy_load = false if media_position > 1 assign lazy_load = true endif -%} {% render 'product-thumbnail', media: media, media_count: media_count, position: media_position, desktop_layout: section.settings.gallery_layout, mobile_layout: section.settings.mobile_thumbnails, loop: section.settings.enable_video_looping, modal_id: section.id, xr_button: true, media_width: media_width, media_fit: section.settings.media_fit, constrain_to_viewport: section.settings.constrain_to_viewport, lazy_load: lazy_load %} </li> {%- endunless -%} {%- endfor -%} </ul> <button type="button" class="slider-button slider-button--next main-button--next" name="next" aria-label="{{ 'general.slider.next_slide' | t }}" {% if product.media.size <= 1 %} style="display: none" {% endif %} > <svg class="icon" viewBox="0 0 15 15"> <path class="st0" d="M1.17,0.78l12.97,6.05c0.14,0.07,0.15,0.26,0.01,0.33L1.08,14.21c-0.2,0.11-0.4-0.13-0.26-0.29l4.46-6.78 c0.07-0.08,0.06-0.19-0.01-0.26l-4.34-5.8C0.77,0.94,0.96,0.69,1.17,0.78z"></path> </svg> </button> </main-slider> <slider-component id="GalleryViewer-{{ section.id }}{{ id_append }}" class="slider-mobile-gutter"> {%- unless is_duplicate -%} <a class="skip-to-content-link button visually-hidden quick-add-hidden" href="#ProductInfo-{{ section.id }}"> {{ 'accessibility.skip_to_product_info' | t }} </a> {%- endunless -%} <ul id="Slider-Gallery-{{ section.id }}{{ id_append }}" class="product__media-list contains-media grid grid--peek list-unstyled slider slider--mobile" role="list" > {%- if product.selected_or_first_available_variant.featured_media != null -%} {%- assign featured_media = product.selected_or_first_available_variant.featured_media -%} <li id="Slide-{{ section.id }}-{{ featured_media.id }}{{ id_append }}" class="product__media-item grid__item slider__slide is-active{% if single_media_visible %} product__media-item--single{% endif %}{% if featured_media.media_type != 'image' %} product__media-item--full{% endif %}{% if section.settings.hide_variants and variant_images contains featured_media.src %} product__media-item--variant{% endif %}" data-media-id="{{ section.id }}-{{ featured_media.id }}" > {%- assign media_position = 1 -%} {% render 'product-thumbnail', media: featured_media, media_count: media_count, position: media_position, desktop_layout: section.settings.gallery_layout, mobile_layout: section.settings.mobile_thumbnails, loop: section.settings.enable_video_looping, modal_id: section.id, xr_button: true, media_width: media_width, media_fit: section.settings.media_fit, constrain_to_viewport: section.settings.constrain_to_viewport, lazy_load: false %} </li> {%- endif -%} {%- for media in product.media -%} {%- unless media.id == product.selected_or_first_available_variant.featured_media.id -%} <li id="Slide-{{ section.id }}-{{ media.id }}{{ id_append }}" class="product__media-item grid__item slider__slide{% if single_media_visible %} product__media-item--single{% endif %}{% if product.selected_or_first_available_variant.featured_media == null and forloop.index == 1 %} is-active{% endif %}{% if media.media_type != 'image' %} product__media-item--full{% endif %}{% if section.settings.hide_variants and variant_images contains media.src %} product__media-item--variant{% endif %}" data-media-id="{{ section.id }}-{{ media.id }}" > {%- liquid assign media_position = media_position | default: 0 | plus: 1 assign lazy_load = false if media_position > 1 assign lazy_load = true endif -%} {% render 'product-thumbnail', media: media, media_count: media_count, position: media_position, desktop_layout: section.settings.gallery_layout, mobile_layout: section.settings.mobile_thumbnails, loop: section.settings.enable_video_looping, modal_id: section.id, xr_button: true, media_width: media_width, media_fit: section.settings.media_fit, constrain_to_viewport: section.settings.constrain_to_viewport, lazy_load: lazy_load %} </li> {%- endunless -%} {%- endfor -%} </ul> {%- unless is_duplicate -%} <div class="slider-buttons no-js-hidden quick-add-hidden{% if hide_mobile_slider %} small-hide{% endif %}"> <button type="button" class="slider-button slider-button--prev" name="previous" aria-label="{{ 'general.slider.previous_slide' | t }}" > {% render 'icon-caret' %} </button> <div class="slider-counter caption"> <span class="slider-counter--current">1</span> <span aria-hidden="true"> / </span> <span class="visually-hidden">{{ 'general.slider.of' | t }}</span> <span class="slider-counter--total">{{ media_count }}</span> </div> <button type="button" class="slider-button slider-button--next" name="next" aria-label="{{ 'general.slider.next_slide' | t }}" > {% render 'icon-caret' %} </button> </div> {%- endunless -%} </slider-component> {%- if first_3d_model -%} <button class="button button--full-width product__xr-button" type="button" aria-label="{{ 'products.product.xr_button_label' | t }}" data-shopify-xr data-shopify-model3d-id="{{ first_3d_model.id }}" data-shopify-title="{{ product.title | escape }}" data-shopify-xr-hidden > {% render 'icon-3d-model' %} {{ 'products.product.xr_button' | t }} </button> {%- endif -%} {%- if media_count > 1 and section.settings.gallery_layout contains 'thumbnail' or section.settings.mobile_thumbnails == 'show' -%} <thumbnail-slider id="GalleryThumbnails-{{ section.id }}{{ id_append }}" class="thumbnail-slider slider-mobile-gutter quick-add-hidden{% unless section.settings.gallery_layout contains 'thumbnail' %} medium-hide large-up-hide{% endunless %}{% if section.settings.mobile_thumbnails != 'show' %} small-hide{% endif %}{% if media_count <= 3 %} thumbnail-slider--no-slide{% endif %}" > <button type="button" class="slider-button thumbnail-button slider-button--prev{% if media_count <= 3 %} small-hide{% endif %}{% if media_count <= 4 %} medium-hide large-up-hide{% endif %}" name="previous" aria-label="{{ 'general.slider.previous_slide' | t }}" aria-controls="GalleryThumbnails-{{ section.id }}" data-step="3" > <svg class="icon" viewBox="0 0 15 15"> <path class="st0" d="M1.17,0.78l12.97,6.05c0.14,0.07,0.15,0.26,0.01,0.33L1.08,14.21c-0.2,0.11-0.4-0.13-0.26-0.29l4.46-6.78 c0.07-0.08,0.06-0.19-0.01-0.26l-4.34-5.8C0.77,0.94,0.96,0.69,1.17,0.78z"></path> </svg> </button> <ul id="Slider-Thumbnails-{{ section.id }}{{ id_append }}" class="thumbnail-list list-unstyled slider slider--mobile{% if section.settings.gallery_layout == 'thumbnail_slider' %} slider--tablet-up{% endif %}" > {%- capture sizes -%} (min-width: {{ settings.page_width }}px) calc(({{ settings.page_width | minus: 100 | times: media_width | round }} - 4rem) / 4), (min-width: 990px) calc(({{ media_width | times: 100 }}vw - 4rem) / 4), (min-width: 750px) calc((100vw - 15rem) / 8), calc((100vw - 8rem) / 3) {%- endcapture -%} {%- if featured_media != null -%} {%- liquid capture media_index if featured_media.media_type == 'model' increment model_index elsif featured_media.media_type == 'video' or featured_media.media_type == 'external_video' increment video_index elsif featured_media.media_type == 'image' increment image_index endif endcapture assign media_index = media_index | plus: 1 -%} <li id="Slide-Thumbnails-{{ section.id }}-0{{ id_append }}" class="thumbnail-list__item slider__slide{% if section.settings.hide_variants and variant_images contains featured_media.src %} thumbnail-list_item--variant{% endif %}" data-target="{{ section.id }}-{{ featured_media.id }}" data-media-position="{{ media_index }}" > {%- capture thumbnail_id -%} Thumbnail-{{ section.id }}-0{{ id_append }} {%- endcapture -%} <button class="thumbnail global-media-settings global-media-settings--no-shadow" aria-label="{%- if featured_media.media_type == 'image' -%}{{ 'products.product.media.load_image' | t: index: media_index }}{%- elsif featured_media.media_type == 'model' -%}{{ 'products.product.media.load_model' | t: index: media_index }}{%- elsif featured_media.media_type == 'video' or featured_media.media_type == 'external_video' -%}{{ 'products.product.media.load_video' | t: index: media_index }}{%- endif -%}" aria-current="true" aria-controls="GalleryViewer-{{ section.id }}{{ id_append }}" aria-describedby="{{ thumbnail_id }}" > {{ featured_media.preview_image | image_url: width: 416 | image_tag: loading: 'lazy', sizes: sizes, widths: '54, 74, 104, 162, 208, 324, 416', id: thumbnail_id, alt: featured_media.alt | escape }} </button> </li> {%- endif -%} {%- for media in product.media -%} {%- unless media.id == product.selected_or_first_available_variant.featured_media.id -%} {%- liquid capture media_index if media.media_type == 'model' increment model_index elsif media.media_type == 'video' or media.media_type == 'external_video' increment video_index elsif media.media_type == 'image' increment image_index endif endcapture assign media_index = media_index | plus: 1 -%} <li id="Slide-Thumbnails-{{ section.id }}-{{ forloop.index }}{{ id_append }}" class="thumbnail-list__item slider__slide{% if section.settings.hide_variants and variant_images contains media.src %} thumbnail-list_item--variant{% endif %}" data-target="{{ section.id }}-{{ media.id }}" data-media-position="{{ media_index }}" > {%- if media.media_type == 'model' -%} <span class="thumbnail__badge" aria-hidden="true"> {%- render 'icon-3d-model' -%} </span> {%- elsif media.media_type == 'video' or media.media_type == 'external_video' -%} <span class="thumbnail__badge" aria-hidden="true"> {%- render 'icon-play' -%} </span> {%- endif -%} {%- capture thumbnail_id -%} Thumbnail-{{ section.id }}-{{ forloop.index }}{{ id_append }} {%- endcapture -%} <button class="thumbnail global-media-settings global-media-settings--no-shadow" aria-label="{%- if media.media_type == 'image' -%}{{ 'products.product.media.load_image' | t: index: media_index }}{%- elsif media.media_type == 'model' -%}{{ 'products.product.media.load_model' | t: index: media_index }}{%- elsif media.media_type == 'video' or media.media_type == 'external_video' -%}{{ 'products.product.media.load_video' | t: index: media_index }}{%- endif -%}" {% if media == product.selected_or_first_available_variant.featured_media or product.selected_or_first_available_variant.featured_media == null and forloop.index == 1 %} aria-current="true" {% endif %} aria-controls="GalleryViewer-{{ section.id }}{{ id_append }}" aria-describedby="{{ thumbnail_id }}" > {{ media.preview_image | image_url: width: 416 | image_tag: loading: 'lazy', sizes: sizes, widths: '54, 74, 104, 162, 208, 324, 416', id: thumbnail_id, alt: media.alt | escape }} </button> </li> {%- endunless -%} {%- endfor -%} </ul> <button type="button" class="slider-button thumbnail-button slider-button--next{% if media_count <= 3 %} small-hide{% endif %}{% if media_count <= 4 %} medium-hide large-up-hide{% endif %}" name="next" aria-label="{{ 'general.slider.next_slide' | t }}" aria-controls="GalleryThumbnails-{{ section.id }}" data-step="3" > <svg class="icon" viewBox="0 0 15 15"> <path class="st0" d="M1.17,0.78l12.97,6.05c0.14,0.07,0.15,0.26,0.01,0.33L1.08,14.21c-0.2,0.11-0.4-0.13-0.26-0.29l4.46-6.78 c0.07-0.08,0.06-0.19-0.01-0.26l-4.34-5.8C0.77,0.94,0.96,0.69,1.17,0.78z"></path> </svg> </button> </thumbnail-slider> {%- endif -%} </media-gallery> |
3. We have to add a css file for our slider. Open the Assets folder, and "Add a new asset", name it "main-product-vertical" and place the code below.
.product, .product__title > * { margin: 0; } .product.grid { gap: 0; } .product--no-media { max-width: 57rem; margin: 0 auto; } .product__media-wrapper, .product-form__input .form__label, .product--no-media .product__info-wrapper { padding-left: 0; } @media screen and (min-width: 750px) { slider-component.slider-mobile-gutter { display: flex; } .product__column-sticky { display: block; position: sticky; top: 3rem; z-index: 2; } .product--thumbnail .thumbnail-list, .product__media-list { padding-right: var(--media-shadow-horizontal-offset); } .product__info-wrapper { padding: 0 0 0 5rem; } .product__info-wrapper--extra-padding { padding: 0 0 0 8rem; } .product--right .product__info-wrapper { padding: 0 5rem 0 0; } .product--right .product__info-wrapper--extra-padding { padding: 0 8rem 0 0; } .product--right .product__media-list { margin-bottom: 2rem; } .product__media-container .slider-buttons, .product--thumbnail .product__media-item:not(.is-active), .product--thumbnail_slider .product__media-item:not(.is-active), .product-media-modal__content > .product__media-item--variant.product__media-item--variant, .product__modal-opener:not(.product__modal-opener--image), .product--stacked .thumbnail-list, .product__media-wrapper .slider-mobile-gutter .slider-button, .product-media-container .product__modal-opener:not(.product__modal-opener--image) { display: none; } .product__info-container { max-width: 60rem; } .product__info-container .price--on-sale .price-item--regular { font-size: 1.6rem; } .product__info-container > *:first-child { margin-top: 0; } .product--thumbnail .product__media-list, .product--thumbnail_slider .product__media-list { padding-bottom: calc( var(--media-shadow-vertical-offset) * var(--media-shadow-visible) ); } .product__media-list { padding-right: calc( var(--media-shadow-horizontal-offset) * var(--media-shadow-visible) ); } .product-media-modal__content > .product__media-item--variant:first-child, .product-media-modal__content > *:not(.active), .product__media-list .deferred-media { display: block; } .grid__item.product__media-item--full, .product-media-modal__content > *, .product__media-item:first-child { width: 100%; } .product--columns .product__media-item:not(.product__media-item--single):not(:only-child) { max-width: calc(50% - var(--grid-desktop-horizontal-spacing) / 2); } .product--large.product--columns .product__media-item--full .deferred-media__poster-button { height: 5rem; width: 5rem; } .product--medium.product--columns .product__media-item--full .deferred-media__poster-button { height: 4.2rem; width: 4.2rem; } .product--medium.product--columns .product__media-item--full .deferred-media__poster-button .icon { width: 1.8rem; height: 1.8rem; } .product--small.product--columns .product__media-item--full .deferred-media__poster-button { height: 3.6rem; width: 3.6rem; } .product--small.product--columns .product__media-item--full .deferred-media__poster-button .icon { width: 1.6rem; height: 1.6rem; } .product-media-modal__content { padding-bottom: 2rem; } .product-media-modal__content { padding: 2rem 11rem; } .product-media-modal__content > * + * { margin-top: 2rem; } .product-media-modal__toggle { right: 5rem; top: 2.2rem; } .product-popup-modal__content { padding-right: 1.5rem; margin-top: 10rem; width: 70%; padding: 0 3rem; } .product-media-modal__dialog .global-media-settings--no-shadow { overflow: visible !important; } .thumbnail-list { display: grid; grid-template-columns: repeat(4, 1fr); } .product--thumbnail_slider .thumbnail-slider { display: flex; align-items: center; } .thumbnail-slider .thumbnail-list.slider--tablet-up { display: flex; flex: 1; scroll-padding-left: 0.5rem; } .product--thumbnail_slider .slider-mobile-gutter .slider-button { display: flex; } .product:not(.product--small) .thumbnail__badge { height: 3rem; width: 3rem; } .product:not(.product--small) .thumbnail__badge .icon { width: 1.2rem; height: 1.2rem; } .product:not(.product--small) .thumbnail__badge .icon-3d-model { width: 1.4rem; height: 1.4rem; } .product-media-container { max-width: 100%; } .product-media-container:not(.media-type-image) { --aspect-ratio: var(--ratio); } .product-media-container.constrain-height { --viewport-offset: 170px; --constrained-min-height: 500px; } .product-media-container.media-fit-cover, .product-media-container.media-fit-cover .product__modal-opener, .product-media-container.media-fit-cover .media, .slider-mobile-gutter { height: 100%; } .product-media-container.media-fit-cover .deferred-media__poster img { object-fit: cover; width: 100%; } .product--thumbnail .product__media-gallery, .product--thumbnail_slider .product__media-gallery, .product--stacked .product__info-container--sticky { display: flex; position: sticky; top: 3rem; z-index: 2; gap: clamp(1rem, 3vw, 3rem); } .product__info-wrapper { padding-left: 5rem; } .product__info-wrapper--extra-padding { padding-left: 8rem; } .product--thumbnail .product__media-list, .product--thumbnail_slider .product__media-list { padding-bottom: var(--media-shadow-vertical-offset); } .product--thumbnail_slider .thumbnail-slider { display: flex; flex-direction: column; } .thumbnail-slider .thumbnail-list.slider--tablet-up { display: flex; flex-direction: column; flex: 1; align-items: center; } } @media screen and (min-width: 990px) { .product--large:not(.product--no-media) .product__media-wrapper { max-width: 65%; width: calc(65% - var(--grid-desktop-horizontal-spacing) / 2); } .product--large:not(.product--no-media) .product__info-wrapper { padding: 0 0 0 4rem; max-width: 35%; width: calc(35% - var(--grid-desktop-horizontal-spacing) / 2); } .product--large:not(.product--no-media).product--right .product__info-wrapper { padding: 0 4rem 0 0; } .product--medium:not(.product--no-media) .product__media-wrapper, .product--small:not(.product--no-media) .product__info-wrapper, .product--medium:not(.product--no-media) .product__media-wrapper, .product--small:not(.product--no-media) .product__info-wrapper { max-width: 55%; width: calc(55% - var(--grid-desktop-horizontal-spacing) / 2); } .product--medium:not(.product--no-media) .product__info-wrapper, .product--small:not(.product--no-media) .product__media-wrapper, .product--medium:not(.product--no-media) .product__info-wrapper, .product--small:not(.product--no-media) .product__media-wrapper { max-width: 45%; width: calc(45% - var(--grid-desktop-horizontal-spacing) / 2); } .product--stacked .product__media-item { max-width: calc(50% - var(--grid-desktop-horizontal-spacing) / 2); } .product:not(.product--columns) .product__media-list .product__media-item:first-child, .product:not(.product--columns) .product__media-list .product__media-item--full { width: 100%; max-width: 100%; } .product__modal-opener .product__media-icon { opacity: 0; } .product__modal-opener:hover .product__media-icon, .product__modal-opener:focus .product__media-icon, .product__modal-opener:hover .product__media-icon, .product__modal-opener:focus .product__media-icon { opacity: 1; } .product-media-modal__content { padding: 2rem 11rem; } .product-media-modal__content > * + * { margin-top: 1.5rem; } .product-media-modal__content { padding-bottom: 1.5rem; } .product-media-modal__toggle { right: 5rem; } .thumbnail-list { grid-template-columns: repeat(4, 1fr); } .product--medium .thumbnail-list { grid-template-columns: repeat(5, 1fr); } .product--large .thumbnail-list { grid-template-columns: repeat(6, 1fr); } .product--large:not(.product--no-media) .product__info-wrapper { padding-left: 4rem; max-width: 35%; width: calc(35% - var(--grid-desktop-horizontal-spacing) / 2); } .thumbnail-list { margin-left: 0; grid-template-columns: repeat(4, 1fr); } } .shopify-payment-button__button { font-family: inherit; min-height: 4.6rem; } .shopify-payment-button__button [role="button"].focused, .no-js .shopify-payment-button__button [role="button"]:focus, .shopify-payment-button__button [role="button"].focused, .no-js .shopify-payment-button__button [role="button"]:focus { outline: 0.2rem solid rgba(var(--color-foreground), 0.5) !important; outline-offset: 0.3rem; box-shadow: 0 0 0 0.1rem rgba(var(--color-button), var(--alpha-button-border)), 0 0 0 0.3rem rgb(var(--color-background)), 0 0 0.5rem 0.4rem rgba(var(--color-foreground), 0.3) !important; } .shopify-payment-button__button [role="button"]:focus:not(:focus-visible) { outline: 0; box-shadow: none !important; } .shopify-payment-button__button [role="button"]:focus-visible { outline: 0.2rem solid rgba(var(--color-foreground), 0.5) !important; box-shadow: 0 0 0 0.1rem rgba(var(--color-button), var(--alpha-button-border)), 0 0 0 0.3rem rgb(var(--color-background)), 0 0 0.5rem 0.4rem rgba(var(--color-foreground), 0.3) !important; } .shopify-payment-button__button--unbranded { background-color: rgba(var(--color-button), var(--alpha-button-background)); color: rgb(var(--color-button-text)); font-size: 1.4rem; line-height: calc(1 + 0.2 / var(--font-body-scale)); letter-spacing: 0.07rem; } .shopify-payment-button__button--unbranded::selection { background-color: rgba(var(--color-button-text), 0.3); } .shopify-payment-button__button--unbranded:hover, .shopify-payment-button__button--unbranded:hover:not([disabled]), .shopify-payment-button__button--unbranded:hover, .shopify-payment-button__button--unbranded:hover:not([disabled]) { background-color: rgba(var(--color-button), var(--alpha-button-background)); } .shopify-payment-button__more-options { margin: 1.6rem 0 1rem; font-size: 1.2rem; line-height: calc(1 + 0.5 / var(--font-body-scale)); letter-spacing: 0.05rem; text-decoration: underline; text-underline-offset: 0.3rem; } .shopify-payment-button__button + .shopify-payment-button__button--hidden, .product-form__input input[type="radio"]:not(.disabled) + label > .visually-hidden, .product__title > a, .product .price--sold-out .price__badge-sale, .product__media-item.product__media-item--variant, .product-media-modal__content > *:not(.active), .product__media-list .deferred-media, .thumbnail-list_item--variant:not(:first-child), .product__modal-opener--image .product__media-zoom-none, .product__media-icon--none, .product:not(.featured-product) .product__view-details, .no-js .recipient-checkbox, .js .recipient-fields, .recipient-form > input[type="checkbox"]:not(:checked, :disabled) ~ .recipient-fields, .recipient-email-label, .shopify-payment-button__button--hidden, .product-form__submit[aria-disabled="true"] + .shopify-payment-button, .product-form__submit[disabled] + .shopify-payment-button, .product-media-modal__content > *:not(.active), .product__media-list .deferred-media, .product__media-list .product__media-toggle, .mobile-slider { display: none; } .product-form, variant-radios, variant-selects, .product__media-item--variant:first-child, .product__inventory.visibility-hidden:empty, variant-radios, variant-selects { display: block; } .product-form__error-message-wrapper:not([hidden]) { display: flex; align-items: flex-start; font-size: 1.2rem; margin-bottom: 1.5rem; } .product-form__error-message-wrapper svg { flex-shrink: 0; width: 1.2rem; height: 1.2rem; margin-right: 0.7rem; margin-top: 0.5rem; } .product-form__input { flex: 0 0 100%; padding: 0; margin: 0 0 1.2rem; max-width: 44rem; min-width: fit-content; border: none; } .product-form__input--dropdown { margin-bottom: 1.6rem; } fieldset.product-form__input .form__label { margin-bottom: 0.2rem; } .product-form__input input[type="radio"] { clip: rect(0, 0, 0, 0); overflow: hidden; position: absolute; height: 1px; width: 1px; } .product-form__input input[type="radio"] + label { border: var(--variant-pills-border-width) solid rgba(var(--color-foreground), var(--variant-pills-border-opacity)); background-color: rgb(var(--color-background)); color: rgba(var(--color-foreground)); border-radius: var(--variant-pills-radius); color: rgb(var(--color-foreground)); display: inline-block; margin: 0.7rem 0.5rem 0.2rem 0; padding: 1rem 2rem; font-size: 1.4rem; letter-spacing: 0.1rem; line-height: 1; text-align: center; transition: border var(--duration-short) ease; cursor: pointer; position: relative; } .product-form__input input[type="radio"] + label:before { content: ""; position: absolute; top: calc(var(--variant-pills-border-width) * -1); right: calc(var(--variant-pills-border-width) * -1); bottom: calc(var(--variant-pills-border-width) * -1); left: calc(var(--variant-pills-border-width) * -1); z-index: -1; border-radius: var(--variant-pills-radius); box-shadow: var(--variant-pills-shadow-horizontal-offset) var(--variant-pills-shadow-vertical-offset) var(--variant-pills-shadow-blur-radius) rgba(var(--color-shadow), var(--variant-pills-shadow-opacity)); } .product-form__input input[type="radio"] + label:hover { border-color: rgb(var(--color-foreground)); } .product-form__input input[type="radio"]:checked + label { background-color: rgb(var(--color-foreground)); color: rgb(var(--color-background)); } @media screen and (forced-colors: active) { .product-form__input input[type="radio"]:checked + label { text-decoration: underline; } .product-form__submit[aria-disabled="true"] { color: Window; } .recipient-fields > hr { border-top: 0.1rem solid rgb(var(--color-background)); } .recipient-checkbox > svg { background-color: inherit; border: 0.1rem solid rgb(var(--color-background)); } .recipient-form > input[type="checkbox"]:checked + label .icon-checkmark { border: none; } } .product-form__input input[type="radio"]:checked + label::selection { background-color: rgba(var(--color-background), 0.3); } .product-form__input input[type="radio"]:disabled + label, .product-form__input input[type="radio"].disabled + label { border-color: rgba(var(--color-foreground), 0.1); color: rgba(var(--color-foreground), 0.6); text-decoration: line-through; } .product-form__input input[type="radio"].disabled:checked + label, .product-form__input input[type="radio"]:disabled:checked + label { color: rgba(var(--color-background), 0.6); } .product-form__input input[type="radio"]:focus-visible + label, .product-form__input input[type="radio"].focused + label, .no-js .shopify-payment-button__button [role="button"]:focus + label, .product-form__input input[type="radio"].focused + label, .no-js .shopify-payment-button__button [role="button"]:focus + label { box-shadow: 0 0 0 0.3rem rgb(var(--color-background)), 0 0 0 0.5rem rgba(var(--color-foreground), 0.55); } .no-js .product-form__input input[type="radio"]:focus:not(:focus-visible) + label { box-shadow: none; } .product-form__input .select { max-width: 25rem; } .product-form__submit { margin-bottom: 1rem; } .no-js .product-form__submit.button--secondary { --color-button: var(--color-base-accent-1); --color-button-text: var(--color-base-solid-button-labels); --alpha-button-background: 1; } .product-form__submit[aria-disabled="true"] + .shopify-payment-button .shopify-payment-button__button[disabled], .product-form__submit[disabled] + .shopify-payment-button .shopify-payment-button__button[disabled] { cursor: not-allowed; opacity: 0.5; } .shopify-payment-button__more-options { color: rgb(var(--color-foreground)); } .shopify-payment-button__button { font-size: 1.5rem; letter-spacing: 0.1rem; } .product__info-container > * + * { margin: 1.5rem 0; } .product__info-container iframe, .product--no-media noscript .product-form__input, .product--no-media .share-button, .product-popup-modal__content img, .product--no-media noscript .product-form__input, .product--no-media .share-button { max-width: 100%; } .product__info-container .product-form, .product__info-container .product__description, .product__info-container .icon-with-text, .product__info-container .product-form, .product__info-container .product__description { margin: 2.5rem 0; } .product__text { margin-bottom: 0; } a.product__text { display: block; text-decoration: none; color: rgba(var(--color-foreground), 0.75); } .product__text.caption-with-letter-spacing { text-transform: uppercase; } .product__title { word-break: break-word; margin-bottom: 1.5rem; } .product__title + .product__text.caption-with-letter-spacing { margin-top: -1.5rem; } .product__text.caption-with-letter-spacing + .product__title { margin-top: 0; } .product__accordion .accordion__content { padding: 0 1rem; } .product .price .badge, .product .price__container { margin-bottom: 0.5rem; } .product .price dl { margin-top: 0.5rem; margin-bottom: 0.5rem; } .product .price--sold-out .price__badge-sold-out { background: transparent; color: rgb(var(--color-base-text)); border-color: transparent; } .product__description-title { font-weight: 600; } .product--no-media .product__title, .product--no-media .product__text, .product--no-media noscript .product-form__input, .product--no-media .product__tax, .product--no-media .product__sku, .product--no-media shopify-payment-terms, .product--no-media .price, .product--no-media .product__title, .product--no-media .product__text, .product--no-media noscript .product-form__input, .product--no-media .product__tax { text-align: center; } .product--no-media .product__media-wrapper, .product--no-media .product__info-wrapper { padding: 0; } .product__tax { margin-top: -1.4rem; } .product--no-media fieldset.product-form__input, .product--no-media .product-form__quantity, .product--no-media .product-form__input--dropdown, .product--no-media .share-button, .product--no-media .product__view-details, .product--no-media .product__pickup-availabilities, .product--no-media .product-form, .product--no-media fieldset.product-form__input, .product--no-media .product-form__quantity, .product--no-media .product-form__input--dropdown, .product--no-media .share-button, .product--no-media .product__view-details, .product--no-media .product__pickup-availabilities, .product--no-media .product-form { display: flex; align-items: center; justify-content: center; text-align: center; } .product--no-media .product-form { flex-direction: column; } .product--no-media .product-form > .form { max-width: 30rem; width: 100%; } .product--no-media .product-form__quantity, .product--no-media .product-form__input--dropdown, .product--no-media .product-form__quantity, .product--no-media .product-form__input--dropdown { flex-direction: column; max-width: 100%; } .product-form__quantity .form__label { margin-bottom: 0.6rem; } .product-form__quantity-top .form__label { margin-bottom: 1.2rem; } .product--no-media fieldset.product-form__input { flex-wrap: wrap; margin: 0 auto 1.2rem; } .product-form__buttons { max-width: 44rem; } .product--no-media .product__info-container > modal-opener { display: block; text-align: center; } .product--no-media .product-popup-modal__button { padding-right: 0; } .product__media-list video { border-radius: calc(var(--media-radius) - var(--media-border-width)); } @media screen and (max-width: 749px) { .product__media-list { margin-left: -2.5rem; margin-bottom: 3rem; width: calc(100% + 4rem); } .product__media-wrapper slider-component:not(.thumbnail-slider--no-slide), .product__media-wrapper main-slider:not(.thumbnail-slider--no-slide) { margin-left: -1.5rem; margin-right: -1.5rem; } .slider.product__media-list::-webkit-scrollbar { height: 0.2rem; width: 0.2rem; } .product__media-list::-webkit-scrollbar-thumb { background-color: rgb(var(--color-foreground)); } .product__media-list::-webkit-scrollbar-track { background-color: rgba(var(--color-foreground), 0.2); } .product__media-list .product__media-item { width: calc(100% - 3rem - var(--grid-mobile-horizontal-spacing)); } .product--mobile-columns .product__media-item { width: calc(50% - 1.5rem - var(--grid-mobile-horizontal-spacing)); } .product--thumbnail .is-active .product__modal-opener:not(.product__modal-opener--image), .product--thumbnail_slider .is-active .product__modal-opener:not(.product__modal-opener--image), thumbnail-slider.vertical-hide, .product--thumbnail .is-active > .product__modal-opener:not(.product__modal-opener--image), .product--thumbnail_slider .is-active > .product__modal-opener:not(.product__modal-opener--image) { display: none; } .product--thumbnail .is-active .deferred-media, .product--thumbnail_slider .is-active .deferred-media, .product--thumbnail .is-active .deferred-media, .product--thumbnail_slider .is-active .deferred-media { display: block; width: 100%; } .product-popup-modal__content table { display: block; max-width: fit-content; overflow-x: auto; white-space: nowrap; margin: 0; } .product-media-modal__dialog .global-media-settings, .product-media-modal__dialog .global-media-settings video, .product-media-modal__dialog .global-media-settings model-viewer, .product-media-modal__dialog .global-media-settings iframe, .product-media-modal__dialog .global-media-settings img, .product-media-modal__dialog .global-media-settings, .product-media-modal__dialog .global-media-settings video, .product-media-modal__dialog .global-media-settings model-viewer, .product-media-modal__dialog .global-media-settings iframe, .product-media-modal__dialog .global-media-settings img { border: none; border-radius: 0; } .product-popup-modal__content-info > * { max-height: 100%; } .product__media-item, .thumbnail-slider { display: flex; align-items: center; } .product__modal-opener { width: 100%; } .thumbnail-slider .thumbnail-list.slider { display: flex; padding: 0.5rem; flex: 1; scroll-padding-left: 0.5rem; } .thumbnail-list__item.slider__slide { width: calc(33% - 0.6rem); } .product__media-zoom-hover, .product__media-icon--hover, slider-component.mobile-slider { display: flex; } .product-media-container.media-fit-cover { display: flex; align-self: stretch; } .product-media-container.media-fit-cover .media { position: initial; } .product__media-list { width: calc(100% + 4rem); } main-slider .mobile-hide { display: none !important; } .product__media-list .product__media-item { width: calc(100% - 3rem); } .product__media-wrapper { padding-bottom: 1rem; } .product__media-item--variant:first-child { padding-right: 1.5rem; } .mobile-slider .thumbnail-list.slider, .thumbnail-slider .thumbnail-list.slider { display: flex; flex: 1; scroll-padding-left: 0.5rem; } } @media screen and (min-width: 750px) and (max-width: 989px) { .product__media-list .product__media-item:first-child { padding-left: 0; } .product--thumbnail_slider .product__media-list { margin-left: 0; } .product__media-list .product__media-item { width: 100%; } .product__media-list .product__media-item { padding: 0 0 0.5rem; width: 100%; } } .product__media-icon .icon { width: 1.2rem; height: 1.4rem; } .product__media-icon, .thumbnail__badge { background-color: rgb(var(--color-background)); border-radius: 50%; border: 0.1rem solid rgba(var(--color-foreground), 0.1); color: rgb(var(--color-foreground)); display: flex; align-items: center; justify-content: center; height: 3rem; width: 3rem; position: absolute; left: 1.2rem; top: 1.2rem; z-index: 1; transition: color var(--duration-short) ease, opacity var(--duration-short) ease; } .product__media-video .product__media-icon { opacity: 1; } .product__modal-opener--image .product__media-toggle:hover, .image-magnify-hover { cursor: zoom-in; } .product__modal-opener:hover .product__media-icon { border: 0.1rem solid rgba(var(--color-foreground), 0.1); } .product__media-item > *, .product-media-container .product__modal-opener { display: block; position: relative; } .product__media-toggle { display: flex; border: none; background-color: transparent; color: currentColor; padding: 0; } .product__media-toggle::after { content: ""; cursor: pointer; display: block; margin: 0; padding: 0; position: absolute; top: calc(var(--border-width) * -1); right: calc(var(--border-width) * -1); bottom: calc(var(--border-width) * -1); left: calc(var(--border-width) * -1); z-index: 2; } .product__media-toggle:focus-visible, .product__media-toggle.focused { outline: 0; box-shadow: none; } @media (forced-colors: active) { .product__media-toggle:focus-visible, .product__media-toggle:focus-visible:after, .product-form__input input[type="radio"]:focus-visible + label { outline: transparent solid 1px; outline-offset: 2px; } .thumbnail[aria-current]:focus, .thumbnail.focused { outline: transparent solid 1px; } } .product__media-toggle:focus-visible:after, .product__media-toggle.focused:after { box-shadow: 0 0 0 0.3rem rgb(var(--color-background)), 0 0 0.5rem rgba(var(--color-foreground), 0.5); border-radius: var(--media-radius); } .product-media-modal { background-color: rgb(var(--color-background)); height: 100%; position: fixed; top: 0; left: 0; width: 100%; visibility: hidden; opacity: 0; z-index: -1; } .product-media-modal[open] { visibility: visible; opacity: 1; z-index: 101; } .product-media-modal__dialog { display: flex; align-items: center; height: 100vh; } .product-media-modal__content { max-height: 100vh; width: 100%; overflow: auto; } .product-media-modal__content > * { display: block; height: auto; margin: auto; } .product-media-modal__content .media { background: none; } .product-media-modal__model, .product-media-modal__content .deferred-media, .thumbnail-list.slider--tablet-up .thumbnail-list__item.slider__slide { width: 100%; } .product-media-modal__toggle { background-color: rgb(var(--color-background)); border: 0.1rem solid rgba(var(--color-foreground), 0.1); border-radius: 50%; color: rgba(var(--color-foreground), 0.55); display: flex; align-items: center; justify-content: center; cursor: pointer; right: 2rem; padding: 1.2rem; position: fixed; z-index: 2; top: 2rem; width: 4rem; } .product-media-modal__toggle:hover, .product-popup-modal__toggle:hover { color: rgba(var(--color-foreground), 0.75); } .product-media-modal__toggle .icon, .product-popup-modal__toggle .icon { height: auto; margin: 0; width: 2.2rem; } .product-popup-modal { box-sizing: border-box; opacity: 0; position: fixed; visibility: hidden; z-index: -1; margin: 0 auto; top: 0; left: 0; overflow: auto; width: 100%; background: rgba(var(--color-foreground), 0.2); height: 100%; } .product-popup-modal[open] { opacity: 1; visibility: visible; z-index: 101; } .product-popup-modal__content { border-radius: var(--popup-corner-radius); background-color: rgb(var(--color-background)); overflow: auto; height: 80%; margin: 0 auto; left: 50%; transform: translateX(-50%); margin-top: 5rem; width: 92%; position: absolute; top: 0; padding: 0 1.5rem 0 3rem; border-color: rgba(var(--color-foreground), var(--popup-border-opacity)); border-style: solid; border-width: var(--popup-border-width); box-shadow: var(--popup-shadow-horizontal-offset) var(--popup-shadow-vertical-offset) var(--popup-shadow-blur-radius) rgba(var(--color-shadow), var(--popup-shadow-opacity)); } .product-popup-modal__content.focused, .product-popup-modal__content:focus-visible { box-shadow: 0 0 0 0.3rem rgb(var(--color-background)), 0 0 0.5rem.4rem rgba(var(--color-foreground), 0.3), var(--popup-shadow-horizontal-offset) var(--popup-shadow-vertical-offset) var(--popup-shadow-blur-radius) rgba(var(--color-shadow), var(--popup-shadow-opacity)); } .product-popup-modal__opener { display: inline-block; } .product-popup-modal__button { font-size: 1.6rem; padding-right: 1.3rem; padding-left: 0; min-height: 4.4rem; text-underline-offset: 0.3rem; text-decoration-thickness: 0.1rem; transition: text-decoration-thickness var(--duration-short) ease; } .product-popup-modal__button:hover { text-decoration-thickness: 0.2rem; } .product-popup-modal__content-info { padding-right: 4.4rem; } .product-popup-modal__content-info > * { height: auto; margin: 0 auto; max-width: 100%; width: 100%; } .product-popup-modal__toggle { background-color: rgb(var(--color-background)); border: 0.1rem solid rgba(var(--color-foreground), 0.1); border-radius: 50%; color: rgba(var(--color-foreground), 0.55); display: flex; align-items: center; justify-content: center; cursor: pointer; position: sticky; padding: 1.2rem; z-index: 2; top: 1.5rem; width: 4rem; margin: 0 0 0 auto; } .product__media-list .media > * { overflow: hidden; } .thumbnail-list { flex-wrap: wrap; grid-gap: 1rem; } .slider--mobile.thumbnail-list:after { content: none; } .thumbnail { position: absolute; top: 0; left: 0; display: block; height: 100%; width: 100%; padding: 0; color: rgb(var(--color-base-text)); cursor: pointer; background-color: transparent; } .thumbnail:hover { opacity: 0.7; } .thumbnail.global-media-settings img { border-radius: 0; } .thumbnail[aria-current] { box-shadow: 0 0 0 0.1rem rgb(var(--color-foreground)); border-color: rgb(var(--color-foreground)); } .image-magnify-full-size { cursor: zoom-out; z-index: 1; margin: 0; border-radius: calc(var(--media-radius) - var(--media-border-width)); } .product__modal-opener > .loading-overlay__spinner { top: 50%; left: 50%; transform: translate(-50%, -50%); position: absolute; display: flex; align-items: center; height: 48px; width: 48px; } .product__modal-opener .path { stroke: rgb(var(--color-base-accent-1)); opacity: 0.75; } @media (hover: hover) { .product__media-zoom-hover, .product__media-icon--hover { display: none; } } .js .product__media { overflow: hidden !important; } .thumbnail[aria-current]:focus-visible { box-shadow: 0 0 0 0.3rem rgb(var(--color-background)), 0 0 0.5rem rgba(var(--color-foreground), 0.5); } .thumbnail[aria-current]:focus, .thumbnail.focused, .thumbnail[aria-current]:focus, .thumbnail.focused { outline: 0; box-shadow: 0 0 0 0.3rem rgb(var(--color-background)), 0 0 0.5rem rgba(var(--color-foreground), 0.5); } .thumbnail[aria-current]:focus:not(:focus-visible) { outline: 0; box-shadow: 0 0 0 0.1rem rgb(var(--color-foreground)); } .thumbnail img { object-fit: cover; width: 100%; height: 100%; pointer-events: none; } .thumbnail__badge .icon { width: 1rem; height: 1rem; } .thumbnail__badge .icon-3d-model { width: 1.2rem; height: 1.2rem; } .thumbnail__badge { color: rgb(var(--color-foreground), 0.6); height: 2rem; width: 2rem; left: auto; right: calc(0.4rem + var(--media-border-width)); top: calc(0.4rem + var(--media-border-width)); } .thumbnail-list__item, thumbnail-slider { position: relative; } .thumbnail-list__item::before { content: ""; display: block; padding-bottom: 100%; } .product__view-details { display: block; text-decoration: none; } .product__view-details:hover { text-decoration: underline; text-underline-offset: 0.3rem; } .product__view-details .icon { width: 1.2rem; margin-left: 1.2rem; flex-shrink: 0; } .product__inventory { display: flex; align-items: center; gap: 0.5rem; } .product--no-media .product__inventory { justify-content: center; } .product__inventory.visibility-hidden:empty::after, .product__sku.visibility-hidden::after { content: "#"; } .icon-with-text { --icon-size: calc(var(--font-heading-scale) * 3rem); --icon-spacing: calc(var(--font-heading-scale) * 1rem); } .icon-with-text--horizontal { display: flex; justify-content: center; column-gap: 3rem; flex-direction: row; } .icon-with-text--vertical { --icon-size: calc(var(--font-heading-scale) * 2rem); } .icon-with-text .icon { fill: rgb(var(--color-foreground)); height: var(--icon-size); width: var(--icon-size); } .icon-with-text--horizontal .icon, .icon-with-text--horizontal img { margin-bottom: var(--icon-spacing); } .icon-with-text--vertical .icon { min-height: var(--icon-size); min-width: var(--icon-size); margin-right: var(--icon-spacing); } .icon-with-text img { height: var(--icon-size); width: var(--icon-size); object-fit: contain; } .icon-with-text--vertical img { margin-right: var(--icon-spacing); } .icon-with-text--horizontal .h4 { padding-top: calc(var(--icon-size) + var(--icon-spacing)); text-align: center; } .icon-with-text--horizontal svg + .h4, .icon-with-text--horizontal img + .h4, .icon-with-text--horizontal.icon-with-text--text-only .h4 { padding-top: 0; } .icon-with-text__item { display: flex; align-items: center; } .icon-with-text--horizontal .icon-with-text__item { flex-direction: column; width: 33%; } .icon-with-text--vertical .icon-with-text__item { margin-bottom: var(--icon-size); } .product-media-container { --aspect-ratio: var(--preview-ratio); --ratio-percent: calc(1 / var(--aspect-ratio) * 100%); position: relative; width: 100%; max-width: calc(100% - calc(var(--media-border-width) * 2)); } .product-media-container.constrain-height { --viewport-offset: 400px; --constrained-min-height: 300px; --constrained-height: max( var(--constrained-min-height), calc(100vh - var(--viewport-offset)) ); margin-right: auto; margin-left: auto; } .product-media-container.constrain-height.media-fit-contain { --contained-width: calc(var(--constrained-height) * var(--aspect-ratio)); width: min(var(--contained-width), 100%); } .product-media-container .media { padding-top: var(--ratio-percent); } .product-media-container.constrain-height .media { padding-top: min(var(--constrained-height), var(--ratio-percent)); } .recipient-form { --recipient-checkbox-margin-top: 0.64rem; display: block; position: relative; max-width: 44rem; margin-bottom: 2.5rem; } .recipient-form-field-label { margin: 0.6rem 0; } .recipient-form-field-label--space-between { display: flex; justify-content: space-between; } .recipient-checkbox { flex-grow: 1; font-size: 1.6rem; display: flex; word-break: break-word; align-items: flex-start; max-width: inherit; position: relative; } .recipient-form > input[type="checkbox"] { position: absolute; width: 1.6rem; height: 1.6rem; margin: var(--recipient-checkbox-margin-top) 0; top: 0; left: 0; z-index: -1; appearance: none; -webkit-appearance: none; } .recipient-fields__field { margin: 0 0 2rem; } .recipient-fields .field__label { white-space: nowrap; text-overflow: ellipsis; max-width: calc(100% - 3.5rem); overflow: hidden; } .recipient-checkbox > svg { margin-top: var(--recipient-checkbox-margin-top); margin-right: 1.2rem; flex-shrink: 0; } .recipient-form .icon-checkmark { visibility: hidden; position: absolute; left: 0.28rem; z-index: 5; top: 0.4rem; } .recipient-form > input[type="checkbox"]:checked + label .icon-checkmark { visibility: visible; } .recipient-fields hr { margin: 1.6rem auto; } .recipient-form > input[type="checkbox"]:checked ~ .recipient-fields { display: block; animation: animateMenuOpen var(--duration-default) ease; } .js .recipient-email-label.required, .no-js .recipient-email-label.optional, .recipient-form ul a { display: inline; } .recipient-form ul { line-height: calc(1 + 0.6 / var(--font-body-scale)); padding-left: 4.4rem; text-align: left; } .recipient-form .error-message::first-letter { text-transform: capitalize; } .product__info-wrapper { padding-left: 0; padding-bottom: 0; } .product-form__input { flex: 0 0 100%; padding: 0; margin: 0 0 1.2rem; max-width: 37rem; min-width: fit-content; border: none; } .product-form__input input[type="radio"]:disabled + label { border-color: rgba(var(--color-foreground), 0.1); color: rgba(var(--color-foreground), 0.4); text-decoration: line-through; } .product__media-icon, .thumbnail__badge { background-color: rgb(var(--color-background)); border-radius: 50%; border: 0.1rem solid rgba(var(--color-foreground), 0.1); color: rgb(var(--color-foreground)); display: flex; align-items: center; justify-content: center; height: 3rem; width: 3rem; position: absolute; left: calc(0.4rem + var(--media-border-width)); top: calc(0.4rem + var(--media-border-width)); z-index: 1; transition: color var(--duration-short) ease, opacity var(--duration-short) ease; } .product__media-item { margin: auto; } .product__media-toggle::after { content: ""; cursor: pointer; display: block; margin: 0; padding: 0; position: absolute; top: 0; left: 0; z-index: 2; height: 100%; width: 100%; } .product__media-toggle:focus-visible:after { box-shadow: 0 0 0 0.3rem rgb(var(--color-background)), 0 0 0.5rem rgba(var(--color-foreground), 0.5); border-radius: var(--media-radius) - var(--media-border-width); } .product__media-toggle:focus-visible:after { border-radius: var(--media-radius); } .product-popup-modal__button { font-size: 1.6rem; padding-right: 1.3rem; padding-left: 0; height: 4.4rem; text-underline-offset: 0.3rem; text-decoration-thickness: 0.1rem; transition: text-decoration-thickness var(--duration-short) ease; } .thumbnail img { pointer-events: none; } .thumbnail--narrow img { height: 100%; width: auto; max-width: 100%; } .thumbnail--wide img { height: auto; width: 100%; } .slider-mobile-gutter { width: 100%; position: relative; display: block; } .slider-mobile-gutter .slider--mobile { position: relative; flex-wrap: inherit; overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth; -webkit-overflow-scrolling: touch; margin-bottom: 0; } .thumbnail-slider { width: calc(100% / 5); } main-slider .button-icon { top: 50%; width: 50px !important; height: 50px !important; transform: translateY(-50%); display: block; } .main-button--prev { left: 0; } slider-component .mobile-button { background: rgba(0, 0, 0, 0.3); max-height: 100%; height: unset; width: 5vw; position: relative; } slider-component .mobile-button > .icon { height: 15px; fill: var(--btn-color); } .mobile-slider .thumbnail-list { margin: auto 10px; } .slider-button[disabled] .icon { fill: rgba(var(--color-foreground), 0.3); } @media only screen and (min-width: 750px) { .slider-mobile-gutter .slider-buttons { display: none !important; } .slider-mobile-gutter .grid__item { width: 100%; } } @media only screen and (max-width: 749px) { .slider-mobile-gutter { width: 80%; margin: auto !important; } .product__media-item:not(:first-child) { margin: 1rem !important; } .slider.slider--mobile { margin-bottom: 0 !important; } .slider-buttons.no-js-hidden.quick-add-hidden { display: flex !important; height: 50px; width: 100% !important; } } main-slider .main-button--prev > .icon, .mobile-button.slider-button--prev .icon, main-slider .main-button--next > .icon, .mobile-button.slider-button--next .icon{ rotate: 90deg; scale: 3; } .main-button--next { right: 0; } .slider-mobile-gutter .button-icon { background: rgba(0, 0, 0, 0.3); position: absolute !important; width: 100%; height: 5%; z-index: 1 !important; } .slider-mobile-gutter .button-icon:not([disabled]):hover { background: #000; } .slider-button[disabled] { background: rgba(255, 255, 255, 0.5); } .button-icon .icon { fill: var(--btn-color); height: 15px !important; display: flex; margin: auto; } main-slider .main-button--prev:not([disabled]):hover > .icon, .mobile-button.slider-button--prev:not([disabled]):hover .icon, main-slider .main-button--next:not([disabled]):hover > .icon, .mobile-button.slider-button--next:not([disabled]):hover .icon, thumbnail-slider .slider-button--prev:not([disabled]):hover .icon, thumbnail-slider .slider-button--next:not([disabled]):hover .icon { scale: 3.1; } .thumbnail-button.slider-button--prev > .icon, .thumbnail-button.slider-button--next > .icon{ rotate: -180deg; scale: 3; } .thumbnail-button.slider-button--prev, .thumbnail-button.slider-button--next { width: 100%; height: 30px; border: 1px solid; } button.slider-button.thumbnail-button.slider-button--prev { width: 100%; height: 30px; border: 1px solid; } .thumbnail-list.slider.slider--tablet-up { overflow-y: auto !important; scroll-snap-type: y mandatory !important; scroll-behavior: smooth; scroll-padding-left: 1rem; width: 100%; } .thumbnail-slider .slider-button--next { bottom: 0; } .product__media-list .product__media-icon { display: none !important; } .thumbnail-slider { max-width: 7vw; max-height: 38vw; min-width: 75px; min-height: 415px; width: 150px; height: 580px; } @supports (-webkit-touch-callout: none) { .main-button--prev, .main-button--next, [mobile-slider], .slider-buttons, thumbnail-slider { display: none !important; } .slider.slider--mobile { overflow-x: scroll !important; } .product__media-item { width: 400px !important; } } /* Additional code */ @media screen and (min-width: 750px) { slider-component.slider-mobile-gutter { display: none; } main-slider.slider-mobile-gutter { display: flex; } } @media screen and (max-width: 749px) { main-slider.slider-mobile-gutter { display: none; } slider-component.slider-mobile-gutter { display: block; gap: 1rem; } } media-gallery.product__column-sticky { display: flex; } main-slider.slider-mobile-gutter.more--media { width: 80%; } main-slider.slider-mobile-gutter { height: 100%; align-items: center; justify-content: space-between; } thumbnail-slider.thumbnail-slider { width: 20%; } ul.product__media-list.contains-media, thumbnail-slider.thumbnail-slider.slider-mobile-gutter .thumbnail-list__item.slider__slide, thumbnail-slider .thumbnail-list.list-unstyled.slider { width: 100%; } thumbnail-slider.thumbnail-slider .thumbnail-list.slider--tablet-up { scroll-padding-top: 0.5rem; } .is-active { display: block !important; } |
4. Next, we have to add our own Javascript code. Open the global.js under the Assets folder and paste the code at the very bottom of the file.
class MainSlider extends SliderComponent { constructor() { super(); this.mediaGallery = document.querySelector('media-gallery'); this.thumbnailSlider = document.querySelector('thumbnail-slider'); this.zoomItems = this.querySelectorAll('modal-opener'); this.zoomItems.forEach(item => this.zoom(item)); this.current = 0; } zoom(item) { const mediaSmall = window.matchMedia('( min-width: 481px )'); item.style.overflow = 'hidden'; const zoomImg = item.querySelector('.product__media');; if (mediaSmall.matches) { item.addEventListener("mouseout", function() { zoomImg.style.transform = 'scale(1)'; }); item.addEventListener("mouseover", function() { zoomImg.style.transform = 'scale(1.8)'; }) item.addEventListener("mousemove", function(e) { const itemWidth = zoomImg.getBoundingClientRect().width; const itemLeft = zoomImg.getBoundingClientRect().left; const itemHt = zoomImg.getBoundingClientRect().height; const itemTop = zoomImg.getBoundingClientRect().top + window.scrollY; const translateX = Math.round((e.pageX - itemLeft) / itemWidth * 100); const translateY = Math.round((e.pageY - itemTop) / itemHt * 100); zoomImg.style.transformOrigin = `${translateX}% ${translateY}%`; }); } } onButtonClick(event) { event.preventDefault(); if(event.currentTarget.name === 'next' ) { if(this.current < this.sliderItems.length - 1) { this.current = this.current + 1; } else { this.current = 0; } } else { if(this.current <= 0) { this.current = this.sliderItems.length - 1 } else { this.current = this.current - 1; } } this.sliderItems.forEach(item => item.classList.remove('is-active')); this.sliderItems[this.current].classList.add('is-active'); const mediaId = this.sliderItems[this.current].dataset.mediaId; if (!this.thumbnailSlider) return; const activeThumbnail = this.thumbnailSlider.querySelector(`[data-target="${ mediaId }"]`); this.slideScrollPosition = Math.floor(this.thumbnailSlider.sliderItems[0].clientWidth * this.current); this.thumbnailSlider.slider.scrollTo({top: this.slideScrollPosition}); this.mediaGallery.setActiveThumbnail(activeThumbnail); } } customElements.define('main-slider', MainSlider); class ThumbnailSlider extends SliderComponent { constructor() { super(); } initPages() { this.sliderItemsToShow = Array.from(this.sliderItems).filter(element => element.clientWidth > 0); if (this.sliderItemsToShow.length < 2) return; this.sliderItemOffset = this.sliderItemsToShow[1].offsetTop - this.sliderItemsToShow[0].offsetTop; this.slidesPerPage = Math.floor((this.slider.clientWidth - this.sliderItemsToShow[0].offsetTop) / this.sliderItemOffset); this.totalPages = this.sliderItemsToShow.length - this.slidesPerPage + 1; this.update(); } update() { if (!this.slider || !this.nextButton) return; const previousPage = this.currentPage; this.currentPage = Math.round(this.slider.scrollTop/ this.sliderItemOffset) + 1; if (this.currentPageElement && this.pageTotalElement) { this.currentPageElement.textContent = this.currentPage; this.pageTotalElement.textContent = this.totalPages; } if (this.currentPage != previousPage) { this.dispatchEvent(new CustomEvent('slideChanged', { detail: { currentPage: this.currentPage, currentElement: this.sliderItemsToShow[this.currentPage - 1] }})); } if (this.enableSliderLooping) return; if (this.isSlideVisible(this.sliderItemsToShow[0]) && this.slider.scrollTop === 0) { this.prevButton.setAttribute('disabled', 'disabled'); } else { this.prevButton.removeAttribute('disabled'); } if (this.isSlideVisible(this.sliderItemsToShow[this.sliderItemsToShow.length - 1])) { this.nextButton.setAttribute('disabled', 'disabled'); } else { this.nextButton.removeAttribute('disabled'); } } isSlideVisible(element, offset = 0) { const lastVisibleSlide = this.slider.clientHeight + this.slider.scrollTop - offset; return (element.offsetTop + element.clientHeight) <= lastVisibleSlide && element.offsetTop >= this.slider.scrollTop; } onButtonClick(event) { event.preventDefault(); const step = event.currentTarget.dataset.step || 1; this.slideScrollPosition = event.currentTarget.name === 'next' ? this.slider.scrollTop + (step * this.sliderItemOffset) : this.slider.scrollTop - (step * this.sliderItemOffset); this.slider.scrollTo({ top: this.slideScrollPosition }); } } customElements.define('thumbnail-slider', ThumbnailSlider); |
Conclusion: By following our guide, you'll add a touch of sophistication and functionality to your Shopify store, making your product pages more interactive and engaging for your customers. If you have any questions or need further assistance, feel free to Shopify's Chat with us or visit our Contact page. Let's transform your product display into an immersive shopping experience!
That's it. I hope it didn't make you sweat. (",)
10 comentários
@Max Be aware that with the new version of Dawn, a thumbnail slider is already available, that is the reason I only created a vertical slider
Hi there!
Is it possible to also have a horizontal slider unter the picture?
Because vertical doesn’t look well for my page.
Kind regards
Max
Hi, why vertical-media-gallery.js is not included/referenced in main-product.liquid? also on iOS devices, after implementing the code, I was not able to swipe up and down on product pages. Dawn version 4.0.0
Can you tell me how can we make them Fade effect on slides?
Please make sure you are copying the code. The javascript is responsible for buttons to work. If this doesn’t work then you are missing that code or might have an error.