Compatibility: Dawn version 13, 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 is a Vertical Product Image Slider for Shopify Dawn Theme with Zoom in Hover?
A vertical slider on a product page displays additional product images or related products in a vertical scrolling or sliding format. This allows you to showcase different angles, details, or complementary items without cluttering the main product image area.
Why Use a Vertical Product Image Slider for Shopify Dawn Theme with Zoom in Hover?
- Enhanced Product Presentation: Showcase multiple product images (different angles, close-ups, lifestyle shots) without overwhelming the main product image area.
- Improved User Experience: Provides a more engaging and interactive way for customers to explore product details.
- Increased Upselling/Cross-selling Opportunities: Highlight related products or complementary items to encourage additional purchases.
- Space Optimization: Maximize the use of space on the product page, especially beneficial for mobile devices.
- Modern Look and Feel: Adds a touch of modern design to your product pages.
Additional Considerations:
Beyond the basic implementation, these additional considerations will help you create a more polished and effective vertical slider:
- Image Optimization: Optimize all images used in the slider for web performance. Large, unoptimized images can significantly slow down page load times.
- Number of Slides: Carefully consider the number of slides to include. Too many slides can make the slider feel overwhelming, while too few might not be enough to showcase the product or related items effectively.
- Navigation Controls: Provide clear and intuitive navigation controls (arrows or dots) so users can easily browse through the slides. Consider making these controls responsive and easy to use on mobile devices.
- Auto-Play and Pause: If you use auto-play, include a pause button so users can stop the rotation if they want to examine a particular slide more closely.
- Looping: Decide whether you want the slider to loop continuously or stop at the last slide. Looping is often preferred for a seamless user experience.
- Transition Effects: Choose smooth and subtle transition effects. Avoid anything too jarring or distracting.
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.
[]
Steps on how to add Vertical Product Image Slider for Shopify Dawn Theme with Zoom in Hover
Step #1. Open your code editor
From you Admin page, go to Online store, then Themes. Choose the theme you want to edit, then click the three dots, then Edit code.
Step #2. Find the product-media-gallery.liquid
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 small-hide"
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 small-hide"
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>
{%- 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 -%}
</main-slider>
{%- 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 product.media.size <= 5 %}
style="display: none"
{% 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 product.media.size <= 5 %}
style="display: none"
{% 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>
|
Step #3. Add a CSS file for 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;
padding: 1px;
}
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;
}
@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-gallery.product__column-sticky {
display: flex;
gap: 25px;
}
main-slider.slider-mobile-gutter.more--media {
width: 100%;
}
main-slider.slider-mobile-gutter {
height: 100%;
align-items: center;
justify-content: space-between;
}
thumbnail-slider.thumbnail-slider {
width: 100px;
display: flex;
flex-direction: column;
height: var(--slider-height);
}
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;
}
media-gallery thumbnail-slider > .thumbnail-list {
display: flex;
flex-direction: column;
}
.product__media-wrapper .slider-mobile-gutter .slider-button {
display: unset;
}
@media screen and (max-width: 950px) {
thumbnail-slider.thumbnail-slider {
width: 50px;
}
}
@media screen and (min-width: 750px) {
slider-component.slider-mobile-gutter {
display: none;
}
main-slider.slider-mobile-gutter {
display: flex;
}
.grid__item.product__media-wrapper {
padding-right: 50px;
}
}
@media screen and (max-width: 749px) {
slider-component.slider-mobile-gutter {
display: block;
gap: 1rem;
}
.product__media-item {
display: none;
}
}
|
Step #4. Add 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; this.buttons = this.querySelectorAll('button'); this.buttons.forEach(button => button.addEventListener('click', this.onButtonClick.bind(this))) } 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) { console.log('clicked', event.currentTarget.name) 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.clientHeight > 0); if (this.sliderItemsToShow.length < 2) return; this.sliderItemOffset = this.sliderItemsToShow[1].offsetTop - this.sliderItemsToShow[0].offsetTop; this.slidesPerPage = Math.floor((this.slider.clientHeight - 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'); } const heightValue = this.sliderItems[0].clientHeight * 5 + 90 + 'px'; this.style.setProperty('--slider-height', heightValue) } 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); |
Step #5. Open the main-product.liquid
Under the Section folder. At the very buttom, look for the last square bracket. Above it, place the code below. See image for placement
| ,{ "type": "select", "id": "slider_direction", "options": [ { "value": "right", "label": "Right" }, { "value": "left", "label": "Left" } ], "default": "right", "label": "Slider direction" } |
Placement:

Step #6. Still at the main-product.liquid
Scroll all the way up and find the code {% style %}. Under it, place the code below. Make sure to save.
| media-gallery { flex-direction: {{ section.settings.slider_direction }}; } |
Placement:

Step #3. Save the changes
Once you've added the code, save your changes to the theme code by clicking the SAVE button on the right hand upper corner.
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 comments
@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.
I am not able to zoom in, also i am not able to scroll to the left or right on the thumbnails
Hi,
I added the version for 2.5.
@chad. Please post the question to the corresponding page. Thank you
I see selecting a variant swatch changes to the assigned image. Likewise does changing image select the photo’s associated variant so that variant selection+its thumbnail are always in sync?
How to make a horizontal slider with thumbnails at the bottom in 2.5? Thank you
Could you tell me how to install HORIZONTAL slider in the 2.5?