initial commit
This commit is contained in:
@@ -0,0 +1,332 @@
|
||||
{% 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
|
||||
- limit: {Number} (optional) When passed, limits the number of media items to render
|
||||
|
||||
Usage:
|
||||
{% render 'product-media-gallery' %}
|
||||
{% endcomment %}
|
||||
|
||||
{%- liquid
|
||||
if section.settings.hide_variants and variant_images.size == product.media.size
|
||||
assign single_media_visible = true
|
||||
endif
|
||||
|
||||
if limit == 1
|
||||
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
|
||||
-%}
|
||||
|
||||
<media-gallery
|
||||
id="MediaGallery-{{ section.id }}"
|
||||
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 }}"
|
||||
>
|
||||
<div id="GalleryStatus-{{ section.id }}" class="visually-hidden" role="status"></div>
|
||||
<slider-component id="GalleryViewer-{{ section.id }}" class="slider-mobile-gutter">
|
||||
<a class="skip-to-content-link button visually-hidden quick-add-hidden" href="#ProductInfo-{{ section.id }}">
|
||||
{{ 'accessibility.skip_to_product_info' | t }}
|
||||
</a>
|
||||
<ul
|
||||
id="Slider-Gallery-{{ section.id }}"
|
||||
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 }}"
|
||||
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 settings.animations_reveal_on_scroll %} scroll-trigger animate--fade-in{% 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 -%}
|
||||
{% if media_position >= limit
|
||||
or media_position >= 1
|
||||
and section.settings.hide_variants
|
||||
and variant_images contains media.src
|
||||
%}
|
||||
{% continue %}
|
||||
{% endif %}
|
||||
|
||||
{%- unless media.id == product.selected_or_first_available_variant.featured_media.id -%}
|
||||
<li
|
||||
id="Slide-{{ section.id }}-{{ media.id }}"
|
||||
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 == nil and forloop.index == 1 %} is-active{% endif %}{% if media.media_type != 'image' %} product__media-item--full{% endif %}{% if settings.animations_reveal_on_scroll %} scroll-trigger animate--fade-in{% 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>
|
||||
<div class="slider-buttons 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 }}"
|
||||
>
|
||||
<span class="svg-wrapper">
|
||||
{{- 'icon-caret.svg' | inline_asset_content -}}
|
||||
</span>
|
||||
</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 }}"
|
||||
>
|
||||
<span class="svg-wrapper">
|
||||
{{- 'icon-caret.svg' | inline_asset_content -}}
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
</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
|
||||
>
|
||||
<span class="svg-wrapper">
|
||||
{{- 'icon-3d-model.svg' | inline_asset_content -}}
|
||||
</span>
|
||||
{{ 'products.product.xr_button' | t }}
|
||||
</button>
|
||||
{%- endif -%}
|
||||
{%- liquid
|
||||
assign is_not_limited_to_single_item = false
|
||||
if limit == null or limit > 1
|
||||
assign is_not_limited_to_single_item = true
|
||||
endif
|
||||
-%}
|
||||
{%- if is_not_limited_to_single_item
|
||||
and media_count > 1
|
||||
and section.settings.gallery_layout contains 'thumbnail'
|
||||
or section.settings.mobile_thumbnails == 'show'
|
||||
-%}
|
||||
<slider-component
|
||||
id="GalleryThumbnails-{{ section.id }}"
|
||||
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 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"
|
||||
>
|
||||
<span class="svg-wrapper">
|
||||
{{- 'icon-caret.svg' | inline_asset_content -}}
|
||||
</span>
|
||||
</button>
|
||||
<ul
|
||||
id="Slider-Thumbnails-{{ section.id }}"
|
||||
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"
|
||||
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
|
||||
{%- 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 }}"
|
||||
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 }}"
|
||||
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">
|
||||
<span class="svg-wrapper">
|
||||
{{- 'icon-3d-model.svg' | inline_asset_content -}}
|
||||
</span>
|
||||
</span>
|
||||
{%- elsif media.media_type == 'video' or media.media_type == 'external_video' -%}
|
||||
<span class="thumbnail__badge" aria-hidden="true">
|
||||
<span class="svg-wrapper">
|
||||
{{- 'icon-play.svg' | inline_asset_content -}}
|
||||
</span>
|
||||
</span>
|
||||
{%- endif -%}
|
||||
{%- capture thumbnail_id -%}
|
||||
Thumbnail-{{ section.id }}-{{ forloop.index }}
|
||||
{%- 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 }}"
|
||||
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 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"
|
||||
>
|
||||
<span class="svg-wrapper">
|
||||
{{- 'icon-caret.svg' | inline_asset_content -}}
|
||||
</span>
|
||||
</button>
|
||||
</slider-component>
|
||||
{%- endif -%}
|
||||
</media-gallery>
|
||||
Reference in New Issue
Block a user