Files
Broadcast/sections/product.liquid

2602 lines
90 KiB
Plaintext
Raw Permalink Normal View History

2025-11-11 08:30:57 +00:00
<!-- /sections/product.liquid -->
{%- liquid
assign current_variant = product.selected_or_first_available_variant
assign enable_video_looping = section.settings.enable_video_looping
assign image_size = section.settings.image_size
assign image_layout = section.settings.image_layout
assign mobile_image_style = section.settings.mobile_image_style
assign featured_media = current_variant.featured_media | default: product.featured_media
assign featured_media_aspect_ratio = featured_media.aspect_ratio | default: 1
assign is_title_linked = true
if template.name == 'product'
assign is_title_linked = false
endif
assign show_thumbnails = false
assign enable_thumbs = false
assign enable_thumbs_mobile = false
if image_layout == 'thumbnails' or image_layout == 'thumbnails-left'
assign enable_thumbs = true
assign show_thumbnails = true
endif
if mobile_image_style == 'thumbs'
assign show_thumbnails = true
assign enable_thumbs_mobile = true
endif
assign modifier = image_layout | default: 'thumbnails'
assign product_wrapper_modifier = 'product__wrapper--' | append: modifier
assign show_buy_buttons = false
assign buy_buttons = section.blocks | where: 'type', 'buttons'
if buy_buttons.size > 0
assign show_buy_buttons = true
endif
assign image_width = 770
if image_size == 'small'
assign product_wrapper_modifier = product_wrapper_modifier | append: ' product__wrapper--small'
assign image_width = 525
endif
if image_size == 'stretch'
assign product_wrapper_modifier = product_wrapper_modifier | append: ' product__wrapper--stretch'
assign image_width = 970
endif
assign product_form_id = 'ProductForm--' | append: section.id | append: '-' | append: product.id
assign show_cart_bar = false
assign unique = section.id
assign sibling_color = product.metafields.theme.sibling_color.value | default: product.metafields.theme.sibling_colour.value | default: product.metafields.theme.siblings_color.value | default: product.metafields.theme.siblings_colour.value | default: product.metafields.theme.siblings_colors.value | default: product.metafields.theme.siblings_colours.value
if section.settings.show_cart_bar
assign show_cart_bar = true
endif
capture product_images_classlist
echo 'product__images'
if enable_thumbs
echo ' product__images--thumbs'
else
echo ' product__images--no-thumbs'
endif
if enable_thumbs_mobile
echo ' product__images--mobile-thumbs'
else
echo ' product__images--mobile-slider'
endif
endcapture
assign preorder = false
if product.metafields.theme.preorder.type == 'boolean' and product.metafields.theme.preorder.value == true
assign preorder = true
endif
assign sold_out = false
unless product.available
assign sold_out = true
endunless
assign product_tags = product.tags | join: ','
if product_tags contains '_preorder'
assign preorder = true
endif
assign product_price = product.metafields.app--168074346497.min_auto_discounted_price.value | default: product.price
assign product_compare_at_price = product.compare_at_price
assign product_compare_at_price_max = product.compare_at_price_max
if product.metafields.app--168074346497.discount_percentage.value > 0.01
assign deducted_percentage = 1.0 | minus: product.metafields.app--168074346497.discount_percentage.value
assign product_price = product.price | divided_by: 100.0 | times: deducted_percentage | times: 100.0 | ceil
assign product_compare_at_price = product.price
assign product_compare_at_price_max = product.price_max
if product.compare_at_price > product_compare_at_price
assign product_compare_at_price = product.compare_at_price
endif
if product.compare_at_price_max > product_compare_at_price_max
assign product_compare_at_price_max = product.compare_at_price_max
endif
endif
assign on_sale = false
if product_compare_at_price > product_price
assign on_sale = true
endif
assign badge = ''
if badge == '' and product_tags contains '_badge_'
assign badge = product_tags | split: '_badge_'
assign badge = badge[1] | split: ',' | first | replace: '_', ' '
endif
-%}
{%- style -%}
{%- if show_cart_bar -%}
:root { --cart-bar-height: 80px; }
{%- endif -%}
#Product--{{ section.id }} {
--PT: {{ section.settings.padding_top }}px;
--PB: {{ section.settings.padding_bottom }}px;
--swatch-size: var(--swatch-size-product);
}
{%- endstyle -%}
<div id="Product--{{ unique }}"
class="index-product section-padding"
data-section-id="{{ unique }}"
data-section-type="product"
data-product-handle="{{ product.handle }}"
data-enable-history-state="true"
data-overlay-header
data-sticky-enabled="{{ section.settings.product_sticky_enable }}"
data-variant-image-scroll="{{ section.settings.variant_image_scroll }}"
{% if show_cart_bar %}data-cart-bar-enabled{% endif %}
>
<div class="product__wrapper {{ product_wrapper_modifier }}" data-product>
<div class="product__wrapper__inner">
<div class="product__page">
<product-images
class="{{ product_images_classlist }}"
data-active-media="{{ section.id }}-{{ featured_media.id }}"
{% if enable_thumbs %}data-fader-desktop{% endif %}
{% if enable_thumbs_mobile %}data-fader-mobile{% endif %}
>
{%- if product.media.size > 0 -%}
{%- capture product_slides_attributes -%}
class="product__slides product-single__photos"
style="--featured-media-aspect-ratio: {{ featured_media_aspect_ratio | round: 2 }};"
data-product-media-list
{%- endcapture -%}
{%- if section.settings.enable_zoom -%}
<zoom-images {{ product_slides_attributes }}>
{%- else -%}
<div {{ product_slides_attributes }}>
{%- endif -%}
{%- for media in product.media -%}
{%- render 'media', media: media, featured_media: featured_media, enable_video_looping: enable_video_looping, sectionkey: unique, image_width: image_width, cover: true -%}
{%- endfor -%}
{%- if section.settings.enable_zoom -%}
</zoom-images>
{%- else -%}
</div>
{%- endif -%}
{%- assign first_3d_model = product.media | where: "media_type", "model" | first -%}
{%- if first_3d_model -%}
<button
class="btn btn--outline btn--black btn--ar product-single__view-in-space"
data-shopify-xr
data-shopify-model3d-id="{{ first_3d_model.id }}"
data-shopify-title="{{ product.title | strip_html }}"
data-shopify-xr-hidden>
{%- render 'icon-media-model' -%}
<span class="product-single__view-in-space-text">{{ 'products.general.view_space' | t }}</span>
</button>
{%- endif -%}
{%- if show_thumbnails -%}
<product-thumbs class="product__thumbs" data-product-thumbs>
<div class="product__thumbs__holder" data-thumbs-slider>
{%- for media in product.media -%}
<div class="product__thumb{% if media == featured_media %} is-active{% endif %}" data-thumb-item>
<a
class="product__thumb__link"
href="{{ media.preview_image.src | image_url }}"
aria-current="{% if forloop.first %}true{% else %}false{% endif %}"
data-media-id="{{ section.id }}-{{ media.id }}"
data-thumb-link>
{%- liquid
render 'image' image: media.preview_image, width: 150, height: 150, sizes: '75px', widths: '75, 100, 150, 225, 300', aspect_ratio: 1
if media.media_type == 'video' or media.media_type == 'external_video'
render 'icon-media-video'
elsif media.media_type == 'model'
render 'icon-media-model'
endif
-%}
</a>
</div>
{%- endfor -%}
</div>
</product-thumbs>
{%- endif -%}
{%- comment -%} Thumbnails template for Photoswipe {%- endcomment -%}
{%- if section.settings.enable_zoom -%}
<template data-pswp-thumbs-template>
{%- assign images = product.media | where: 'media_type', 'image' -%}
{%- for image in images -%}
{%- render 'image' image: image, width: 160, height: 160, sizes: '80px', widths: '80, 120, 160', aspect_ratio: 1, modifier: 'pswp__thumb' -%}
{%- endfor -%}
</template>
{%- endif -%}
{%- else -%}
<div class="product__slides product__slides--{{ image_size }} product-single__photos">
<div class="product__photo product__photo--blank product__slide"></div>
</div>
{%- endif -%}
</product-images>
<div class="product__content">
<div class="form__wrapper{% unless show_buy_buttons %} form__wrapper--no-buttons{% endunless %}{% unless current_variant.available %} variant--soldout{% endunless %}{% if settings.form_style == 'classic' %} form__wrapper--classic{% else %} form__wrapper--modern{% endif %}{% if settings.show_newsletter %} show-product-notification{% endif %}" data-form-wrapper>
<div class="form__width">
{% comment %} The input with name="id" submits to cart {% endcomment %}
<input type="hidden" name="id" value="{{ current_variant.id }}" form="{{ product_form_id }}">
{% comment %} Add a line item property called 'Preorder' to preorder products {% endcomment %}
{%- if preorder -%}
<input type="hidden" name="properties[{{ 'products.product.sale_type' | t }}]" value="{{ 'products.product.pre_order' | t }}" form="{{ product_form_id }}" data-product-preorder>
{%- endif -%}
{%- if sibling_color != blank -%}
<input type="hidden" form="{{ product_form_id }}" name="properties[{{ 'general.siblings.label' | t }}]" value="{{ sibling_color }}">
{%- endif -%}
{%- for block in section.blocks -%}
{%- liquid
assign padding_bottom = block.settings.padding_bottom
assign bg_accent = block.settings.bg_color
assign icon_size = block.settings.icon_size
capture block_style
if padding_bottom
echo '--block-padding-bottom: ' | append: block.settings.padding_bottom | append: 'px;'
endif
if bg_accent
if block.type == 'upsell' or block.type == 'complementary-products'
unless bg_accent == 'rgba(0,0,0,0)' or bg_accent == blank
echo '--bg-accent: ' | append: bg_accent | append: ';'
endunless
endif
endif
if icon_size
echo '--icon-size:' | append: icon_size | append: 'px;'
endif
if block.type == 'countdown'
assign bg_color = block.settings.bg_color
assign text_color = block.settings.color
unless bg_color == 'rgba(0,0,0,0)' or bg_color == blank
echo '--bg: ' | append: bg_color | append: ';'
echo '--countdown-padding: ' | append: 'var(--inner);'
endunless
unless text_color == 'rgba(0,0,0,0)' or text_color == blank
echo '--text: ' | append: text_color | append: ';'
endunless
endif
endcapture
if block_style != blank
assign block_style = 'style="' | append: block_style | append: '"'
endif
-%}
{%- case block.type -%}
{%- when '@app' -%}
{%- render block -%}
{%- when 'title' -%}
{%- render 'product-title' product: product, block: block, block_style: block_style, is_title_linked: is_title_linked -%}
{%- when 'price' -%}
{%- render 'product-price' product: product, unique: unique, block: block, block_style: block_style -%}
{%- when 'variants' -%}
{%- render 'product-variant-options' product: product, unique: unique, block: block, block_style: block_style, product_form_id: product_form_id, enable_size_chart: true -%}
{%- when 'buttons' -%}
{%- render 'product-buttons' product: product, current_variant: current_variant, unique: unique, block: block, block_style: block_style, product_form_id: product_form_id, preorder: preorder -%}
{%- when 'description' -%}
{%- render 'product-description' product: product, block: block, block_style: block_style -%}
{%- when 'tab_richtext' -%}
{%- render 'product-description' product: product, block: block, block_style: block_style -%}
{%- when 'accordion' -%}
{%- render 'product-description' product: product, block: block, block_style: block_style -%}
{%- when 'inventory_countdown' -%}
{% comment %} Product inventory {% endcomment %}
{%- liquid
assign show_remaining_class = ''
assign show_notice = block.settings.show_notice
assign max_inventory = block.settings.max_inventory
assign hide_inventory_count = block.settings.hide_inventory_counter
assign current_inventory = 0
assign has_unavailable_variants = false
assign show_buy_buttons = false
assign in_stock_color = block.settings.in_stock_color
assign low_stock_color = block.settings.low_stock_color
assign out_of_stock_color = block.settings.out_of_stock_color
assign buy_buttons = section.blocks | where: 'type', 'buttons'
if buy_buttons.size > 0
assign show_buy_buttons = true
endif
comment
Set a limit of the max inventory quantity to prevent a real quantity exposure
endcomment
assign max_inventory_quantity = max_inventory | plus: 1
if current_variant.inventory_management and current_variant.inventory_policy == 'deny'
if current_variant.inventory_quantity > 0 and current_variant.inventory_quantity <= max_inventory
assign show_remaining_class = 'count-is-low'
assign current_inventory = current_variant.inventory_quantity | at_most: max_inventory_quantity
elsif current_variant.inventory_quantity > 0 and current_variant.inventory_quantity > max_inventory and show_notice == 'always'
assign show_remaining_class = 'count-is-in'
elsif current_variant.inventory_quantity < 1 and show_notice == 'always'
assign show_remaining_class = 'count-is-out'
endif
endif
assign quantity_tracking = false
assign show_inventory = false
assign has_low_inventory = false
assign has_soldout = false
assign variants_inventory = product.variants | map: 'inventory_quantity'
for inventory_quantity in variants_inventory
if inventory_quantity > 0 and inventory_quantity < max_inventory
assign has_low_inventory = true
endif
if inventory_quantity < 1
assign has_soldout = true
endif
endfor
if has_low_inventory or has_soldout and show_notice == 'always'
assign show_inventory = true
endif
assign variant_count = 1
for option in product.options_with_values
assign variant_count = variant_count | times: option.values.size
endfor
if variant_count > product.variants.size
assign has_unavailable_variants = true
endif
if show_buy_buttons == false and has_unavailable_variants
assign show_inventory = true
endif
assign inventory_management = product.variants | where: 'inventory_management', 'shopify'
if inventory_management.size > 0
assign quantity_tracking = true
endif
capture in_stock_icon_color
if in_stock_color != blank and in_stock_color != 'rgba(0,0,0,0)'
echo ' style="--icon-color: ' | append: in_stock_color | append: '"'
endif
endcapture
capture low_stock_icon_color
if low_stock_color != blank and low_stock_color != 'rgba(0,0,0,0)'
echo ' style="--icon-color: ' | append: low_stock_color | append: '"'
endif
endcapture
capture out_of_stock_icon_color
if out_of_stock_color != blank and out_of_stock_color != 'rgba(0,0,0,0)'
echo ' style="--icon-color: ' | append: out_of_stock_color | append: '"'
endif
endcapture
-%}
{%- if quantity_tracking and show_inventory or quantity_tracking and show_notice == 'always' -%}
{%- capture inventory -%}
<span data-remaining-count>{{ current_inventory | default: 0 }}</span>
{%- endcapture -%}
<div class="product__block variant__countdown {{ show_remaining_class }} block-padding"
data-remaining-max="{{ max_inventory }}"
data-remaining-show-notice="{{ show_notice }}"
data-remaining-wrapper
{{ block.shopify_attributes }}
{{ block_style }}>
<span class="variant__countdown--in"{{ in_stock_icon_color }}>
{% render 'icon-in-stock' %}
<span class="variant__countdown-text">{{ 'products.product.in_stock' | t }}</span>
</span>
{%- if hide_inventory_count -%}
<span class="variant__countdown--low"{{ low_stock_icon_color }}>
{% render 'icon-low-inventory' %}
<span class="variant__countdown-text">{{ 'products.product.remaining_no_count' | t }}</span>
</span>
{%- else -%}
<span class="variant__countdown--low"{{ low_stock_icon_color }}>
{% render 'icon-low-inventory' %}
<span class="variant__countdown-text">{{ 'products.product.remaining_html' | t: inventory: inventory }}</span>
</span>
{%- endif -%}
<span class="variant__countdown--out"{{ out_of_stock_icon_color }}>
{% render 'icon-out-of-stock' %}
<span class="variant__countdown-text">{{ 'products.product.out_of_stock' | t }}</span>
</span>
<span class="variant__countdown--unavailable"{{ out_of_stock_icon_color }}>
{% render 'icon-out-of-stock' %}
<span class="variant__countdown-text">{{ 'products.product.item_unavailable' | t }}</span>
</span>
<script data-product-remaining-json type="application/json">
{
{%- liquid
for variant in product.variants
assign variant_id = variant.id | json
if variant.inventory_management and variant.inventory_policy == 'deny'
assign quantity = variant.inventory_quantity | at_most: max_inventory_quantity
if hide_inventory_count
if quantity < 1
assign remaining_value = 'out'
elsif quantity > 0 and quantity < max_inventory
assign remaining_value = 'low'
else
assign remaining_value = 'in'
endif
else
assign remaining_value = quantity
endif
else
assign remaining_value = 'unavailable'
endif
echo '"' | append: variant_id | append: '": "' | append: remaining_value | append: '"'
unless forloop.last
echo ','
endunless
endfor
-%}
}
</script>
</div>
{%- elsif request.design_mode -%}
<div {{ block.shopify_attributes }}></div>
{%- endif -%}
{%- when 'upsell' -%}
{%- assign upsell_product = product.metafields.theme.upsell.value | default: block.settings.upsell_product -%}
{%- assign upsell_product_list = product.metafields.theme.upsell_list.value | default: block.settings.upsell_product_list -%}
{%- if upsell_product != blank or upsell_product_list != blank or request.design_mode -%}
<div class="product__block product__upsell block-padding" {{ block.shopify_attributes }} {{ block_style }}>
{%- assign upsell_title = 'products.general.upsell_title' | t -%}
{%- capture upsell_products -%}
{%- if upsell_product == blank and upsell_product_list == blank -%}
{%- render 'upsell-product' -%}
{%- else -%}
{%- if upsell_product != blank -%}
{%- render 'upsell-product', upsell_product: upsell_product, show_avaialable_upsell_only: block.settings.show_avaialable_upsell_only -%}
{%- endif -%}
{%- if upsell_product_list != blank -%}
{%- for upsell_product in upsell_product_list -%}
{%- render 'upsell-product', upsell_product: upsell_product, show_avaialable_upsell_only: block.settings.show_avaialable_upsell_only -%}
{%- endfor -%}
{%- endif -%}
{%- endif -%}
{%- endcapture -%}
{%- if upsell_products != blank -%}
<p class="product-upsell__holder__title">{{ upsell_title }}</p>
{{ upsell_products }}
{%- endif -%}
</div>
{%- endif -%}
{%- when 'pickup' -%}
<pickup-availability class="product__block product__pickup block-padding" data-store-availability-container="{{ current_variant.id }}" {{ block.shopify_attributes }} {{ block_style }}></pickup-availability>
{%- when 'code' -%}
<div class="product__block product__custom-code block-padding" {{ block_style }} {{ block.shopify_attributes }}>
{{ block.settings.code }}
</div>
{%- when 'siblings' -%}
{%- render 'product-siblings' product: product, product_form_id: product_form_id, block: block, block_style: block_style, quick_add_product: false -%}
{%- when 'text' -%}
{% comment %} Text block for product {% endcomment %}
{%- if block.settings.title != blank or block.settings.text != blank -%}
<div class="product__block product__text{% if block.settings.layout == "inline" %} product__text--inline{% endif %} block-padding" {{ block.shopify_attributes }} {{ block_style }}>
{%- if block.settings.title != blank -%}
<p class="product__heading strong">
{{- block.settings.title -}}
</p>
{%- endif -%}
{%- if block.settings.text != blank -%}
<div class="product__subheading">
{{- block.settings.text -}}
</div>
{%- endif -%}
</div>
{%- endif -%}
{%- when 'icon' -%}
{%- render 'icon' block: block, index: forloop.index0, is_product: true -%}
{%- when 'sharing' -%}
<div class="product__block block-padding" {{ block.shopify_attributes }} {{ block_style }}>
{%- assign share_url = current_variant.url | prepend: request.origin -%}
{%- render 'share-button' share_url: share_url -%}
</div>
{%- when 'divider' -%}
{%- render 'divider' block: block, modifier: 'product__block product__block--divider' -%}
{%- when 'line-item' -%}
<div class="product__block{% if settings.show_lines %} product__block--lines{% endif %} select__fieldset block-padding" {{ block.shopify_attributes }} {{ block_style }}>
{%- if block.settings.label != blank -%}
{%- assign input_id = unique | append: '-' | append: block.id | append: '-' | append: forloop.index -%}
{%- assign required = block.settings.required -%}
{%- case block.settings.type -%}
{%- when 'text' -%}
<label for="{{ input_id }}" class="select__label">{{ block.settings.label | escape_once }}</label>
<input
type="text" class="properties__input"
id="{{ input_id }}"
form="{{ product_form_id }}"
{% if required %} required {% endif %}
name="properties[{{ block.settings.label | escape_once }}]">
{%- when 'checkbox' -%}
{%- if block.settings.unchecked_value != blank and block.settings.checked_value != blank -%}
<div class="properties__checkbox checkbox">
<input
type="hidden"
name="properties[{{ block.settings.label | escape_once }}]"
form="{{ product_form_id }}"
value="{{ block.settings.unchecked_value }}">
<input
type="checkbox"
name="properties[{{ block.settings.label | escape_once }}]"
id="{{ input_id }}"
form="{{ product_form_id }}"
value="{{ block.settings.checked_value }}">
<label
class="radio__fieldset__label"
for="{{ input_id }}">{{ block.settings.label | escape_once }}</label>
</div>
{%- endif -%}
{%- when 'dropdown' -%}
{%- capture line_item_options -%}
<ul id="{{ unique }}-select-{{ option.name | handle }}" class="select-popout__list" data-popout-list data-scroll-lock-scrollable>
{%- assign has_selected = false -%}
{%- assign selected_value = '' -%}
{%- for i in (1..3) -%}
{%- assign value = 'option_' | append: forloop.index -%}
{%- assign value = block.settings[value] -%}
{%- if value != blank -%}
<li class="select-popout__item{% unless has_selected %} is-active{% endunless %}">
<a class="select-popout__option"
href="#"
{% unless has_selected %}aria-current="true"{% endunless %}
data-value="{{ value | escape_once }}"
data-popout-option>
<span>
{{ value | escape_once }}
</span>
</a>
</li>
{%- unless has_selected -%}
{%- assign selected_value = value -%}
{%- endunless -%}
{%- assign has_selected = true -%}
{%- endif -%}
{%- endfor -%}
</ul>
{%- endcapture -%}
{%- if has_selected -%}
<span class="radio__legend">
<span class="radio__legend__label">{{ block.settings.label | escape_once }}</span>
</span>
<popout-select class="select-popout">
<button type="button"
class="select-popout__toggle"
aria-expanded="false"
aria-controls="{{ unique }}-select-{{ option.name | handle }}"
aria-labelledby="{{ unique }}-select-{{ option.name | handle }}-label"
data-popout-toggle>
<span data-popout-toggle-text>{{ selected_value }}</span>
{%- render 'icon-nav-arrow-down' -%}
</button>
{{ line_item_options }}
<input
type="hidden"
name="properties[{{ block.settings.label | escape_once }}]"
id="{{ input_id }}"
value="{{ selected_value | escape_once }}"
form="{{ product_form_id }}"
data-popout-input
data-single-option-selector>
</popout-select>
{%- endif -%}
{%- endcase -%}
{%- endif -%}
</div>
{%- when 'features' -%}
{% comment %} Features block for Product {% endcomment %}
{%- liquid
assign block_id = block.id
assign text = block.settings.text
assign title = block.settings.title
assign prev_index = forloop.index0 | minus: 1
assign next_index = forloop.index0 | plus: 1
assign prev_block = section.blocks[prev_index]
assign next_block = section.blocks[next_index]
assign image = block.settings.icon_alt
assign bg_color = block.settings.bg_color
assign text_color = block.settings.color
comment
Always force dots style to be "line" except if "Circle" is chosen from the global settings
endcomment
assign dots_style = 'line'
if settings.dots_style == 'circle'
assign dots_style = 'circle'
endif
capture style
if bg_color != 'rgba(0,0,0,0)' and bg_color != blank
echo '--bg: ' | append: bg_color | append: ';'
endif
if text_color != 'rgba(0,0,0,0)' and text_color != blank
echo '--text: ' | append: text_color | append: ';'
endif
endcapture
-%}
{%- if forloop.index0 == 0 or prev_block.type != 'features' -%}
{%- assign slide_index = 0 -%}
<div class="product__block product__features block-padding"
{{ block_style }}
data-slider
data-slider-fullwidth
data-dots="{{ dots_style }}"
data-options='{"pageDots": true, "adaptiveHeight": true, "autoPlay": false, "prevNextButtons": false, "fade": false, "draggable": ">1"}'
>
{%- endif -%}
<div class="product__feature"
data-slide="{{ block_id }}"
data-slide-index="{{ slide_index }}"
data-block-id="{{ block_id }}"
{% if style != blank %}
style="{{ style }}"
{% endif %}
{{ block.shopify_attributes }}>
<div class="product__feature__content">
<div class="block__icon__container product__feature__heading">
{%- assign icon_size = block.settings.icon_size -%}
<div class="block__icon" style="--icon-size: {{ icon_size }}px;">
{%- liquid
if image
assign icon_width = icon_size
assign icon_width_retina = icon_width | times: 2
assign icon_sizes = icon_width | append: 'px'
assign icon_widths = icon_width | append: ', ' | append: icon_width_retina
render 'image' image: image, width: icon_width_retina, sizes: icon_sizes, widths: icon_widths, show_backfill: false
else
render 'animated-icon', filename: block.settings.icon_name
endif
-%}
</div>
{%- if title != blank -%}
{%- assign font_size_class = block.settings.text_size | prepend: 'body-size-' -%}
<div class="block__icon__text {{ font_size_class }}">
<p>{{ title }}</p>
</div>
{%- endif -%}
</div>
{%- if text != blank -%}
<div class="rte">
{{ text }}
</div>
{%- endif -%}
</div>
</div>
{%- if forloop.index == section.blocks.size or next_block.type != 'features' -%}
</div>
{%- endif -%}
{%- assign slide_index = slide_index | plus: 1 -%}
{%- when 'popup' -%}
{%- liquid
assign link_text = block.settings.title
assign popup_content = block.settings.page.content | default: block.settings.text
assign image = block.settings.image
assign icon_size = block.settings.icon_size
assign icon_color = block.settings.icon_color
capture block_style
echo 'style="'
echo '--block-padding-bottom: ' | append: block.settings.padding_bottom | append: 'px;'
echo '"'
endcapture
capture icon_style
echo 'style="'
echo '--icon-size: ' | append: icon_size | append: 'px;'
if icon_color != blank and icon_color != 'rgba(0,0,0,0)'
echo '--text: ' | append: icon_color | append: ';'
endif
echo '"'
endcapture
-%}
<product-modal class="product__block block-padding" {{ block_style }}>
<div class="block__icon__container block__icon__container--full">
<div class="block__icon" data-aos="img-in" {{ icon_style }}>
{%- liquid
if image
assign icon_width = icon_size
assign icon_width_retina = icon_width | times: 2
assign icon_sizes = icon_width | append: 'px'
assign icon_widths = icon_width | append: ', ' | append: icon_width_retina
render 'image' image: image, width: icon_width_retina, sizes: icon_sizes, widths: icon_widths, show_backfill: false
else
render 'animated-icon', filename: block.settings.icon_name
endif
-%}
</div>
<a class="radio__legend__link text-link" href="{{ block.settings.page.url }}" data-popup-open {{ block.shopify_attributes }}>
{{ link_text | escape }}
</a>
</div>
<dialog class="product-modal" aria-hidden="true" inert data-scroll-lock-required>
<form method="dialog">
<button class="visually-hidden no-js" aria-label="{{ 'general.accessibility.close' | t }}"></button>
</form>
<div class="product-modal__outer">
<div class="product-modal__content small" data-scroll-lock-scrollable>
<button type="button" class="product-modal__close" data-popup-close autofocus aria-label="{{ 'general.accessibility.close' | t }}">
{%- render 'icon-cancel' -%}
</button>
{{ popup_content }}
</div>
</div>
</dialog>
</product-modal>
{%- when 'complementary-products' -%}
<div class="product__block product__complementary block-padding" {{ block.shopify_attributes }} {{ block_style }}>
<complementary-products class="complementary-products"
data-url="{{ routes.product_recommendations_url }}?section_id={{ section.id }}&product_id={{ product.id }}&limit=10&intent=complementary" >
{%- if recommendations.performed and recommendations.products_count > 0 -%}
{%- assign complementary_products_title = 'products.general.complementary_products_title' | t -%}
{%- if complementary_products_title != blank -%}
<p class="complementary-products__title">{{ complementary_products_title }}</p>
{%- endif -%}
{%- for product in recommendations.products limit: block.settings.complementary_limit-%}
{%- render 'upsell-product', upsell_product: product -%}
{%- endfor -%}
{%- endif -%}
</complementary-products>
</div>
{%- when 'badges' -%}
<div class="product__block product__badges block-padding"
{{ block.shopify_attributes }}
{{ block_style }}>
{%- if badge != '' and block.settings.product_badges -%}
<span class="badge-box">{{ badge }}</span>
{%- endif -%}
{%- if preorder and sold_out == false and block.settings.product_badges-%}
<span class="preorder-box">{{ 'products.product.pre_order' | t }}</span>
{%- endif -%}
{%- if on_sale and sold_out == false and block.settings.sale_badge -%}
<span class="sale-box">{{ 'products.product.on_sale' | t }}</span>
{%- endif -%}
</div>
{%- when 'countdown' -%}
{%- assign layout = block.settings.text_align -%}
{%- assign font_size_class = block.settings.heading_size | prepend: 'heading-size-' -%}
<div class="product__block countdown-block block-padding flex-column {{ layout }}"
{{ block_style }}
data-countdown-block
{{ block.shopify_attributes }}>
<div class="countdown-block__text {{ font_size_class }}">
{%- if block.settings.text != blank -%}
{{ block.settings.text }}
{%- endif -%}
</div>
<div class="countdown-block__timer">
{%- render 'countdown-timer',
text_size_desktop: block.settings.text_size,
text_size_mobile: block.settings.text_size,
end_date: block.settings.end_date,
end_time: block.settings.end_time,
period: block.settings.period,
end_message: block.settings.end_message,
hide_on_complete: block.settings.hide_on_complete,
-%}
</div>
</div>
{%- when 'sku' -%}
<div class="product__block product__sku block-padding"
{{ block_style }}
data-variant-sku
{{ block.shopify_attributes }}>
{{ 'products.product.sku' | t }}: {{ current_variant.sku }}
</div>
{%- when 'fit-guide' -%}
<div class="product__block product__guide guide block-padding" {{ block.shopify_attributes }} {{ block_style }}>
{%- if block.settings.heading != blank -%}
<p class="guide__heading strong">{{ block.settings.heading }}</p>
{%- endif -%}
<div class="guide__line">
{%- assign selected_segment = block.settings.selected_segment | plus: 0 -%}
{%- for idx in (1..5) -%}
<span{% if forloop.index == selected_segment %} class="is-active"{% endif %}>{{ forloop.index }}</span>
{%- endfor -%}
</div>
{%- if block.settings.left_label != blank or block.settings.middle_label != blank or block.settings.right_label != blank -%}
<div class="guide__content{% unless block.settings.left_label != blank %} guide__content--skip-left{% endunless %}{% unless block.settings.right_label != blank %} guide__content--skip-right{% endunless %}">
{%- if block.settings.left_label != blank -%}
<small class="guide__left">{{ block.settings.left_label }}</small>
{%- endif -%}
{%- if block.settings.middle_label != blank -%}
<small class="guide__middle">{{ block.settings.middle_label }}</small>
{%- endif -%}
{%- if block.settings.right_label != blank -%}
<small class="guide__right">{{ block.settings.right_label }}</small>
{%- endif -%}
</div>
{%- endif -%}
</div>
{%- endcase -%}
{%- endfor -%}
</div>
</div>
</div>
</div>
</div>
</div>
{% unless product == empty %}
<script type="application/json" data-product-json>
{{ product | json }}
</script>
<script type="application/json" id="ModelJSON-{{ unique }}">
{{ product.media | where: 'media_type', 'model' | json }}
</script>
{%- liquid
assign metafields_data = '['
for variant in product.variants
assign metafield_value = variant.metafields.theme.final_sale.value | replace: '"', "''"
assign metafields_data = metafields_data | append: '{"variant_id":"' | append: variant.id | append: '" , "metafield_value":"' | append: metafield_value | append: '"},'
endfor
assign metafields_data = metafields_data | append: ']'
assign metafields_data = metafields_data | replace: ",]", "]"
-%}
<span data-variant-final-sale-metafield style="display:none;">{{ metafields_data }}</span>
{% endunless %}
{% comment %} Google wants to know when to check your price again {% endcomment %}
{%- liquid
assign days_price_is_valid = 1
assign seconds_in_a_day = 86400
assign seconds_price_valid = days_price_is_valid | times: seconds_in_a_day
if product.selected_or_first_available_variant.featured_media
assign seo_media = product.selected_or_first_available_variant.featured_media
else
assign seo_media = product.featured_media
endif
-%}
<script type="application/ld+json">
{
"@context": "http://schema.org/",
"@type": "Product",
"name": {{ product.title | json }},
"url": {{ request.origin | append: product.url | json }},
{% if seo_media -%}
"image": [
{{ seo_media | image_url: width: 1920 | prepend: "https:" | json }}
],
{%- endif %}
"description": {{ product.description | strip_html | json }},
{%- if current_variant.sku != blank -%}
"sku": {{ current_variant.sku | json }},
{%- endif -%}
"brand": {
"@type": "Organization",
"name": {{ product.vendor | json }}
},
"offers": [
{%- for variant in product.variants -%}
{
"@type" : "Offer",
{%- if variant.sku != blank -%}
"sku": {{ variant.sku | json }},
{%- endif -%}
{%- if variant.barcode.size == 12 -%}
"gtin12": {{ variant.barcode }},
{%- endif -%}
{%- if variant.barcode.size == 13 -%}
"gtin13": {{ variant.barcode }},
{%- endif -%}
{%- if variant.barcode.size == 14 -%}
"gtin14": {{ variant.barcode }},
{%- endif -%}
"availability" : "http://schema.org/{% if variant.available %}InStock{% else %}OutOfStock{% endif %}",
"price" : {{ variant.price | divided_by: 100.00 | json }},
"priceCurrency" : {{ cart.currency.iso_code | json }},
"priceValidUntil": "{{ 'now' | date: '%s' | plus: seconds_price_valid | date: '%Y-%m-%d' }}",
"url" : {{ request.origin | append: variant.url | json }}
}{% unless forloop.last %},{% endunless %}
{%- endfor -%}
]
}
</script>
{%- if show_cart_bar -%}
<!-- /partials/cart-bar.liquid -->
{%- liquid
assign current_variant = product.selected_or_first_available_variant
assign selling_plan_hide = true
assign button_add = false
assign blocks_form = section.blocks | where: 'type', 'form'
assign current_variant_price_raw = current_variant.metafields.app--168074346497.auto_discounted_price.value | default: current_variant.price
assign current_variant_compare_at_price_raw = current_variant.compare_at_price
if current_variant.metafields.app--168074346497.discount_type.value != nil and current_variant.metafields.app--168074346497.discount_type.value != "fixed" and product.metafields.app--168074346497.discount_percentage.value > 0.01
assign deducted_percentage = 1.0 | minus: product.metafields.app--168074346497.discount_percentage.value
if current_variant.metafields.app--168074346497.discount_percentage.value > 0.01
assign deducted_percentage = 1.0 | minus: current_variant.metafields.app--168074346497.discount_percentage.value
endif
assign current_variant_price_raw = current_variant.price | divided_by: 100.0 | times: deducted_percentage | times: 100.0 | ceil
assign current_variant_compare_at_price_raw = current_variant.price
if current_variant.compare_at_price > current_variant_compare_at_price_raw
assign current_variant_compare_at_price_raw = current_variant.compare_at_price
endif
endif
if settings.currency_code_enable
assign current_variant_price = current_variant_price_raw | money_with_currency
assign current_variant_compare_at_price = current_variant_compare_at_price_raw | money_with_currency
else
assign current_variant_price = current_variant_price_raw | money
assign current_variant_compare_at_price = current_variant_compare_at_price_raw | money
endif
assign any_variant_available = false
for variant in product.variants
if variant.available
assign any_variant_available = true
break
endif
endfor
-%}
{% if product.selling_plan_groups.size > 0 and blocks_form.size > 0 and blocks_form[0].settings.subscriptions_enable_selectors %}
{%- assign selling_plan_hide = false -%}
{% endif %}
{%- if product.has_only_default_variant and selling_plan_hide -%}
{%- assign button_add = true -%}
{%- endif -%}
<div id="cart-bar" class="cart-bar">
<div class="cart-bar__form__wrapper form__wrapper{% if button_add and current_variant.available != true %} variant--soldout{% endif %}{% if settings.show_newsletter %} show-product-notification{% endif %}{% unless any_variant_available %} all-variants--soldout{% endunless %}" data-form-wrapper>
<div class="cart-bar__info">
<h4 class="cart-bar__product__title">{{ product.title | strip_html }}</h4>
<div class="h5--body cart-bar__product__price product__price" data-price-wrapper>
<span data-product-price {% if current_variant_compare_at_price > current_variant_price %} class="product__price--sale"{% endif %}>
{%- if current_variant_price == 0 -%}
{{ 'general.money.free' | t }}
{%- else -%}
{{ current_variant_price }}
{%- endif -%}
</span>
{% if product_compare_at_price_max > product_price %}
<span class="visually-hidden" data-compare-text>{{ 'products.product.regular_price' | t }}</span>
<s class="product__price--strike" data-compare-price>
{% if current_variant_compare_at_price > current_variant_price %}
{{ current_variant_compare_at_price }}
{% endif %}
</s>
{% endif %}
</div>
</div>
<div class="cart-bar__form">
<div class="cart-bar__submit product__submit product__submit--spb">
<button type="button"
class="btn btn--primary btn--outline product__submit__add{% unless button_add %} product__submit__add--default{% endunless %}"
{% if button_add %} data-add-to-cart-bar{% elsif any_variant_available %} data-cart-bar-scroll{% endif %}
{% if any_variant_available == false or button_add and current_variant.available != true %} disabled="disabled"{% endif %}>
<span class="btn__text"{% if button_add %} data-add-to-cart-text{% endif %}>
{%- if button_add -%}
{%- assign preorder_check = false -%}
{%- if product.tags contains '_preorder' or product.metafields.theme.preorder.value -%}
{%- assign preorder_check = true -%}
{%- endif -%}
{%- if current_variant.available and preorder_check -%}
{{ 'products.product.pre_order' | t }}
{%- elsif current_variant.available -%}
{{ 'products.product.add_to_cart' | t }}
{%- else -%}
{{ 'products.product.sold_out' | t }}
{%- endif -%}
{%- elsif any_variant_available -%}
{{ 'products.product.configure' | t }}
{%- else -%}
{{ 'products.product.sold_out' | t }}
{%- endif -%}
</span>
<span class="btn__loader">
<svg height="18" width="18" class="svg-loader">
<circle r="7" cx="9" cy="9" />
<circle stroke-dasharray="87.96459430051421 87.96459430051421" r="7" cx="9" cy="9" />
</svg>
</span>
<span class="btn__added">&nbsp;</span>
{%- unless button_add or any_variant_available == false -%}
{%- render 'icon-nav-arrow-up' -%}
{%- endunless -%}
</button>
{%- if settings.show_newsletter -%}
{%- assign newsletter_text = 'general.newsletter_form.newsletter_product_availability' | t -%}
{%- assign button_text = 'products.product.sold_out' | t | append: ' - ' | append: newsletter_text -%}
<button type="button"
class="btn btn--primary btn--outline product__submit__add product__submit__add--default product__cart-bar-notification-button"
data-cart-bar-product-notification>
<span class="btn__text">{{ button_text }}</span>
</button>
{%- endif -%}
</div>
</div>
</div>
</div>
{%- endif -%}
</div>
{% schema %}
{
"name": "Product pages",
"class": "section-overlay-header",
"settings": [
{
"type": "header",
"content": "Layout"
},
{
"type": "checkbox",
"id": "product_sticky_enable",
"label": "Enable sticky form",
"default": true
},
{
"type": "checkbox",
"id": "variant_image_scroll",
"label": "Enable product image variant scroll",
"info": "Clicking a variant scrolls user to assigned image",
"default": true
},
{
"type": "select",
"id": "image_layout",
"label": "Style",
"default": "stacked",
"options": [
{ "value": "thumbnails", "label": "Thumbnails - Bottom" },
{ "value": "thumbnails-left", "label": "Thumbnails - Left" },
{ "value": "stacked", "label": "Stacked" },
{ "value": "grid-1", "label": "Mosaic" },
{ "value": "grid-2", "label": "Grid" }
],
"info": "Desktop only"
},
{
"type": "select",
"id": "image_size",
"label": "Image size",
"options": [
{
"value": "small",
"label": "Small"
},
{
"value": "normal",
"label": "Normal"
},
{
"value": "stretch",
"label": "Stretch - No thumbnails"
}
],
"default": "normal"
},
{
"type": "header",
"content": "Cart bar"
},
{
"type": "checkbox",
"id": "show_cart_bar",
"label": "Enable cart bar",
"default": true
},
{
"type": "header",
"content": "Media",
"info": "Learn more about [media types](https://help.shopify.com/manual/products/product-media)"
},
{
"type": "checkbox",
"id": "enable_zoom",
"label": "Enable zoom",
"default": true
},
{
"type": "checkbox",
"id": "enable_video_looping",
"label": "Enable video looping",
"default": false
},
{
"type": "header",
"content": "Mobile"
},
{
"type": "select",
"id": "mobile_image_style",
"label": "Style",
"options": [
{
"value": "thumbs",
"label": "Thumbnails"
},
{
"value": "slider",
"label": "Slider"
}
],
"default": "thumbs"
},
{
"type": "header",
"content": "Section padding"
},
{
"type": "range",
"id": "padding_top",
"min": 0,
"max": 100,
"step": 1,
"unit": "px",
"label": "Padding top",
"default": 90
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 100,
"step": 1,
"unit": "px",
"label": "Padding bottom",
"default": 30
}
],
"blocks": [
{
"type": "@app"
},
{
"type": "title",
"name": "Title",
"limit": 1,
"settings": [
{
"type": "select",
"id": "subheading_option",
"label": "Navigation",
"default": "none",
"options": [
{ "value": "none", "label": "None" },
{ "value": "breadcrumb", "label": "Breadcrumb" },
{ "value": "collection", "label": "Collection" },
{ "value": "vendor", "label": "Vendor" }
]
},
{
"type": "range",
"id": "text_size",
"label": "Text size",
"min": 1,
"max": 15,
"step": 1,
"default": 6
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 8
}
]
},
{
"type": "price",
"name": "Price",
"limit": 1,
"settings": [
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "variants",
"name": "Variant picker",
"limit": 1,
"settings": [
{
"type": "header",
"content": "Size chart"
},
{
"type": "page",
"id": "info_page",
"label": "Page",
"info": "[Learn more](https://broadcast.invisiblethemes.com/products/product-pages/size-charts)"
},
{
"type": "select",
"id": "size_chart_style",
"label": "Style",
"default": "text",
"options": [
{ "value": "text", "label": "Text" },
{ "value": "ruler", "label": "Ruler" },
{ "value": "question", "label": "Question mark" }
]
},
{
"type": "header",
"content": "Subscriptions",
"info": "Learn more about [subscriptions](https://help.shopify.com/en/manual/products/subscriptions)"
},
{
"type": "checkbox",
"id": "subscriptions_enable_selectors",
"label": "Enable subscription selectors",
"info": "Shown on products with subscription options",
"default": false
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "buttons",
"name": "Buy buttons",
"limit": 1,
"settings": [
{
"type": "checkbox",
"id": "show_quantity",
"label": "Show quantity selector",
"default": true
},
{
"type": "checkbox",
"id": "show_payment_button",
"label": "Show dynamic checkout buttons",
"info": "Each customer will see their preferred payment method from those available on your store, such as PayPal or Apple Pay. [Learn more](https://help.shopify.com/en/manual/online-store/os/dynamic-checkout)",
"default": true
},
{
"type": "checkbox",
"id": "show_gift_card_recipient",
"label": "Show recipient information form for gift card products",
"default": false,
"info": "Gift card products can optionally be sent direct to a recipient along with a personal message."
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 32
}
]
},
{
"type": "siblings",
"name": "Siblings",
"limit": 1,
"settings": [
{
"type": "paragraph",
"content": "Siblings allow you to split colors into separate products. [Learn more](https://broadcast.invisiblethemes.com/siblings/product-siblings/about-product-siblings)"
},
{
"type": "text",
"id": "siblings_collection",
"label": "Product siblings collection handle",
"info": "Use a metafield containing a collection handle for color siblings. The collection should contain all color options as unique products."
},
{
"type": "text",
"id": "sibling_color",
"label": "Product color metafield",
"info": "Use a single line text metafield called 'theme.sibling_color' for product color."
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "description",
"name": "Description",
"limit": 1,
"settings": [
{
"type": "checkbox",
"id": "show_read_more",
"label": "Show read more button",
"default": true
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 0
}
]
},
{
"type": "tab_richtext",
"name": "Tabs",
"limit": 1,
"settings": [
{
"type": "checkbox",
"id": "show_description",
"label": "Show description",
"default": true
},
{
"type": "checkbox",
"id": "show_read_more",
"label": "Show read more button",
"default": false
},
{
"type": "text",
"id": "title_1",
"label": "Tab heading",
"default": "Tab"
},
{
"type": "richtext",
"id": "raw_content_1",
"label": "Tab text",
"default": "<p>This content type will accept <strong>rich text</strong> to help with adding styles and links to additional pages or content. Use this to add supplementary information to help your buyers.</p>"
},
{
"type": "text",
"id": "title_2",
"label": "Tab heading",
"default": "Info"
},
{
"type": "richtext",
"id": "raw_content_2",
"label": "Tab text",
"default": "<p>You can use product metafields to assign content to this tab that is unique to an individual product. Use tabs to highlight unique features, sizing information, or other sales information.</p>"
},
{
"type": "text",
"id": "title_3",
"label": "Tab heading"
},
{
"type": "richtext",
"id": "raw_content_3",
"label": "Tab text"
},
{
"type": "text",
"id": "title_4",
"label": "Tab heading"
},
{
"type": "richtext",
"id": "raw_content_4",
"label": "Tab text"
},
{
"type": "text",
"id": "title_5",
"label": "Tab heading"
},
{
"type": "richtext",
"id": "raw_content_5",
"label": "Tab text"
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 0
}
]
},
{
"type": "accordion",
"name": "Accordion",
"settings": [
{
"type": "checkbox",
"id": "show_description",
"label": "Show description",
"default": false
},
{
"type": "checkbox",
"id": "show_read_more",
"label": "Show read more button",
"default": true
},
{
"type": "checkbox",
"id": "default_open",
"label": "Open by default",
"default": false
},
{
"type": "text",
"id": "heading",
"label": "Heading",
"default": "Accordion"
},
{
"type": "richtext",
"id": "text",
"label": "Text",
"default": "<p>This content type will accept <strong>rich text</strong> to help with adding styles and links to additional pages or content. Use this to add supplementary information to help your buyers.</p>"
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 0
}
]
},
{
"type": "upsell",
"name": "Upsell",
"limit": 1,
"settings": [
{
"type": "product",
"id": "upsell_product",
"label": "Single product"
},
{
"type": "product_list",
"id": "upsell_product_list",
"label": "Product list",
"limit": 3,
"info": "Choose up to 3 upsell products"
},
{
"type": "checkbox",
"id": "show_avaialable_upsell_only",
"label": "Show only items in stock",
"default": false
},
{
"type": "header",
"content": "Cart"
},
{
"type": "paragraph",
"content": "Use a dynamic source with the metafield 'theme.upsell' for single product or 'theme.upsell_list' for product list to allow product upsells to follow users into the cart. Use any other name to limit this feature to the product page. [Learn more](https://broadcast.invisiblethemes.com/products/upselling)"
},
{
"type": "header",
"content": "Colors"
},
{
"type": "color",
"id": "bg_color",
"label": "Background"
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "inventory_countdown",
"name": "Inventory countdown",
"limit": 1,
"settings": [
{
"type": "select",
"id": "show_notice",
"label": "Show notice",
"default": "low-inventory",
"options": [
{ "label": "Always", "value": "always" },
{ "label": "Low inventory", "value": "low-inventory" }
]
},
{
"type": "range",
"id": "max_inventory",
"label": "Low inventory threshold",
"min": 1,
"max": 50,
"step": 1,
"default": 10
},
{
"type": "checkbox",
"id": "hide_inventory_counter",
"label": "Hide inventory counter",
"default": true
},
{
"type": "range",
"id": "icon_size",
"label": "Icon size",
"unit": "px",
"min": 20,
"max": 80,
"step": 5,
"default": 20
},
{
"type": "header",
"content": "Colors"
},
{
"type": "color",
"id": "in_stock_color",
"label": "In stock",
"default": "#56AD6A"
},
{
"type": "color",
"id": "low_stock_color",
"label": "Low stock",
"default": "#f79554"
},
{
"type": "color",
"id": "out_of_stock_color",
"label": "Out of stock",
"default": "#721C24"
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "sharing",
"name": "Sharing",
"limit": 1,
"settings": [
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "pickup",
"name": "Local pickup",
"limit": 1,
"settings": [
{
"type": "paragraph",
"content": "Show customers where they can pick up the product. [Learn more](https://help.shopify.com/en/manual/shipping/setting-up-and-managing-your-shipping/local-methods/local-pickup#show-pickup-availability-to-your-customers)"
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 32
}
]
},
{
"type": "text",
"name": "Text",
"settings": [
{
"type": "text",
"id": "title",
"label": "Heading",
"default": "Have questions?"
},
{
"type": "richtext",
"id": "text",
"label": "Text",
"default": "<p>Get in touch with us at any time.</p>"
},
{
"type": "select",
"id": "layout",
"label": "Layout",
"options": [
{
"value": "left",
"label": "Left"
},
{
"value": "inline",
"label": "In-line"
}
],
"default": "left"
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "code",
"name": "Custom code",
"settings": [
{
"type": "liquid",
"id": "code",
"label": "Custom code",
"info": "Add app snippets or other Liquid code to create advanced customizations."
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "icon",
"name": "Icon",
"settings": [
{
"type": "select",
"id": "icon_name",
"label": "Icon",
"default": "icon-award",
"options": [
{ "label": "Award", "value": "icon-award" },
{ "label": "Box", "value": "icon-box" },
{ "label": "Chat", "value": "icon-chat" },
{ "label": "Cloud", "value": "icon-cloud" },
{ "label": "Diameter", "value": "icon-diameter" },
{ "label": "Discount", "value": "icon-discount" },
{ "label": "Donation", "value": "icon-donation" },
{ "label": "Droplet", "value": "icon-droplet" },
{ "label": "Info", "value": "icon-info-empty" },
{ "label": "Email", "value": "icon-email" },
{ "label": "Fast shipment", "value": "icon-fast-shipment" },
{ "label": "Flare", "value": "icon-flare" },
{ "label": "Flower", "value": "icon-flower" },
{ "label": "Gift", "value": "icon-gift" },
{ "label": "Green shipment", "value": "icon-green-shipment" },
{ "label": "Heart", "value": "icon-heart" },
{ "label": "Leaf", "value": "icon-leaf" },
{ "label": "Lightning", "value": "icon-lightning" },
{ "label": "Location", "value": "icon-location" },
{ "label": "Mail", "value": "icon-mail" },
{ "label": "Notes", "value": "icon-notes" },
{ "label": "Pants", "value": "icon-pants" },
{ "label": "Peace", "value": "icon-peace" },
{ "label": "Pin", "value": "icon-pin" },
{ "label": "Planet", "value": "icon-planet" },
{ "label": "Phone", "value": "icon-phone" },
{ "label": "Recycle", "value": "icon-recycle" },
{ "label": "Ruler", "value": "icon-ruler" },
{ "label": "Shield", "value": "icon-shield" },
{ "label": "Smile", "value": "icon-smile" },
{ "label": "Star", "value": "icon-star" },
{ "label": "Tree", "value": "icon-tree" },
{ "label": "Trophy", "value": "icon-trophy" },
{ "label": "Truck", "value": "icon-truck" },
{ "label": "Vegan", "value": "icon-vegan" },
{ "label": "Wash", "value": "icon-wash" },
{ "label": "Washing machine", "value": "icon-washing-machine" }
]
},
{
"type": "image_picker",
"id": "image",
"label": "Alternative icon/image"
},
{
"type": "range",
"id": "icon_size",
"label": "Size",
"unit": "px",
"min": 20,
"max": 80,
"step": 5,
"default": 20
},
{
"type": "color",
"id": "icon_color",
"label": "Icon color",
"default": "#545454"
},
{
"type": "text",
"id": "title",
"label": "Heading",
"default": "Title"
},
{
"type": "range",
"id": "text_size",
"label": "Text size",
"min": 1,
"max": 15,
"step": 1,
"default": 3
},
{
"type": "header",
"content": "Layout"
},
{
"type": "select",
"id": "width",
"label": "Width",
"default": "full",
"options": [
{ "label": "Full width", "value": "full" },
{ "label": "Half", "value": "half" },
{ "label": "One third", "value": "third" },
{ "label": "One quarter", "value": "quarter" }
]
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "divider",
"name": "Divider",
"settings": [
{
"type": "checkbox",
"id": "show_line",
"label": "Show line",
"default": true
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 1,
"unit": "px",
"label": "Padding bottom",
"default": 20
}
]
},
{
"type": "line-item",
"name": "Line item property",
"settings": [
{
"type": "text",
"id": "label",
"label": "Label",
"default": "Your label"
},
{
"type": "select",
"id": "type",
"label": "Type",
"default": "text",
"options": [
{ "label": "Text", "value": "text" },
{ "label": "Checkbox", "value": "checkbox" },
{ "label": "Dropdown", "value": "dropdown" }
]
},
{
"type": "header",
"content": "Text",
"info": "For Type set to \"Text\"."
},
{
"type": "checkbox",
"id": "required",
"label": "Required",
"default": true
},
{
"type": "header",
"content": "Checkbox",
"info": "For Type set to \"Checkbox\"."
},
{
"type": "text",
"id": "checked_value",
"label": "Checked value",
"default": "Yes"
},
{
"type": "text",
"id": "unchecked_value",
"label": "Unchecked value",
"default": "No"
},
{
"type": "header",
"content": "Dropdown",
"info": "For Type set to \"Dropdown\"."
},
{
"type": "text",
"id": "option_1",
"label": "Option 1",
"default": "Option 1"
},
{
"type": "text",
"id": "option_2",
"label": "Option 2",
"default": "Option 2"
},
{
"type": "text",
"id": "option_3",
"label": "Option 3",
"default": "Option 3"
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "features",
"name": "Feature",
"settings": [
{
"type": "select",
"id": "icon_name",
"label": "Icon",
"default": "icon-award",
"options": [
{ "label": "Award", "value": "icon-award" },
{ "label": "Box", "value": "icon-box" },
{ "label": "Chat", "value": "icon-chat" },
{ "label": "Cloud", "value": "icon-cloud" },
{ "label": "Diameter", "value": "icon-diameter" },
{ "label": "Discount", "value": "icon-discount" },
{ "label": "Donation", "value": "icon-donation" },
{ "label": "Droplet", "value": "icon-droplet" },
{ "label": "Info", "value": "icon-info-empty" },
{ "label": "Email", "value": "icon-email" },
{ "label": "Fast shipment", "value": "icon-fast-shipment" },
{ "label": "Flare", "value": "icon-flare" },
{ "label": "Flower", "value": "icon-flower" },
{ "label": "Gift", "value": "icon-gift" },
{ "label": "Green shipment", "value": "icon-green-shipment" },
{ "label": "Heart", "value": "icon-heart" },
{ "label": "Leaf", "value": "icon-leaf" },
{ "label": "Lightning", "value": "icon-lightning" },
{ "label": "Location", "value": "icon-location" },
{ "label": "Mail", "value": "icon-mail" },
{ "label": "Notes", "value": "icon-notes" },
{ "label": "Pants", "value": "icon-pants" },
{ "label": "Peace", "value": "icon-peace" },
{ "label": "Pin", "value": "icon-pin" },
{ "label": "Planet", "value": "icon-planet" },
{ "label": "Phone", "value": "icon-phone" },
{ "label": "Recycle", "value": "icon-recycle" },
{ "label": "Ruler", "value": "icon-ruler" },
{ "label": "Shield", "value": "icon-shield" },
{ "label": "Smile", "value": "icon-smile" },
{ "label": "Star", "value": "icon-star" },
{ "label": "Tree", "value": "icon-tree" },
{ "label": "Trophy", "value": "icon-trophy" },
{ "label": "Truck", "value": "icon-truck" },
{ "label": "Vegan", "value": "icon-vegan" },
{ "label": "Wash", "value": "icon-wash" },
{ "label": "Washing machine", "value": "icon-washing-machine" }
]
},
{
"type": "image_picker",
"id": "icon_alt",
"label": "Alternative icon/image"
},
{
"type": "range",
"id": "icon_size",
"label": "Size",
"unit": "px",
"min": 20,
"max": 80,
"step": 5,
"default": 20
},
{
"type": "text",
"id": "title",
"label": "Heading",
"default": "Feature"
},
{
"type": "range",
"id": "text_size",
"label": "Text size",
"min": 1,
"max": 15,
"step": 1,
"default": 3
},
{
"type": "richtext",
"id": "text",
"label": "Text",
"default": "<p>This content type will accept <strong>rich text</strong> to help with adding styles and links to additional pages or content. Use this to add supplementary information to help your buyers.</p>"
},
{
"type": "header",
"content": "Colors"
},
{
"id": "bg_color",
"type": "color",
"label": "Background",
"default": "#F7F9FA"
},
{
"type": "color",
"id": "color",
"label": "Text",
"default": "#212121"
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding",
"default": 16
}
]
},
{
"type": "complementary-products",
"name": "Complementary products",
"limit": 1,
"settings": [
{
"type": "paragraph",
"content": "To select complementary products, add the Search & Discovery app. [Learn more](https://help.shopify.com/manual/online-store/search-and-discovery/product-recommendations)"
},
{
"type": "range",
"id": "complementary_limit",
"min": 1,
"max": 3,
"step": 1,
"label": "Number of products",
"default": 3
},
{
"type": "header",
"content": "Colors"
},
{
"type": "color",
"id": "bg_color",
"label": "Background"
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "popup",
"name": "Popup",
"settings": [
{
"type": "text",
"id": "title",
"label": "Link text",
"default": "Popup text"
},
{
"type": "richtext",
"id": "text",
"label": "Text",
"default": "<p>Additonal information about the product.</p>"
},
{
"type": "page",
"id": "page",
"label": "Page"
},
{
"type": "select",
"id": "icon_name",
"label": "Icon",
"default": "icon-award",
"options": [
{ "label": "Award", "value": "icon-award" },
{ "label": "Box", "value": "icon-box" },
{ "label": "Chat", "value": "icon-chat" },
{ "label": "Cloud", "value": "icon-cloud" },
{ "label": "Diameter", "value": "icon-diameter" },
{ "label": "Discount", "value": "icon-discount" },
{ "label": "Donation", "value": "icon-donation" },
{ "label": "Droplet", "value": "icon-droplet" },
{ "label": "Info", "value": "icon-info-empty" },
{ "label": "Email", "value": "icon-email" },
{ "label": "Fast shipment", "value": "icon-fast-shipment" },
{ "label": "Flare", "value": "icon-flare" },
{ "label": "Flower", "value": "icon-flower" },
{ "label": "Gift", "value": "icon-gift" },
{ "label": "Green shipment", "value": "icon-green-shipment" },
{ "label": "Heart", "value": "icon-heart" },
{ "label": "Leaf", "value": "icon-leaf" },
{ "label": "Lightning", "value": "icon-lightning" },
{ "label": "Location", "value": "icon-location" },
{ "label": "Mail", "value": "icon-mail" },
{ "label": "Notes", "value": "icon-notes" },
{ "label": "Pants", "value": "icon-pants" },
{ "label": "Peace", "value": "icon-peace" },
{ "label": "Pin", "value": "icon-pin" },
{ "label": "Planet", "value": "icon-planet" },
{ "label": "Phone", "value": "icon-phone" },
{ "label": "Recycle", "value": "icon-recycle" },
{ "label": "Ruler", "value": "icon-ruler" },
{ "label": "Shield", "value": "icon-shield" },
{ "label": "Smile", "value": "icon-smile" },
{ "label": "Star", "value": "icon-star" },
{ "label": "Tree", "value": "icon-tree" },
{ "label": "Trophy", "value": "icon-trophy" },
{ "label": "Truck", "value": "icon-truck" },
{ "label": "Vegan", "value": "icon-vegan" },
{ "label": "Wash", "value": "icon-wash" },
{ "label": "Washing machine", "value": "icon-washing-machine" }
]
},
{
"type": "image_picker",
"id": "image",
"label": "Alternative icon/image"
},
{
"type": "range",
"id": "icon_size",
"label": "Size",
"unit": "px",
"min": 20,
"max": 80,
"step": 5,
"default": 20
},
{
"type": "color",
"id": "icon_color",
"label": "Icon color",
"default": "#545454"
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "badges",
"name": "Badges",
"settings": [
{
"type": "checkbox",
"id": "sale_badge",
"label": "Show sale badges",
"default": true
},
{
"type": "checkbox",
"id": "product_badges",
"label": "Show product badges",
"info": "Add tag '_preorder' or '_badge_with_custom_text' to a product in order to show the badge",
"default": true
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 8
}
]
},
{
"type": "sku",
"name": "SKU",
"limit": 1,
"settings": [
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
},
{
"type": "fit-guide",
"name": "Fit guide",
"settings": [
{
"type": "text",
"id": "heading",
"label": "Heading",
"default": "Fit"
},
{
"type": "text",
"id": "selected_segment",
"label": "Active segment",
"default": "4",
"info": "Enter a number from 1 - 5 to show active fit. Use a metafield for a custom fit per product."
},
{
"type": "text",
"id": "left_label",
"label": "Left label",
"default": "Small"
},
{
"type": "text",
"id": "middle_label",
"label": "Middle label",
"default": "True to size"
},
{
"type": "text",
"id": "right_label",
"label": "Right label",
"default": "Large"
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 8
}
]
},
{
"type": "countdown",
"name": "Countdown timer",
"settings": [
{
"type": "text",
"id": "end_date",
"label": "End date",
"placeholder": "2023-12-31 23:59",
"default": "2024-12-31",
"info": "Use format \"YYYY-MM-DD\". Expiration date is based on the [store primary timezone](/admin/settings/general)."
},
{
"type": "text",
"id": "end_time",
"label": "End time",
"default": "11:59",
"placeholder": "11:59",
"info": "Use 12-hour time convention in format \"HH:MM\""
},
{
"type": "radio",
"id": "period",
"label": "AM/PM",
"options": [
{ "value": "am", "label": "AM" },
{ "value": "pm", "label": "PM" }
],
"default": "am"
},
{
"type": "richtext",
"id": "end_message",
"label": "End of timer message",
"default": "<p>Offer has expired</p>"
},
{
"type": "checkbox",
"id": "hide_on_complete",
"label": "Hide block after end of timer",
"default": true
},
{
"type": "range",
"id": "text_size",
"label": "Digits size",
"min": 1,
"max": 15,
"step": 1,
"default": 6
},
{
"type": "richtext",
"id": "text",
"label": "Text",
"default": "<p>Limited time offer</p>"
},
{
"type": "range",
"id": "heading_size",
"label": "Heading size",
"min": 1,
"max": 15,
"step": 1,
"default": 2
},
{
"type": "header",
"content": "Colors"
},
{
"type": "color",
"id": "bg_color",
"label": "Background",
"default": "#F7F9FA"
},
{
"type": "color",
"id": "color",
"label": "Text"
},
{
"type": "header",
"content": "Layout"
},
{
"type": "select",
"id": "text_align",
"label": "Text alignment",
"default": "text-center",
"options": [
{ "value": "text-left","label": "Left" },
{ "value": "text-center","label": "Centered" }
]
},
{
"type": "header",
"content": "Block spacing"
},
{
"type": "range",
"id": "padding_bottom",
"min": 0,
"max": 50,
"step": 2,
"unit": "px",
"label": "Padding bottom",
"default": 16
}
]
}
]
}
{% endschema %}