Pixfizz Knowledge Base
  • 👋Welcome to Pixfizz
  • Overview
    • 💡Getting Started Checklist
  • Installation to Ecommerce stores
    • Pixfizz Ecommerce
      • Setup Required Custom Fields
      • Setup Required Custom Types
      • Shopper FAQs
        • How to Add a Custom Font to my Site
      • Liquid Documentation
    • Shopify Ecommerce
      • 💫How to get started
      • 🛠️Shopify Installation
      • 🛠️Shopify Installation - Variable Pages
        • Add Saved Projects Functionality
      • Linking products to shopify
    • ETSY
      • Setting Up Listings in Pixfizz
      • Setting up SKU's in Etsy & Pixfizz
  • Production Management
    • What Output Options are there for Production?
    • Production PDF versions
    • Add Order Codes to Production Files
    • Add Dynamic Barcode
    • Add a QR Code Element
      • QR Code Content element substitutions
    • Receipt of Orders
    • Custom fulfillment folder name
    • Ability to provide file content directly in _additional_files.json
    • Add Trim Marks to Production Files
    • File Upload variants and template options
    • Film Processing
  • Fulfillment Partners
    • Request Access to a Catalog
    • Publishing Products from a Catalog to your Site
    • Change Background Color of Preview Images
    • Mixam
      • About Mixam
      • Get Started with Mixam
      • Product Catalog
      • Request a Print Sample from Mixam (optional)
      • Fullfilment of Mixam Products
      • Linking to Mixam API
    • Navitor
      • Product Catalog
    • LA Cameras
      • Product Catalog
  • eCommerce CMS
    • Setup Shipping Services
    • How to Setup Taxes
      • Setup Tax Exempt Users
    • Extra Fees
    • Custom Web Components
      • <px-image-upload>
      • <px-date-selector>
    • Import promocodes into Pixfizz admin
    • FAQ
      • Hide a page from Search Engine Crawls
    • Google Analytics & Google Tag Manager
      • Setup New Account
      • Setup eCommerce Events in Pixfizz CMS
  • PRODUCT SETUP & DESIGN
    • Product Pricing
    • How to Create Templates
      • XML Definition Parameters
      • XML Set Parameters
      • XML Page Parameters
      • PDF Layers
      • Define page break on Layflat spreads
      • Calendar Setup
        • Calendar Week Starting with Sunday
        • Calendar Week Starting with Monday
    • Setup Collections to Publish Products
      • How to add Filters to your Collections
    • File Artwork
    • MSP HUB content
      • Graduation Text Element Substitutions
    • Sample Templates
      • Photo Prints
      • Cards (Folded)
      • Canvas Prints
      • Framed Prints
      • Notebooks
      • Drinkware
      • Clothing
      • Photo Albums
      • Layflat Photo Albums
    • Designs
      • How to Build a Card - Part 1: Implement Design
      • How to Build a Card - Part 2: Add Design Flexibility with Substitutions
      • How to Build a Photo Album - Layouts
      • How to Build a Photo Album - Trim Marks on Cover & Page
      • Template Business Card EU
    • Template and Design Options
    • Help Guide for the Editor
    • User Editing Options
      • Standard Editor
      • PX Preview
  • Admin Guide
    • Domains
    • Setup reCAPTCHA
    • Analytics
    • 📪Dashboard
    • Orders
      • Orders
      • Abandoned Carts
      • Production Files
      • Projects
    • Users
      • Users
        • User Information
        • Merging Anonymous Users
        • Change Password
        • Custom Fields
        • Promocodes (Single User)
        • Last Orders
        • Projects
        • Galleries
        • Calendars
        • Addresses
      • Invites
    • Galleries
      • Galleries
      • Organize/Tag Galleries
      • Public galleries image source for upload dialog
    • Products
      • Products
      • Product Attributes
      • Templates
        • Designs
      • Collections
      • Fonts
      • Font Palettes
      • Color Palettes
      • Element Substitutions
        • Element substitutions on text variants replacing “Target Element Name”**
      • Calendars
      • Price Variables
    • Shipping
      • Shipping Services
        • Ranking Weight for Shipping Options
      • Packaging
      • Shipping Address of Origin
      • Taxes
      • Addresses
      • Liquid support for shipping formulas
    • Marketing
      • Promocodes
    • Website
      • Pages
      • Layouts
      • Snippets
      • Assets
      • Special Web Components
        • Date Selector Component
        • Dynamic Previews
    • Settings
      • General
        • Website Configuration
        • Domain Hosting
        • Facebook Integration
        • Instagram Integration
        • Dropbox Integration
          • Dropbox integration for upload dialog
        • API settings
        • Watermark
      • Email Notifications
        • Email Notification Settings
        • Order Pending Confirmation Email
        • Order Payment Confirmation Email
        • Order Shipped Email
        • Signup Email
        • Password Reset Email
        • Abandoned Cart Email
        • Refer A Friend Email
      • Design Tool
        • Name
        • Logo
        • Favicon
        • Brand Color
        • Page Title
        • Use New Editor
        • Autofill Button
        • Launch Into Autofill
        • Captions
        • Unedited Warning
        • Image Flip
        • Alignment Aids
          • Alignment highlights
        • Two Page Spread
        • Auto Cropping
        • Crop Bleed
        • Asymmetrical bleeds and margins
        • Image Effects
        • Image Rotation
        • Edit cut print projects
        • Placeholder Rotation
        • Image Borders
        • Background Colors
        • Border Radius
        • Image Size Overlay
        • Project Options
        • Display Price
        • Copy Shared Projects
        • Cut Print Mode
        • Multi-Image Uploader
        • Large Format / Wall-Art
        • Highlight Editable Elements
        • Use Mapped Preview
        • Homepage URL
        • Cart Page Name
        • Account Page Name
        • Upload Size Limit
        • Default Font
        • Default Font Palette
        • Default Font Size
        • Default Text Color Palette
        • Default Image Border Color Palette
        • Background Color Palette
        • Google Tag Manager ID
        • Image Sources
        • Categories
        • Quicksave Prompt Delay
        • Help URL
        • Resolution Warning
        • Text Cropping Warning
        • Multitext Custom Fields
        • Custom JS
        • Admin Custom JS
        • Custom CSS
        • Fill Multiple Placeholders with a Print
        • Auto-Generate Previews from Design Products
        • Shrink-to-Fit for px-Image-Upload
        • PDF Import Panel
      • Translations
      • OAuth
      • Documentation
    • Payment Gateways
      • Stripe Webhook for callbacks
      • PayU Money (India) Callback URL
  • Use Cases
    • 🎨For Designers
    • 🖥️For Developers
  • 🔗API
    • 🖼️Dynamic Design Previews
  • Setup GA4 eCommerce Analytics
  • 🌐SEO
  • Structured Data
    • Product Pages
    • Shop Pages: ItemList
  • INTEGRATIONS
    • Dropbox
    • Darkroom
    • Stamped.io
    • Shippo
      • Shippo Setup
    • Tracking Unlimited
      • Setup
      • Product Setup
        • Product Code
        • Product Options
        • Shipping Services
    • Syncovery
      • Installation
      • Profile Setup
      • DPOF Profile Setup
      • Scheduler
      • Advanced Workflow Automation
    • Indisposable
    • Klaviyo
  • Group 1
    • Form to update Order Status
Powered by GitBook
On this page
  1. Installation to Ecommerce stores
  2. Shopify Ecommerce

Shopify Installation

This guide covers the installation of Pixfizz to your Shopify store.

PreviousHow to get startedNextShopify Installation - Variable Pages

Last updated 2 months ago

To make changes you will need to go to the "Online Store" and on your current theme, Edit Code. If you need to update your theme you will need to re-add these code changes.

Setup Product and Variant Metafields

In Shopify, go to Settings - Custom Data and create the following Product Metafields ensuring content type matches.

Pixfizz Integration Type

Name: Pixfizz Integration Type Namespace and Key: pixfizz.integration_type Description: Use one of "editor" (default), "options-to-editor", "options-to-cart". Type: Single Line Text Regular Expression: ^editor|options-to-editor|options-to-cart$

Pixfizz product SKU

Name: Pixfizz product SKU Namespace and Key: pixfizz.product_sku Description: A combination of “theme-code:product-code" from pixfizz store. Type: Single Line Text

Pixfizz extra page addon

Name: Pixfizz extra page addon Namespace and Key: pixfizz.page_addon_product Description: Select the product that will be added to the cart when the customer adds Type: Product Variant

Pixfizz option addons

Name: Pixfizz option addons Namespace and Key: pixfizz.option_addon_products Description: Select the product(s that will be added to the cart when customer selects linked Pixfizz option. Type: Product

Pixfizz option type code

Name: Pixfizz option type code Namespace and Key: pixfizz.option_type_code Description: Links an addon product to an option type in Pixfizz Type: Single Line Text

Adjust Cart QTY

Name: Pixfizz Adjust Cart QTY Namespace and Key: pixfizz.adjust_cart_qty Description: Set to "False" to stop customers from updating cart QTY Type: True or False

SEO Hidden

Name: SEO Hidden Namespace and Key: seo.hidden Description: Set to 1 to hide from search. Type: Integer

Now create the following Product Metafields ensuring content type matches.

Name: Pixfizz product SKU Namespace and Key: pixfizz.product_sku Description: A combination of “theme-code:product-code" from pixfizz store. Type: Single Line Text

Name: Pixfizz extra page addon Namespace and Key: pixfizz.page_addon_product Description: Select the product that will be added to the cart when the customer adds Type: Product Variant

Name: Pixfizz option value code Namespace and Key: pixfizz.option_value_code Description: Links this variant to an option value in Pixfizz. Type: Single Line Text

Name: Pixfizz option addons Namespace and Key: pixfizz.option_addon_products Description: Select the product(s) that will be added to the cart when customer selects linked Pixfizz option. Type: Product

Adding elements to you shopify code. Go to your theme and edit code:

The below is for medium to advanced technical users. If you are not confident to setup the below code in your Shopify admin, Pixfizz can support the implementation. Please contact support@pixfizz.com to request help.

Reference main integration snippet in Layout

Theme: Insert this line into your theme’s layout (typically called theme.liquid), just before the closing </head> tag:

{% render 'pixfizz-setup' %}

Create Snippets

Create a new snippet called pixfizz-setup.liquid. Copy the following contents into it:

pixfizz-setup
{%- assign pixfizz_host = "design.myshop.com" -%}
{%- assign shared_secret = "123456" -%}

<script type="text/javascript" src="https://{{ pixfizz_host }}/site/shopify/api.js"></script>
<script type="text/javascript">
  (() => {  
    {%- if customer %}
      {%- capture hash_str %}{{ customer.id }}|{{ customer.email }}{% endcapture -%}
      {%- capture hash %}{{ hash_str | md5 }}{{ shared_secret }}{% endcapture -%}
      const user = {
        uid: "{{ customer.id }}",
        email: "{{ customer.email }}"
      };
      const hash = "{{ hash | md5 }}";
    {%- else %}
      const user = null;
      const hash = null;
    {%- endif %}
    Pixfizz.Shopify.setup({{ pixfizz_host | json }}, user, hash, {locale: {{ request.locale.iso_code | json }}});
  })();
</script>
  • Replace design.myshop.com at the top of the snippet with the hostname of your pixfizz site. You must use a custom hostname (not the default something.pixfizz.com) that is a subdomain of your Shopify shop’s domain. An example would be create.myprintshop.com

  • Replace 123456 in line 2 of the snippet with the shared secret which you can find in your Pixfizz admin.

pixfizz-launch-product-handler

pixfizz-launch-product-handler
{%- assign integration_type = product.metafields.pixfizz.integration_type | default: 'editor' -%}
{%- capture handler -%}
  (() => {
    const pixfizz_sku_map = {};
    {%- for variant in product.variants -%}
      pixfizz_sku_map[{{ variant.id }}] = {{ variant.metafields.pixfizz.product_sku | default: product.metafields.pixfizz.product_sku | json }};
    {%- endfor -%}
    const product_option_addons = {};
    {%- for addon in product.metafields.pixfizz.option_addon_products.value -%}
      product_option_addons[{{ addon.metafields.pixfizz.option_type_code | json }}] = {};
      {%- for addon_variant in addon.variants -%}
        product_option_addons[{{ addon.metafields.pixfizz.option_type_code | json }}][{{ addon_variant.metafields.pixfizz.option_value_code | json }}] = {{ addon_variant.id | json }};
      {%- endfor -%}
    {%- endfor -%}
    const pixfizz_addons_map = {};
    {%- for variant in product.variants -%}
      pixfizz_addons_map[{{ variant.id }}] = {
        page_addon: {{ variant.metafields.pixfizz.page_addon_product.value.id | default: product.metafields.pixfizz.page_addon_product.value.id | json }},
        option_addons: Object.assign({}, product_option_addons)
      };
      {%- for addon in variant.metafields.pixfizz.option_addon_products.value -%}
        if (!pixfizz_addons_map[{{ variant.id }}].option_addons[{{ addon.metafields.pixfizz.option_type_code | json }}]) {
          pixfizz_addons_map[{{ variant.id }}].option_addons[{{ addon.metafields.pixfizz.option_type_code | json }}] = {};
        }
        {%- for addon_variant in addon.variants -%}
          pixfizz_addons_map[{{ variant.id }}].option_addons[{{ addon.metafields.pixfizz.option_type_code | json }}][{{ addon_variant.metafields.pixfizz.option_value_code | json }}] = {{ addon_variant.id | json }};
        {%- endfor -%}
      {%- endfor -%}
    {%- endfor -%}
    const form = document.querySelector('form[action*="/cart/add"]');
    const selected_variant_id = form && (new FormData(form)).get('id') || {{ product.selected_or_first_available_variant.id | json }};
    const parameters = {
      page_addon: pixfizz_addons_map[selected_variant_id].page_addon || '',
      option_addons: JSON.stringify(pixfizz_addons_map[selected_variant_id].option_addons)
    };
    Pixfizz.Shopify.launchProduct(
      pixfizz_sku_map[selected_variant_id],
      {{ integration_type | json }},
      {{ product.id | json }},
      selected_variant_id,
      parameters
    );
  })();
  return false;
{%- endcapture -%}
{{ handler | escape }}

pixfizz-orderline-preview-handler

pixfizz-orderline-preview-handler
{%- capture handler -%}
  {%- if item.properties._pixfizz_project_id %}
    Pixfizz.Shopify.replaceImageWithProjectPreview(
      this.previousElementSibling,
      {{ item.properties._pixfizz_project_id | json }},
      {
        width: {{ width | json }},
        height: {{ height | json }}
      }
    );
  {%- endif -%}
{%- endcapture -%}
<style onload="{{ handler | escape }}"></style>

pixfizz-edit-orderline-handler

pixfizz-edit-orderline-handler
{%- capture handler -%}
  (() => {
    const page_addon = {{ item.variant.metafields.pixfizz.page_addon_product.value.id | default: item.product.metafields.pixfizz.page_addon_product.value.id | json }};
    const option_addons = {};
    {%- for addon in item.product.metafields.pixfizz.option_addon_products.value -%}
      option_addons[{{ addon.metafields.pixfizz.option_type_code | json }}] = {};
      {%- for addon_variant in addon.variants -%}
        option_addons[{{ addon.metafields.pixfizz.option_type_code | json }}][{{ addon_variant.metafields.pixfizz.option_value_code | json }}] = {{ addon_variant.id | json }};
      {%- endfor -%}
    {%- endfor -%}
    {%- for addon in item.variant.metafields.pixfizz.option_addon_products.value -%}
      if (!option_addons[{{ addon.metafields.pixfizz.option_type_code | json }}]) {
        option_addons[{{ addon.metafields.pixfizz.option_type_code | json }}] = {};
      }
      {%- for addon_variant in addon.variants -%}
        option_addons[{{ addon.metafields.pixfizz.option_type_code | json }}][{{ addon_variant.metafields.pixfizz.option_value_code | json }}] = {{ addon_variant.id | json }};
      {%- endfor -%}
    {%- endfor -%}
    const parameters = {
      cart: 't',
      line_item_key: {{ item.key | json }},
      quantity: {{ item.quantity | json }},
      page_addon: page_addon || '',
      option_addons: JSON.stringify(option_addons)
    };
    {%- if item.product.metafields.pixfizz.integration_type == 'options-to-cart' %}
      const options = {
        push_state: false,
        design_tool: false
      };
    {%- else -%}
      const options = {
        push_state: true,
        design_tool: true
      };
    {%- endif -%}
    Pixfizz.Shopify.launchProject(
      {{ item.properties._pixfizz_project_id | json }},
      parameters,
      options
    );
  })();
  return false;
{%- endcapture -%}
{{ handler | escape }}

pixfizz-orderline-quantity-handler

The code in this snippet may have to be adjusted if you are using a theme other than Dawn.

pixfizz-orderline-quantity-handler
{%- capture handler -%}
  (async (event) => {
    const quantity = {% if delete_item %}0{% else %}parseInt(event.target.value, 10){% endif %};
    const item_updates = {
      '{{ item.key }}': quantity
    };
    {%- if item.properties._pixfizz_project_id -%}
      {%- for iteritem in cart.items -%}
        {%- if iteritem.properties._pixfizz_addon == item.properties._pixfizz_project_id -%}
          item_updates['{{ iteritem.key }}'] = {{ iteritem.properties._pixfizz_unit_quantity }} * quantity;
        {%- endif -%}
      {%- endfor -%}
    {%- endif -%}
    if (event.__pixfizz_addons_handled) {
      return;
    } else if (Object.keys(item_updates).length) {
      event.stopImmediatePropagation();
      event.target.closest('cart-items').enableLoading({{ item.index | plus: 1 }});
      if (quantity > 0) {
        item_updates['{{ item.key }}'] = quantity;
      }
      await fetch(`${Shopify.routes.root}cart/update.js`, {
        method: 'POST',
        body: JSON.stringify({updates: item_updates}),
        headers: {
          'Content-Type': 'application/json'
        }
      });
      if (quantity > 0) {
        const new_event = new Event(event.type, {bubbles: true});
        new_event.__pixfizz_addons_handled = true;
        event.target.dispatchEvent(new_event);
      } else {
        {%- comment %} When deleting, we cannot rely on native handler, so just refresh the cart page. {% endcomment -%}
        window.location.reload();
      }
    }
  })(event);
  return false;
{%- endcapture -%}
{{ handler | escape }}

Create New Product Page Template

There are 2 options to add enable a "Customize" button to appear. The first one is the simplest and easiest. An alternative method may be more relevant when not using Dawn Theme or where the site needs to have additional functionality -> Disabling the customize button when there is zero stock.

On the product page for Pixfizz products, we’ll have to replace the buy buttons with a “Personalize” button. The cleanest way to do that is to create a dedicated product template for Pixfizz products.

This is for Shopify 2.0 compatible themes only. Older themes must go into the theme code and create a new Template from there.

Go to the theme editor in Shopify, and on the template selector dropdown, select “Products → Create template”.

The template should be based on your default product template. Name it “Pixfizz Product”.

Now select the block with the buy button(s) and remove it. We will add a “Custom liquid” block in its place.

  • Paste the following code into the liquid input field (Note you can change the word "Personalize" to any text you wish):

<button onclick="{% render 'pixfizz-launch-product-handler' %}">
  Personalize
</button>

Another example:

<button onclick="{% render 'pixfizz-launch-product-handler' %}" class="button button--full-width">Personalize</button>

Update Cart Page

Dawn Theme: main-cart-items section

After backing up your code please overwrite the main-cart-items.liquid with the following:

Dawn Version 14.0.0

{{ 'component-cart.css' | asset_url | stylesheet_tag }}
{{ 'component-cart-items.css' | asset_url | stylesheet_tag }}
{{ 'component-totals.css' | asset_url | stylesheet_tag }}
{{ 'component-price.css' | asset_url | stylesheet_tag }}
{{ 'component-discounts.css' | asset_url | stylesheet_tag }}
{{ 'quantity-popover.css' | asset_url | stylesheet_tag }}

{%- style -%}
  .section-{{ section.id }}-padding {
    padding-top: {{ section.settings.padding_top | times: 0.75 | round: 0 }}px;
    padding-bottom: {{ section.settings.padding_bottom | times: 0.75 | round: 0 }}px;
  }

  @media screen and (min-width: 750px) {
    .section-{{ section.id }}-padding {
      padding-top: {{ section.settings.padding_top }}px;
      padding-bottom: {{ section.settings.padding_bottom }}px;
    }
  }
{%- endstyle -%}

{%- unless settings.cart_type == 'drawer' -%}
  <script src="{{ 'cart.js' | asset_url }}" defer="defer"></script>
{%- endunless -%}

<script src="{{ 'quantity-popover.js' | asset_url }}" defer="defer"></script>

<cart-items class="gradient color-{{ section.settings.color_scheme }} isolate{% if cart == empty %} is-empty{% else %} section-{{ section.id }}-padding{% endif %}">
  <div class="page-width">
    <div class="title-wrapper-with-link">
      <h1 class="title title--primary">{{ 'sections.cart.title' | t }}</h1>
      <a href="{{ routes.all_products_collection_url }}" class="underlined-link">
        {{- 'general.continue_shopping' | t -}}
      </a>
    </div>

    <div class="cart__warnings">
      <h1 class="cart__empty-text">{{ 'sections.cart.empty' | t }}</h1>
      <a href="{{ routes.all_products_collection_url }}" class="button">
        {{ 'general.continue_shopping' | t }}
      </a>

      {%- if shop.customer_accounts_enabled and customer == null -%}
        <h2 class="cart__login-title">{{ 'sections.cart.login.title' | t }}</h2>
        <p class="cart__login-paragraph">
          {{ 'sections.cart.login.paragraph_html' | t: link: routes.account_login_url }}
        </p>
      {%- endif -%}
    </div>

    <form action="{{ routes.cart_url }}" class="cart__contents critical-hidden" method="post" id="cart">
      <div class="cart__items" id="main-cart-items" data-id="{{ section.id }}">
        <div class="js-contents">
          {%- if cart != empty -%}
            <table class="cart-items">
              <caption class="visually-hidden">
                {{ 'sections.cart.title' | t }}
              </caption>
              <thead>
                <tr>
                  <th class="caption-with-letter-spacing" colspan="2" scope="col">
                    {{ 'sections.cart.headings.product' | t }}
                  </th>
                  <th class="medium-hide large-up-hide right caption-with-letter-spacing" colspan="1" scope="col">
                    {{ 'sections.cart.headings.total' | t }}
                  </th>
                  <th
                    class="cart-items__heading--wide cart-items__heading--quantity small-hide caption-with-letter-spacing"
                    colspan="1"
                    scope="col"
                  >
                    {{ 'sections.cart.headings.quantity' | t }}
                  </th>
                  <th class="small-hide right caption-with-letter-spacing" colspan="1" scope="col">
                    {{ 'sections.cart.headings.total' | t }}
                  </th>
                </tr>
              </thead>

              <tbody>
                {%- for item in cart.items -%}

                  {%  comment %} Pixfizz Code Start {% endcomment %}
                  {%- if item.properties._pixfizz_addon -%}
                    {% continue %}
                  {%- endif %}
                  {%  comment %} Pixfizz Code End {% endcomment %}  
                  
                  <tr class="cart-item" id="CartItem-{{ item.index | plus: 1 }}">
                    <td class="cart-item__media">
                      {% if item.image %}
                        {% comment %} Leave empty space due to a:empty CSS display: none rule {% endcomment %}
                        <a href="{{ item.url }}" class="cart-item__link" aria-hidden="true" tabindex="-1"
                          
                          {% comment %} Pixfizz Code Start {% endcomment %}
                          style="z-index:1;"
                          {%- if item.properties._pixfizz_project_id -%}
                            onclick="{% render 'pixfizz-edit-orderline-handler', item: item %}"
                          {%- endif -%}
                          {% comment %} Pixfizz Code End {% endcomment %}
                          
                          > </a>
                        <div class="cart-item__image-container gradient global-media-settings">
                          <img
                            src="{{ item.image | image_url: width: 300 }}"
                            class="cart-item__image"
                            alt="{{ item.image.alt | escape }}"
                            loading="lazy"
                            width="150"
                            height="{{ 150 | divided_by: item.image.aspect_ratio | ceil }}"
                          >

                          {% comment %} Pixfizz Code Start {% endcomment %}
                          {% render 'pixfizz-orderline-preview-handler', item: item, width: 300 %}
                          {% comment %} Pixfizz Code End {% endcomment %}
                          
                        </div>
                      {% endif %}
                    </td>

                    <td class="cart-item__details">
                      {%- if settings.show_vendor -%}
                        <p class="caption-with-letter-spacing">{{ item.product.vendor }}</p>
                      {%- endif -%}

                      <a href="{{ item.url }}" class="cart-item__name h4 break">{{ item.product.title | escape }}</a>

                      {%- if item.original_price != item.final_price -%}
                        <div class="cart-item__discounted-prices">
                          <span class="visually-hidden">
                            {{ 'products.product.price.regular_price' | t }}
                          </span>
                          <s class="cart-item__old-price product-option">
                            {{- item.original_price | money -}}
                          </s>
                          <span class="visually-hidden">
                            {{ 'products.product.price.sale_price' | t }}
                          </span>
                          <strong class="cart-item__final-price product-option">
                            {{ item.final_price | money }}
                          </strong>
                        </div>
                      {%- else -%}
                        <div class="product-option">
                          {{ item.original_price | money }}
                        </div>
                      {%- endif -%}

                      {%- if item.product.has_only_default_variant == false
                        or item.properties.size != 0
                        or item.selling_plan_allocation != null
                      -%}
                        <dl>
                          {%- if item.product.has_only_default_variant == false -%}
                            {%- for option in item.options_with_values -%}
                              <div class="product-option">
                                <dt>{{ option.name }}:</dt>
                                <dd>{{ option.value }}</dd>
                              </div>
                            {%- endfor -%}
                          {%- endif -%}

                          {%- for property in item.properties -%}
                            {%- assign property_first_char = property.first | slice: 0 -%}
                            {%- if property.last != blank and property_first_char != '_' -%}
                              <div class="product-option">
                                <dt>{{ property.first }}:</dt>
                                <dd>
                                  {%- if property.last contains '/uploads/' -%}
                                    <a href="{{ property.last }}" class="link" target="_blank">
                                      {{ property.last | split: '/' | last }}
                                    </a>
                                  {%- else -%}
                                    {{ property.last }}
                                  {%- endif -%}
                                </dd>
                              </div>
                            {%- endif -%}
                          {%- endfor -%}
                        </dl>

                        <p class="product-option">{{ item.selling_plan_allocation.selling_plan.name }}</p>
                      {%- endif -%}

                      <ul class="discounts list-unstyled" role="list" aria-label="{{ 'customer.order.discount' | t }}">
                        {%- for discount in item.line_level_discount_allocations -%}
                          <li class="discounts__discount">
                            {%- render 'icon-discount' -%}
                            {{ discount.discount_application.title }}
                          </li>
                        {%- endfor -%}
                      </ul>
                    </td>

                    <td class="cart-item__totals right medium-hide large-up-hide">
                      {%- render 'loading-spinner' -%}
                      <div class="cart-item__price-wrapper">
                        {%- if item.original_line_price != item.final_line_price -%}
                          <dl class="cart-item__discounted-prices">
                            <dt class="visually-hidden">
                              {{ 'products.product.price.regular_price' | t }}
                            </dt>
                            <dd>
                              <s class="cart-item__old-price price price--end">
                                {{ item.original_line_price | money }}
                              </s>
                            </dd>
                            <dt class="visually-hidden">
                              {{ 'products.product.price.sale_price' | t }}
                            </dt>
                            <dd class="price price--end">
                              {{ item.final_line_price | money }}
                            </dd>
                          </dl>
                        {%- else -%}
                          <span class="price price--end">
                            {{ item.original_line_price | money }}
                          </span>
                        {%- endif -%}

                        {%- if item.variant.available and item.unit_price_measurement -%}
                          <div class="unit-price caption">
                            <span class="visually-hidden">{{ 'products.product.price.unit_price' | t }}</span>
                            {{ item.unit_price | money }}
                            <span aria-hidden="true">/</span>
                            <span class="visually-hidden"
                              >&nbsp;{{ 'accessibility.unit_price_separator' | t }}&nbsp;</span
                            >
                            {%- if item.unit_price_measurement.reference_value != 1 -%}
                              {{- item.unit_price_measurement.reference_value -}}
                            {%- endif -%}
                            {{ item.unit_price_measurement.reference_unit }}
                          </div>
                        {%- endif -%}
                      </div>
                    </td>
                    {%- liquid
                      assign has_qty_rules = false
                      if item.variant.quantity_rule.increment > 1 or item.variant.quantity_rule.min > 1 or item.variant.quantity_rule.max != null
                        assign has_qty_rules = true
                      endif

                      assign has_vol_pricing = false
                      if item.variant.quantity_price_breaks.size > 0
                        assign has_vol_pricing = true
                      endif
                    -%}
                    <td class="cart-item__quantity{% if has_qty_rules or has_vol_pricing %} cart-item__quantity--info{% endif %}">
                      <quantity-popover>
                        <div class="cart-item__quantity-wrapper quantity-popover-wrapper">
                          <label class="visually-hidden" for="Quantity-{{ item.index | plus: 1 }}">
                            {{ 'products.product.quantity.label' | t }}
                          </label>
                          <div class="quantity-popover-container{% if has_qty_rules or has_vol_pricing %} quantity-popover-container--hover{% endif %}">
                            {%- if has_qty_rules or has_vol_pricing -%}
                              <button
                                type="button"
                                aria-expanded="false"
                                class="quantity-popover__info-button quantity-popover__info-button--icon-only button button--tertiary small-hide medium-hide"
                              >
                                {% render 'icon-info' %}
                              </button>
                            {%- endif -%}

                            {%  comment %} Pixfizz Code Start {% endcomment %}
                            {%- if item.product.metafields.pixfizz.adjust_cart_qty.value == false -%}
                              <span>{{ item.quantity }}</span>
                            {%- else -%}
                            
                            <quantity-input class="quantity cart-quantity">
                              <button class="quantity__button" name="minus" type="button">
                                <span class="visually-hidden">
                                  {{- 'products.product.quantity.decrease' | t: product: item.product.title | escape -}}
                                </span>
                                {% render 'icon-minus' %}
                              </button>
                              <input
                                class="quantity__input"
                                data-quantity-variant-id="{{ item.variant.id }}"
                                type="number"
                                name="updates[]"
                                value="{{ item.quantity }}"
                                {% # theme-check-disable %}
                                data-cart-quantity="{{ cart | item_count_for_variant: item.variant.id }}"
                                min="0"
                                data-min="{{ item.variant.quantity_rule.min }}"
                                {% if item.variant.quantity_rule.max != null %}
                                  max="{{ item.variant.quantity_rule.max }}"
                                {% endif %}
                                step="{{ item.variant.quantity_rule.increment }}"
                                {% # theme-check-enable %}
                                aria-label="{{ 'products.product.quantity.input_label' | t: product: item.product.title | escape }}"
                                id="Quantity-{{ item.index | plus: 1 }}"
                                data-index="{{ item.index | plus: 1 }}"

                                {%  comment %} Pixfizz Code Start {% endcomment %}
                                  onchange="{% render 'pixfizz-orderline-quantity-handler', item: item, cart: cart %}"
                                  onkeydown="if(event.keyCode===13)event.preventDefault()"
                                {%  comment %} Pixfizz Code End {% endcomment %}
                                
                              >
                              <button class="quantity__button" name="plus" type="button">
                                <span class="visually-hidden">
                                  {{- 'products.product.quantity.increase' | t: product: item.product.title | escape -}}
                                </span>
                                {% render 'icon-plus' %}
                              </button>
                            </quantity-input>

                            {%- endif -%}
                            {%  comment %} Pixfizz Code End {% endcomment %}
                            
                          </div>
                          <cart-remove-button
                            id="Remove-{{ item.index | plus: 1 }}"
                            data-index="{{ item.index | plus: 1 }}"
                          >
                            <a
                              href="{{ item.url_to_remove }}"
                              class="button button--tertiary"
                              aria-label="{{ 'sections.cart.remove_title' | t: title: item.title }}"

                              {%  comment %} Pixfizz Code Start {% endcomment %}
                              onclick="{% render 'pixfizz-orderline-quantity-handler', item: item, cart: cart, delete_item: true %}"
                              {%  comment %} Pixfizz Code End {% endcomment %}
                              
                            >
                              {% render 'icon-remove' %}
                            </a>
                          </cart-remove-button>
                        </div>
                        {%- if has_qty_rules or has_vol_pricing -%}
                          <button
                            type="button"
                            class="quantity-popover__info-button quantity-popover__info-button--icon-with-label button button--tertiary large-up-hide"
                            aria-expanded="false"
                          >
                            {% render 'icon-info' %}
                            <span>
                              {%- if has_vol_pricing -%}
                                {{ 'products.product.volume_pricing.note' | t }}
                              {%- elsif has_qty_rules -%}
                                {{ 'products.product.quantity.note' | t }}
                              {%- endif -%}
                            </span>
                          </button>
                        {%- endif -%}
                        {%- if has_vol_pricing or has_qty_rules -%}
                          <div
                            class="cart-items__info global-settings-popup quantity-popover__info"
                            tabindex="-1"
                            hidden
                          >
                            {%- if has_qty_rules == false -%}
                              <span class="volume-pricing-label caption">
                                {{- 'products.product.volume_pricing.title' | t -}}
                              </span>
                            {%- endif -%}
                            <div class="quantity__rules caption">
                              {%- if item.variant.quantity_rule.increment > 1 -%}
                                <span class="divider">
                                  {{-
                                    'products.product.quantity.multiples_of'
                                    | t: quantity: item.variant.quantity_rule.increment
                                  -}}
                                </span>
                              {%- endif -%}
                              {%- if item.variant.quantity_rule.min > 1 -%}
                                <span class="divider">
                                  {{-
                                    'products.product.quantity.min_of'
                                    | t: quantity: item.variant.quantity_rule.min
                                  -}}
                                </span>
                              {%- endif -%}
                              {%- if item.variant.quantity_rule.max != null -%}
                                <span class="divider">
                                  {{-
                                    'products.product.quantity.max_of'
                                    | t: quantity: item.variant.quantity_rule.max
                                  -}}
                                </span>
                              {%- endif -%}
                            </div>
                            <button
                              class="button-close button button--tertiary large-up-hide"
                              type="button"
                              aria-label="{{ 'accessibility.close' | t }}"
                            >
                              {%- render 'icon-close' -%}
                            </button>
                            {%- if item.variant.quantity_price_breaks.size > 0 -%}
                              <volume-pricing class="parent-display">
                                <ul class="list-unstyled">
                                  <li>
                                    <span>{{ item.variant.quantity_rule.min }}+</span>
                                    {%- assign price = item.variant.price | money_with_currency -%}
                                    <span> {{ 'sections.quick_order_list.each' | t: money: price }}</span>
                                  </li>
                                  {%- for price_break in item.variant.quantity_price_breaks -%}
                                    <li>
                                      <span>
                                        {{- price_break.minimum_quantity -}}
                                        <span aria-hidden="true">+</span></span
                                      >
                                      {%- assign price = price_break.price | money_with_currency -%}
                                      <span> {{ 'sections.quick_order_list.each' | t: money: price }}</span>
                                    </li>
                                  {%- endfor -%}
                                </ul>
                              </volume-pricing>
                            {%- endif -%}
                          </div>
                        {%- endif -%}
                        <div class="cart-item__error" id="Line-item-error-{{ item.index | plus: 1 }}" role="alert">
                          <small class="cart-item__error-text"></small>
                          <svg
                            aria-hidden="true"
                            focusable="false"
                            class="icon icon-error"
                            viewBox="0 0 13 13"
                          >
                            <circle cx="6.5" cy="6.50049" r="5.5" stroke="white" stroke-width="2"/>
                            <circle cx="6.5" cy="6.5" r="5.5" fill="#EB001B" stroke="#EB001B" stroke-width="0.7"/>
                            <path d="M5.87413 3.52832L5.97439 7.57216H7.02713L7.12739 3.52832H5.87413ZM6.50076 9.66091C6.88091 9.66091 7.18169 9.37267 7.18169 9.00504C7.18169 8.63742 6.88091 8.34917 6.50076 8.34917C6.12061 8.34917 5.81982 8.63742 5.81982 9.00504C5.81982 9.37267 6.12061 9.66091 6.50076 9.66091Z" fill="white"/>
                            <path d="M5.87413 3.17832H5.51535L5.52424 3.537L5.6245 7.58083L5.63296 7.92216H5.97439H7.02713H7.36856L7.37702 7.58083L7.47728 3.537L7.48617 3.17832H7.12739H5.87413ZM6.50076 10.0109C7.06121 10.0109 7.5317 9.57872 7.5317 9.00504C7.5317 8.43137 7.06121 7.99918 6.50076 7.99918C5.94031 7.99918 5.46982 8.43137 5.46982 9.00504C5.46982 9.57872 5.94031 10.0109 6.50076 10.0109Z" fill="white" stroke="#EB001B" stroke-width="0.7">
                          </svg>
                        </div>
                      </quantity-popover>
                    </td>

                    <td class="cart-item__totals right small-hide">
                      {%- render 'loading-spinner' -%}
                      <div class="cart-item__price-wrapper">
                        {%- if item.original_line_price != item.final_line_price -%}
                          <dl class="cart-item__discounted-prices">
                            <dt class="visually-hidden">
                              {{ 'products.product.price.regular_price' | t }}
                            </dt>
                            <dd>
                              <s class="cart-item__old-price price price--end">
                                {{ item.original_line_price | money }}
                              </s>
                            </dd>
                            <dt class="visually-hidden">
                              {{ 'products.product.price.sale_price' | t }}
                            </dt>
                            <dd class="price price--end">
                              {{ item.final_line_price | money }}
                            </dd>
                          </dl>
                        {%- else -%}
                          <span class="price price--end">
                            {{ item.original_line_price | money }}
                          </span>
                        {%- endif -%}

                        {%- if item.variant.available and item.unit_price_measurement -%}
                          <div class="unit-price caption">
                            <span class="visually-hidden">{{ 'products.product.price.unit_price' | t }}</span>
                            {{ item.unit_price | money }}
                            <span aria-hidden="true">/</span>
                            <span class="visually-hidden"
                              >&nbsp;{{ 'accessibility.unit_price_separator' | t }}&nbsp;</span
                            >
                            {%- if item.unit_price_measurement.reference_value != 1 -%}
                              {{- item.unit_price_measurement.reference_value -}}
                            {%- endif -%}
                            {{ item.unit_price_measurement.reference_unit }}
                          </div>
                        {%- endif -%}
                      </div>
                    </td>
                  </tr>

                  {%  comment %} Pixfizz Code Start {% endcomment %}
                  {%- if item.properties._pixfizz_project_id -%}
                    {%- comment %} Check for any addon items belonging to this Pixfizz orderline {% endcomment -%}
                    {%- for addon_item in cart.items -%}
                      {%- if addon_item.properties._pixfizz_addon == item.properties._pixfizz_project_id -%}
                        <tr class="cart-item">
                          <td class="cart-item__media"></td>
                          <td class="cart-item__details">
                            <a class="cart-item__name h4 break">
                              {{ addon_item.product.title | escape }}
                            </a>
                            <div class="product-option">
                              {{ addon_item.final_price | money }}
                            </div>
                            {%- if addon_item.product.has_only_default_variant == false -%}
                              <dl>
                                {%- for option in addon_item.options_with_values -%}
                                  <div class="product-option">
                                    <dt>{{ option.name }}: </dt>
                                    <dd>{{ option.value }}</dd>
                                  </div>
                                {%- endfor -%}
                              </dl>
                            {%- endif -%}
                          </td>
                          <td class="cart-item__totals right medium-hide large-up-hide">
                            {{ addon_item.final_line_price | money }}
                          </td>
                          <td class="cart-item__quantity">
                            {{ addon_item.quantity }}
                          </td>
                          <td class="cart-item__totals right small-hide">
                            <div class="cart-item__price-wrapper">
                              {{ addon_item.final_line_price | money }}
                            </div>
                          </td>
                        </tr>
                      {%- endif -%}
                    {%- endfor -%}
                  {%- endif -%}
                  {%  comment %} Pixfizz Code End {% endcomment %}
                  
                {%- endfor -%}
              </tbody>
            </table>
          {%- endif -%}
        </div>
      </div>

      <p class="visually-hidden" id="cart-live-region-text" aria-live="polite" role="status"></p>
      <p
        class="visually-hidden"
        id="shopping-cart-line-item-status"
        aria-live="polite"
        aria-hidden="true"
        role="status"
      >
        {{ 'accessibility.loading' | t }}
      </p>
    </form>
  </div>
</cart-items>

{% schema %}
{
  "name": "t:sections.main-cart-items.name",
  "settings": [
    {
      "type": "color_scheme",
      "id": "color_scheme",
      "label": "t:sections.all.colors.label",
      "default": "scheme-1"
    },
    {
      "type": "header",
      "content": "t:sections.all.padding.section_padding_heading"
    },
    {
      "type": "range",
      "id": "padding_top",
      "min": 0,
      "max": 100,
      "step": 4,
      "unit": "px",
      "label": "t:sections.all.padding.padding_top",
      "default": 36
    },
    {
      "type": "range",
      "id": "padding_bottom",
      "min": 0,
      "max": 100,
      "step": 4,
      "unit": "px",
      "label": "t:sections.all.padding.padding_bottom",
      "default": 36
    }
  ]
}
{% endschema %}

Dawn Version 13.0.1

/{{ 'component-cart.css' | asset_url | stylesheet_tag }}
{{ 'component-cart-items.css' | asset_url | stylesheet_tag }}
{{ 'component-totals.css' | asset_url | stylesheet_tag }}
{{ 'component-price.css' | asset_url | stylesheet_tag }}
{{ 'component-discounts.css' | asset_url | stylesheet_tag }}
{{ 'quantity-popover.css' | asset_url | stylesheet_tag }}

{%- style -%}
  .section-{{ section.id }}-padding {
    padding-top: {{ section.settings.padding_top | times: 0.75 | round: 0 }}px;
    padding-bottom: {{ section.settings.padding_bottom | times: 0.75 | round: 0 }}px;
  }

  @media screen and (min-width: 750px) {
    .section-{{ section.id }}-padding {
      padding-top: {{ section.settings.padding_top }}px;
      padding-bottom: {{ section.settings.padding_bottom }}px;
    }
  }
{%- endstyle -%}

{%- unless settings.cart_type == 'drawer' -%}
  <script src="{{ 'cart.js' | asset_url }}" defer="defer"></script>
{%- endunless -%}

<script src="{{ 'quantity-popover.js' | asset_url }}" defer="defer"></script>

<cart-items class="gradient color-{{ section.settings.color_scheme }} isolate{% if cart == empty %} is-empty{% else %} section-{{ section.id }}-padding{% endif %}">
  <div class="page-width">
    <div class="title-wrapper-with-link">
      <h1 class="title title--primary">{{ 'sections.cart.title' | t }}</h1>
      <a href="{{ routes.all_products_collection_url }}" class="underlined-link">
        {{- 'general.continue_shopping' | t -}}
      </a>
    </div>

    <div class="cart__warnings">
      <h1 class="cart__empty-text">{{ 'sections.cart.empty' | t }}</h1>
      <a href="{{ routes.all_products_collection_url }}" class="button">
        {{ 'general.continue_shopping' | t }}
      </a>

      {%- if shop.customer_accounts_enabled and customer == null -%}
        <h2 class="cart__login-title">{{ 'sections.cart.login.title' | t }}</h2>
        <p class="cart__login-paragraph">
          {{ 'sections.cart.login.paragraph_html' | t: link: routes.account_login_url }}
        </p>
      {%- endif -%}
    </div>

    <form action="{{ routes.cart_url }}" class="cart__contents critical-hidden" method="post" id="cart">
      <div class="cart__items" id="main-cart-items" data-id="{{ section.id }}">
        <div class="js-contents">
          {%- if cart != empty -%}
            <table class="cart-items">
              <caption class="visually-hidden">
                {{ 'sections.cart.title' | t }}
              </caption>
              <thead>
                <tr>
                  <th class="caption-with-letter-spacing" colspan="2" scope="col">
                    {{ 'sections.cart.headings.product' | t }}
                  </th>
                  <th class="medium-hide large-up-hide right caption-with-letter-spacing" colspan="1" scope="col">
                    {{ 'sections.cart.headings.total' | t }}
                  </th>
                  <th
                    class="cart-items__heading--wide cart-items__heading--quantity small-hide caption-with-letter-spacing"
                    colspan="1"
                    scope="col"
                  >
                    {{ 'sections.cart.headings.quantity' | t }}
                  </th>
                  <th class="small-hide right caption-with-letter-spacing" colspan="1" scope="col">
                    {{ 'sections.cart.headings.total' | t }}
                  </th>
                </tr>
              </thead>

              <tbody>
                {%- for item in cart.items -%}

                  {%  comment %} Pixfizz Code Start {% endcomment %}
                  {%- if item.properties._pixfizz_addon -%}
                    {% continue %}
                  {%- endif %}
                  {%  comment %} Pixfizz Code End {% endcomment %}  

                  <tr class="cart-item" id="CartItem-{{ item.index | plus: 1 }}">
                    <td class="cart-item__media">
                      {% if item.image %}
                        {% comment %} Leave empty space due to a:empty CSS display: none rule {% endcomment %}
                        <a href="{{ item.url }}" class="cart-item__link" aria-hidden="true" tabindex="-1"
                          {% comment %} Pixfizz Code Start {% endcomment %}
                          style="z-index:1;"
                          {%- if item.properties._pixfizz_project_id -%}
                            onclick="{% render 'pixfizz-edit-orderline-handler', item: item %}"
                          {%- endif -%}
                          {% comment %} Pixfizz Code End {% endcomment %}
                        > 
                        </a>
                        <div class="cart-item__image-container gradient global-media-settings">
                          <img
                            src="{{ item.image | image_url: width: 300 }}"
                            class="cart-item__image"
                            alt="{{ item.image.alt | escape }}"
                            loading="lazy"
                            width="150"
                            height="{{ 150 | divided_by: item.image.aspect_ratio | ceil }}"
                          >
                          {% comment %} Pixfizz Code Start {% endcomment %}
                          {% render 'pixfizz-orderline-preview-handler', item: item, width: 300 %}
                          {% comment %} Pixfizz Code End {% endcomment %}
                        </div>
                      {% endif %}
                    </td>

                    <td class="cart-item__details">
                      {%- if settings.show_vendor -%}
                        <p class="caption-with-letter-spacing">{{ item.product.vendor }}</p>
                      {%- endif -%}

                      <a href="{{ item.url }}" class="cart-item__name h4 break">{{ item.product.title | escape }}</a>

                      {%- if item.original_price != item.final_price -%}
                        <div class="cart-item__discounted-prices">
                          <span class="visually-hidden">
                            {{ 'products.product.price.regular_price' | t }}
                          </span>
                          <s class="cart-item__old-price product-option">
                            {{- item.original_price | money -}}
                          </s>
                          <span class="visually-hidden">
                            {{ 'products.product.price.sale_price' | t }}
                          </span>
                          <strong class="cart-item__final-price product-option">
                            {{ item.final_price | money }}
                          </strong>
                        </div>
                      {%- else -%}
                        <div class="product-option">
                          {{ item.original_price | money }}
                        </div>
                      {%- endif -%}

                      {%- if item.product.has_only_default_variant == false
                        or item.properties.size != 0
                        or item.selling_plan_allocation != null
                      -%}
                        <dl>
                          {%- if item.product.has_only_default_variant == false -%}
                            {%- for option in item.options_with_values -%}
                              <div class="product-option">
                                <dt>{{ option.name }}:</dt>
                                <dd>{{ option.value }}</dd>
                              </div>
                            {%- endfor -%}
                          {%- endif -%}

                          {%- for property in item.properties -%}
                            {%- assign property_first_char = property.first | slice: 0 -%}
                            {%- if property.last != blank and property_first_char != '_' -%}
                              <div class="product-option">
                                <dt>{{ property.first }}:</dt>
                                <dd>
                                  {%- if property.last contains '/uploads/' -%}
                                    <a href="{{ property.last }}" class="link" target="_blank">
                                      {{ property.last | split: '/' | last }}
                                    </a>
                                  {%- else -%}
                                    {{ property.last }}
                                  {%- endif -%}
                                </dd>
                              </div>
                            {%- endif -%}
                          {%- endfor -%}
                        </dl>

                        <p class="product-option">{{ item.selling_plan_allocation.selling_plan.name }}</p>
                      {%- endif -%}

                      <ul class="discounts list-unstyled" role="list" aria-label="{{ 'customer.order.discount' | t }}">
                        {%- for discount in item.line_level_discount_allocations -%}
                          <li class="discounts__discount">
                            {%- render 'icon-discount' -%}
                            {{ discount.discount_application.title }}
                          </li>
                        {%- endfor -%}
                      </ul>
                    </td>

                    <td class="cart-item__totals right medium-hide large-up-hide">
                      {%- render 'loading-spinner' -%}
                      <div class="cart-item__price-wrapper">
                        {%- if item.original_line_price != item.final_line_price -%}
                          <dl class="cart-item__discounted-prices">
                            <dt class="visually-hidden">
                              {{ 'products.product.price.regular_price' | t }}
                            </dt>
                            <dd>
                              <s class="cart-item__old-price price price--end">
                                {{ item.original_line_price | money }}
                              </s>
                            </dd>
                            <dt class="visually-hidden">
                              {{ 'products.product.price.sale_price' | t }}
                            </dt>
                            <dd class="price price--end">
                              {{ item.final_line_price | money }}
                            </dd>
                          </dl>
                        {%- else -%}
                          <span class="price price--end">
                            {{ item.original_line_price | money }}
                          </span>
                        {%- endif -%}

                        {%- if item.variant.available and item.unit_price_measurement -%}
                          <div class="unit-price caption">
                            <span class="visually-hidden">{{ 'products.product.price.unit_price' | t }}</span>
                            {{ item.unit_price | money }}
                            <span aria-hidden="true">/</span>
                            <span class="visually-hidden"
                              >&nbsp;{{ 'accessibility.unit_price_separator' | t }}&nbsp;</span
                            >
                            {%- if item.unit_price_measurement.reference_value != 1 -%}
                              {{- item.unit_price_measurement.reference_value -}}
                            {%- endif -%}
                            {{ item.unit_price_measurement.reference_unit }}
                          </div>
                        {%- endif -%}
                      </div>
                    </td>
                    {%- liquid
                      assign has_qty_rules = false
                      if item.variant.quantity_rule.increment > 1 or item.variant.quantity_rule.min > 1 or item.variant.quantity_rule.max != null
                        assign has_qty_rules = true
                      endif

                      assign has_vol_pricing = false
                      if item.variant.quantity_price_breaks.size > 0
                        assign has_vol_pricing = true
                      endif
                    -%}
                    <td class="cart-item__quantity{% if has_qty_rules or has_vol_pricing %} cart-item__quantity--info{% endif %}">
                      <quantity-popover>
                        <div class="cart-item__quantity-wrapper quantity-popover-wrapper">
                          <label class="visually-hidden" for="Quantity-{{ item.index | plus: 1 }}">
                            {{ 'products.product.quantity.label' | t }}
                          </label>
                          <div class="quantity-popover-container{% if has_qty_rules or has_vol_pricing %} quantity-popover-container--hover{% endif %}">
                            {%- if has_qty_rules or has_vol_pricing -%}
                              <button
                                type="button"
                                aria-expanded="false"
                                class="quantity-popover__info-button quantity-popover__info-button--icon-only button button--tertiary small-hide no-js-hidden"
                              >
                                {% render 'icon-info' %}
                              </button>
                            {%- endif -%}
                            {%  comment %} Pixfizz Code Start {% endcomment %}
                            {%- if item.product.type == 'Photo Prints' -%}
                              <span>{{ item.quantity }} prints</span>
                            {%- else -%}
                              <quantity-input class="quantity cart-quantity">
                                <button class="quantity__button no-js-hidden" name="minus" type="button">
                                  <span class="visually-hidden">
                                    {{- 'products.product.quantity.decrease' | t: product: item.product.title | escape -}}
                                  </span>
                                  {% render 'icon-minus' %}
                                </button>
                                <input
                                  class="quantity__input"
                                  data-quantity-variant-id="{{ item.variant.id }}"
                                  type="number"
                                  name="updates[]"
                                  value="{{ item.quantity }}"
                                  {% # theme-check-disable %}
                                  data-cart-quantity="{{ cart | item_count_for_variant: item.variant.id }}"
                                  min="{{ item.variant.quantity_rule.min }}"
                                  {% if item.variant.quantity_rule.max != null %}
                                    max="{{ item.variant.quantity_rule.max }}"
                                  {% endif %}
                                  step="{{ item.variant.quantity_rule.increment }}"
                                  {% # theme-check-enable %}
                                  aria-label="{{ 'products.product.quantity.input_label' | t: product: item.product.title | escape }}"
                                  id="Quantity-{{ item.index | plus: 1 }}"
                                  data-index="{{ item.index | plus: 1 }}"
                                  {%  comment %} Pixfizz Code Start {% endcomment %}
                                  onchange="{% render 'pixfizz-orderline-quantity-handler', item: item, cart: cart %}"
                                  onkeydown="if(event.keyCode===13)event.preventDefault()"
                                  {%  comment %} Pixfizz Code End {% endcomment %}
                                >
                                <button class="quantity__button no-js-hidden" name="plus" type="button">
                                  <span class="visually-hidden">
                                    {{- 'products.product.quantity.increase' | t: product: item.product.title | escape -}}
                                  </span>
                                  {% render 'icon-plus' %}
                                </button>
                              </quantity-input>
                            {%- endif -%}
                            {%  comment %} Pixfizz Code End {% endcomment %}
                          </div>
                          <cart-remove-button
                            id="Remove-{{ item.index | plus: 1 }}"
                            data-index="{{ item.index | plus: 1 }}"
                          >
                            <a
                              href="{{ item.url_to_remove }}"
                              class="button button--tertiary"
                              aria-label="{{ 'sections.cart.remove_title' | t: title: item.title }}"
                              {%  comment %} Pixfizz Code Start {% endcomment %}
                              onclick="{% render 'pixfizz-orderline-quantity-handler', item: item, cart: cart, delete_item: true %}"
                              {%  comment %} Pixfizz Code End {% endcomment %}
                            >
                              {% render 'icon-remove' %}
                            </a>
                          </cart-remove-button>
                        </div>
                        {%- if has_qty_rules or has_vol_pricing -%}
                          <button
                            type="button"
                            class="quantity-popover__info-button quantity-popover__info-button--icon-with-label button button--tertiary medium-hide large-up-hide"
                            aria-expanded="false"
                          >
                            {% render 'icon-info' %}
                            <span>
                              {%- if has_vol_pricing -%}
                                {{ 'products.product.volume_pricing.note' | t }}
                              {%- elsif has_qty_rules -%}
                                {{ 'products.product.quantity.note' | t }}
                              {%- endif -%}
                            </span>
                          </button>
                        {%- endif -%}
                        {%- if has_vol_pricing or has_qty_rules -%}
                          <div
                            class="cart-items__info global-settings-popup quantity-popover__info"
                            tabindex="-1"
                            hidden
                          >
                            {%- if has_qty_rules == false -%}
                              <span class="volume-pricing-label caption">
                                {{- 'products.product.volume_pricing.title' | t -}}
                              </span>
                            {%- endif -%}
                            <div class="quantity__rules caption no-js-hidden">
                              {%- if item.variant.quantity_rule.increment > 1 -%}
                                <span class="divider">
                                  {{-
                                    'products.product.quantity.multiples_of'
                                    | t: quantity: item.variant.quantity_rule.increment
                                  -}}
                                </span>
                              {%- endif -%}
                              {%- if item.variant.quantity_rule.min > 1 -%}
                                <span class="divider">
                                  {{-
                                    'products.product.quantity.minimum_of'
                                    | t: quantity: item.variant.quantity_rule.min
                                  -}}
                                </span>
                              {%- endif -%}
                              {%- if item.variant.quantity_rule.max != null -%}
                                <span class="divider">
                                  {{-
                                    'products.product.quantity.maximum_of'
                                    | t: quantity: item.variant.quantity_rule.max
                                  -}}
                                </span>
                              {%- endif -%}
                            </div>
                            <button
                              class="button-close button button--tertiary medium-hide large-up-hide"
                              type="button"
                              aria-label="{{ 'accessibility.close' | t }}"
                            >
                              {%- render 'icon-close' -%}
                            </button>
                            {%- if item.variant.quantity_price_breaks.size > 0 -%}
                              <volume-pricing class="parent-display">
                                <ul class="list-unstyled">
                                  <li>
                                    <span>{{ item.variant.quantity_rule.min }}+</span>
                                    {%- assign price = item.variant.price | money_with_currency -%}
                                    <span> {{ 'sections.quick_order_list.each' | t: money: price }}</span>
                                  </li>
                                  {%- for price_break in item.variant.quantity_price_breaks -%}
                                    <li>
                                      <span>
                                        {{- price_break.minimum_quantity -}}
                                        <span aria-hidden="true">+</span></span
                                      >
                                      {%- assign price = price_break.price | money_with_currency -%}
                                      <span> {{ 'sections.quick_order_list.each' | t: money: price }}</span>
                                    </li>
                                  {%- endfor -%}
                                </ul>
                              </volume-pricing>
                            {%- endif -%}
                          </div>
                        {%- endif -%}
                        <div class="cart-item__error" id="Line-item-error-{{ item.index | plus: 1 }}" role="alert">
                          <small class="cart-item__error-text"></small>
                          <svg
                            aria-hidden="true"
                            focusable="false"
                            class="icon icon-error"
                            viewBox="0 0 13 13"
                          >
                            <circle cx="6.5" cy="6.50049" r="5.5" stroke="white" stroke-width="2"/>
                            <circle cx="6.5" cy="6.5" r="5.5" fill="#EB001B" stroke="#EB001B" stroke-width="0.7"/>
                            <path d="M5.87413 3.52832L5.97439 7.57216H7.02713L7.12739 3.52832H5.87413ZM6.50076 9.66091C6.88091 9.66091 7.18169 9.37267 7.18169 9.00504C7.18169 8.63742 6.88091 8.34917 6.50076 8.34917C6.12061 8.34917 5.81982 8.63742 5.81982 9.00504C5.81982 9.37267 6.12061 9.66091 6.50076 9.66091Z" fill="white"/>
                            <path d="M5.87413 3.17832H5.51535L5.52424 3.537L5.6245 7.58083L5.63296 7.92216H5.97439H7.02713H7.36856L7.37702 7.58083L7.47728 3.537L7.48617 3.17832H7.12739H5.87413ZM6.50076 10.0109C7.06121 10.0109 7.5317 9.57872 7.5317 9.00504C7.5317 8.43137 7.06121 7.99918 6.50076 7.99918C5.94031 7.99918 5.46982 8.43137 5.46982 9.00504C5.46982 9.57872 5.94031 10.0109 6.50076 10.0109Z" fill="white" stroke="#EB001B" stroke-width="0.7">
                          </svg>
                        </div>
                      </quantity-popover>
                    </td>

                    <td class="cart-item__totals right small-hide">
                      {%- render 'loading-spinner' -%}
                      <div class="cart-item__price-wrapper">
                        {%- if item.original_line_price != item.final_line_price -%}
                          <dl class="cart-item__discounted-prices">
                            <dt class="visually-hidden">
                              {{ 'products.product.price.regular_price' | t }}
                            </dt>
                            <dd>
                              <s class="cart-item__old-price price price--end">
                                {{ item.original_line_price | money }}
                              </s>
                            </dd>
                            <dt class="visually-hidden">
                              {{ 'products.product.price.sale_price' | t }}
                            </dt>
                            <dd class="price price--end">
                              {{ item.final_line_price | money }}
                            </dd>
                          </dl>
                        {%- else -%}
                          <span class="price price--end">
                            {{ item.original_line_price | money }}
                          </span>
                        {%- endif -%}

                        {%- if item.variant.available and item.unit_price_measurement -%}
                          <div class="unit-price caption">
                            <span class="visually-hidden">{{ 'products.product.price.unit_price' | t }}</span>
                            {{ item.unit_price | money }}
                            <span aria-hidden="true">/</span>
                            <span class="visually-hidden"
                              >&nbsp;{{ 'accessibility.unit_price_separator' | t }}&nbsp;</span
                            >
                            {%- if item.unit_price_measurement.reference_value != 1 -%}
                              {{- item.unit_price_measurement.reference_value -}}
                            {%- endif -%}
                            {{ item.unit_price_measurement.reference_unit }}
                          </div>
                        {%- endif -%}
                      </div>
                    </td>
                  </tr>

                  {%  comment %} Pixfizz Code Start {% endcomment %}
                  {%- if item.properties._pixfizz_project_id -%}
                    {%- comment %} Check for any addon items belonging to this Pixfizz orderline {% endcomment -%}
                    {%- for addon_item in cart.items -%}
                      {%- if addon_item.properties._pixfizz_addon == item.properties._pixfizz_project_id -%}
                        <tr class="cart-item">
                          <td class="cart-item__media"></td>
                          <td class="cart-item__details">
                            <a class="cart-item__name h4 break">
                              {{ addon_item.product.title | escape }}
                            </a>
                            <div class="product-option">
                              {{ addon_item.final_price | money }}
                            </div>
                            {%- if addon_item.product.has_only_default_variant == false -%}
                              <dl>
                                {%- for option in addon_item.options_with_values -%}
                                  <div class="product-option">
                                    <dt>{{ option.name }}: </dt>
                                    <dd>{{ option.value }}</dd>
                                  </div>
                                {%- endfor -%}
                              </dl>
                            {%- endif -%}
                          </td>
                          <td class="cart-item__totals right medium-hide large-up-hide">
                            {{ addon_item.final_line_price | money }}
                          </td>
                          <td class="cart-item__quantity">
                            {{ addon_item.quantity }}
                          </td>
                          <td class="cart-item__totals right small-hide">
                            <div class="cart-item__price-wrapper">
                              {{ addon_item.final_line_price | money }}
                            </div>
                          </td>
                        </tr>
                      {%- endif -%}
                    {%- endfor -%}
                  {%- endif -%}
                  {%  comment %} Pixfizz Code End {% endcomment %}
                  
                {%- endfor -%}
              </tbody>
            </table>
          {%- endif -%}
        </div>
      </div>

      <p class="visually-hidden" id="cart-live-region-text" aria-live="polite" role="status"></p>
      <p
        class="visually-hidden"
        id="shopping-cart-line-item-status"
        aria-live="polite"
        aria-hidden="true"
        role="status"
      >
        {{ 'accessibility.loading' | t }}
      </p>
    </form>
  </div>
</cart-items>

{% schema %}
{
  "name": "t:sections.main-cart-items.name",
  "settings": [
    {
      "type": "color_scheme",
      "id": "color_scheme",
      "label": "t:sections.all.colors.label",
      "default": "scheme-1"
    },
    {
      "type": "header",
      "content": "t:sections.all.padding.section_padding_heading"
    },
    {
      "type": "range",
      "id": "padding_top",
      "min": 0,
      "max": 100,
      "step": 4,
      "unit": "px",
      "label": "t:sections.all.padding.padding_top",
      "default": 36
    },
    {
      "type": "range",
      "id": "padding_bottom",
      "min": 0,
      "max": 100,
      "step": 4,
      "unit": "px",
      "label": "t:sections.all.padding.padding_bottom",
      "default": 36
    }
  ]
}
{% endschema %}

Dawn Version 11.0.0

{{ 'component-cart.css' | asset_url | stylesheet_tag }}
{{ 'component-cart-items.css' | asset_url | stylesheet_tag }}
{{ 'component-totals.css' | asset_url | stylesheet_tag }}
{{ 'component-price.css' | asset_url | stylesheet_tag }}
{{ 'component-discounts.css' | asset_url | stylesheet_tag }}
{{ 'component-loading-overlay.css' | asset_url | stylesheet_tag }}
{{ 'quantity-popover.css' | asset_url | stylesheet_tag }}

{%- style -%}
  .section-{{ section.id }}-padding {
    padding-top: {{ section.settings.padding_top | times: 0.75 | round: 0 }}px;
    padding-bottom: {{ section.settings.padding_bottom | times: 0.75 | round: 0 }}px;
  }

  @media screen and (min-width: 750px) {
    .section-{{ section.id }}-padding {
      padding-top: {{ section.settings.padding_top }}px;
      padding-bottom: {{ section.settings.padding_bottom }}px;
    }
  }
{%- endstyle -%}

{%- unless settings.cart_type == 'drawer' -%}
  <script src="{{ 'cart.js' | asset_url }}" defer="defer"></script>
{%- endunless -%}

<script src="{{ 'quantity-popover.js' | asset_url }}" defer="defer"></script>

<cart-items class="page-width{% if cart == empty %} is-empty{% else %} section-{{ section.id }}-padding{% endif %}">
  <div class="title-wrapper-with-link">
    <h1 class="title title--primary">{{ 'sections.cart.title' | t }}</h1>
    <a href="{{ routes.all_products_collection_url }}" class="underlined-link">{{ 'general.continue_shopping' | t }}</a>
  </div>

  <div class="cart__warnings">
    <h1 class="cart__empty-text">{{ 'sections.cart.empty' | t }}</h1>
    <a href="{{ routes.all_products_collection_url }}" class="button">
      {{ 'general.continue_shopping' | t }}
    </a>

    {%- if shop.customer_accounts_enabled and customer == null -%}
      <h2 class="cart__login-title">{{ 'sections.cart.login.title' | t }}</h2>
      <p class="cart__login-paragraph">
        {{ 'sections.cart.login.paragraph_html' | t: link: routes.account_login_url }}
      </p>
    {%- endif -%}
  </div>

  <form action="{{ routes.cart_url }}" class="cart__contents critical-hidden" method="post" id="cart">
    <div class="cart__items" id="main-cart-items" data-id="{{ section.id }}">
      <div class="js-contents">
        {%- if cart != empty -%}
          <table class="cart-items">
            <caption class="visually-hidden">
              {{ 'sections.cart.title' | t }}
            </caption>
            <thead>
              <tr>
                <th class="caption-with-letter-spacing" colspan="2" scope="col">
                  {{ 'sections.cart.headings.product' | t }}
                </th>
                <th class="medium-hide large-up-hide right caption-with-letter-spacing" colspan="1" scope="col">
                  {{ 'sections.cart.headings.total' | t }}
                </th>
                <th
                  class="cart-items__heading--wide cart-items__heading--quantity small-hide caption-with-letter-spacing"
                  colspan="1"
                  scope="col"
                >
                  {{ 'sections.cart.headings.quantity' | t }}
                </th>
                <th class="small-hide right caption-with-letter-spacing" colspan="1" scope="col">
                  {{ 'sections.cart.headings.total' | t }}
                </th>
              </tr>
            </thead>

            <tbody>
              {%- for item in cart.items -%}
                
              {%  comment %} Pixfizz Code Start {% endcomment %}
              {%- if item.properties._pixfizz_addon -%}
                {% continue %}
              {%- endif %}
              {%  comment %} Pixfizz Code End {% endcomment %}  
              
                <tr class="cart-item" id="CartItem-{{ item.index | plus: 1 }}">                  
                  <td class="cart-item__media">
                    {% if item.image %}
                      {% comment %} Leave empty space due to a:empty CSS display: none rule {% endcomment %}
                      <a href="{{ item.url }}" class="cart-item__link" aria-hidden="true" tabindex="-1" 
                      
                      {%  comment %} Pixfizz Code Start {% endcomment %}
                       style="z-index:1;"
                      {%- if item.properties._pixfizz_project_id and item.product.metafields.pixfizz.integration_type != 'options-to-cart' -%}
                        onclick="{% render 'pixfizz-edit-orderline-handler', item: item %}"
                      {%- endif -%}
                     {%  comment %} Pixfizz Code End {% endcomment %}
                      
                     > </a>
                      <div class="cart-item__image-container gradient global-media-settings">
                        <img
                          src="{{ item.image | image_url: width: 300 }}"
                          class="cart-item__image"
                          alt="{{ item.image.alt | escape }}"
                          loading="lazy"
                          width="150"
                          height="{{ 150 | divided_by: item.image.aspect_ratio | ceil }}"
                        >
                      
                        {%  comment %} Pixfizz Code Start {% endcomment %}
                        {% render 'pixfizz-orderline-preview-handler', item: item, width: 300 %}
                        {%  comment %} Pixfizz Code End {% endcomment %}
                      
                      </div>
                    {% endif %}
                  </td>

                  <td class="cart-item__details">
                    {%- if settings.show_vendor -%}
                      <p class="caption-with-letter-spacing">{{ item.product.vendor }}</p>
                    {%- endif -%}

                    <a href="{{ item.url }}" class="cart-item__name h4 break">{{ item.product.title | escape }}</a>

                    {%- if item.original_price != item.final_price -%}
                      <div class="cart-item__discounted-prices">
                        <span class="visually-hidden">
                          {{ 'products.product.price.regular_price' | t }}
                        </span>
                        <s class="cart-item__old-price product-option">
                          {{- item.original_price | money -}}
                        </s>
                        <span class="visually-hidden">
                          {{ 'products.product.price.sale_price' | t }}
                        </span>
                        <strong class="cart-item__final-price product-option">
                          {{ item.final_price | money }}
                        </strong>
                      </div>
                    {%- else -%}
                      <div class="product-option">
                        {{ item.original_price | money }}
                      </div>
                    {%- endif -%}

                    {%- if item.product.has_only_default_variant == false
                      or item.properties.size != 0
                      or item.selling_plan_allocation != null
                    -%}
                      <dl>
                        {%- if item.product.has_only_default_variant == false -%}
                          {%- for option in item.options_with_values -%}
                            <div class="product-option">
                              <dt>{{ option.name }}:</dt>
                              <dd>{{ option.value }}</dd>
                            </div>
                          {%- endfor -%}
                        {%- endif -%}

                        {%- for property in item.properties -%}
                          {%- assign property_first_char = property.first | slice: 0 -%}
                          {%- if property.last != blank and property_first_char != '_' -%}
                            <div class="product-option">
                              <dt>{{ property.first }}:</dt>
                              <dd>
                                {%- if property.last contains '/uploads/' -%}
                                  <a href="{{ property.last }}" class="link" target="_blank">
                                    {{ property.last | split: '/' | last }}
                                  </a>
                                {%- else -%}
                                  {{ property.last }}
                                {%- endif -%}
                              </dd>
                            </div>
                          {%- endif -%}
                        {%- endfor -%}
                      </dl>

                      <p class="product-option">{{ item.selling_plan_allocation.selling_plan.name }}</p>
                    {%- endif -%}

                    <ul class="discounts list-unstyled" role="list" aria-label="{{ 'customer.order.discount' | t }}">
                      {%- for discount in item.line_level_discount_allocations -%}
                        <li class="discounts__discount">
                          {%- render 'icon-discount' -%}
                          {{ discount.discount_application.title }}
                        </li>
                      {%- endfor -%}
                    </ul>
                  </td>

                  <td class="cart-item__totals right medium-hide large-up-hide">
                    <div class="loading-overlay hidden">
                      <div class="loading-overlay__spinner">
                        <svg
                          aria-hidden="true"
                          focusable="false"
                          class="spinner"
                          viewBox="0 0 66 66"
                          xmlns="http://www.w3.org/2000/svg"
                        >
                          <circle class="path" fill="none" stroke-width="6" cx="33" cy="33" r="30"></circle>
                        </svg>
                      </div>
                    </div>
                    <div class="cart-item__price-wrapper">
                      {%- if item.original_line_price != item.final_line_price -%}
                        <dl class="cart-item__discounted-prices">
                          <dt class="visually-hidden">
                            {{ 'products.product.price.regular_price' | t }}
                          </dt>
                          <dd>
                            <s class="cart-item__old-price price price--end">
                              {{ item.original_line_price | money }}
                            </s>
                          </dd>
                          <dt class="visually-hidden">
                            {{ 'products.product.price.sale_price' | t }}
                          </dt>
                          <dd class="price price--end">
                            {{ item.final_line_price | money }}
                          </dd>
                        </dl>
                      {%- else -%}
                        <span class="price price--end">
                          {{ item.original_line_price | money }}
                        </span>
                      {%- endif -%}

                      {%- if item.variant.available and item.unit_price_measurement -%}
                        <div class="unit-price caption">
                          <span class="visually-hidden">{{ 'products.product.price.unit_price' | t }}</span>
                          {{ item.unit_price | money }}
                          <span aria-hidden="true">/</span>
                          <span class="visually-hidden"
                            >&nbsp;{{ 'accessibility.unit_price_separator' | t }}&nbsp;</span
                          >
                          {%- if item.unit_price_measurement.reference_value != 1 -%}
                            {{- item.unit_price_measurement.reference_value -}}
                          {%- endif -%}
                          {{ item.unit_price_measurement.reference_unit }}
                        </div>
                      {%- endif -%}
                    </div>
                  </td>
                  {%- liquid
                    assign has_qty_rules = false
                    if item.variant.quantity_rule.increment > 1 or item.variant.quantity_rule.min > 1 or item.variant.quantity_rule.max != null
                      assign has_qty_rules = true
                    endif

                    assign has_vol_pricing = false
                    if item.variant.quantity_price_breaks.size > 0
                      assign has_vol_pricing = true
                    endif
                  -%}
                  <td class="cart-item__quantity{% if has_qty_rules or has_vol_pricing %} cart-item__quantity--info{% endif %}">
                    <quantity-popover>
                      <div class="cart-item__quantity-wrapper quantity-popover-wrapper">
                        <label class="visually-hidden" for="Quantity-{{ item.index | plus: 1 }}">
                          {{ 'products.product.quantity.label' | t }}
                        </label>
                        <div class="quantity-popover-container{% if has_qty_rules or has_vol_pricing %} quantity-popover-container--hover{% endif %}">
                          {%- if has_qty_rules or has_vol_pricing -%}
                            <button
                              type="button"
                              aria-expanded="false"
                              class="quantity-popover__info-button quantity-popover__info-button--icon-only button button--tertiary small-hide no-js-hidden"
                            >
                              {% render 'icon-info' %}
                            </button>
                          {%- endif -%}
                          {%- if item.product.type == 'Photo Prints' -%}
                            <span>{{ item.quantity }} prints</span>
                          {%- else -%}
                            <quantity-input class="quantity cart-quantity">
                              <button class="quantity__button no-js-hidden" name="minus" type="button">
                                <span class="visually-hidden">
                                  {{- 'products.product.quantity.decrease' | t: product: item.product.title | escape -}}
                                </span>
                                {% render 'icon-minus' %}
                              </button>
                              <input
                                class="quantity__input"
                                data-quantity-variant-id="{{ item.variant.id }}"
                                type="number"
                                name="updates[]"
                                value="{{ item.quantity }}"
                                {% # theme-check-disable %}
                                data-cart-quantity="{{ cart | item_count_for_variant: item.variant.id }}"
                                min="{{ item.variant.quantity_rule.min }}"
                                {% if item.variant.quantity_rule.max != null %}
                                  max="{{ item.variant.quantity_rule.max }}"
                                {% endif %}
                                step="{{ item.variant.quantity_rule.increment }}"
                                {% # theme-check-enable %}
                                aria-label="{{ 'products.product.quantity.input_label' | t: product: item.product.title | escape }}"
                                id="Quantity-{{ item.index | plus: 1 }}"
                                data-index="{{ item.index | plus: 1 }}"
                                {%  comment %} Pixfizz Code Start {% endcomment %}
                                onchange="{% render 'pixfizz-orderline-quantity-handler', item: item, cart: cart %}"
                                onkeydown="if(event.keyCode===13)event.preventDefault()"
                                {%  comment %} Pixfizz Code End {% endcomment %}
                              >
                              <button class="quantity__button no-js-hidden" name="plus" type="button">
                                <span class="visually-hidden">
                                  {{- 'products.product.quantity.increase' | t: product: item.product.title | escape -}}
                                </span>
                                {% render 'icon-plus' %}
                              </button>
                            </quantity-input>
                          {%- endif -%}
                        </div>
                        <cart-remove-button
                          id="Remove-{{ item.index | plus: 1 }}"
                          data-index="{{ item.index | plus: 1 }}"
                        >
                          <a
                            href="{{ item.url_to_remove }}"
                            class="button button--tertiary"
                            aria-label="{{ 'sections.cart.remove_title' | t: title: item.title }}"
                            {%  comment %} Pixfizz Code Start {% endcomment %}
                            onclick="{% render 'pixfizz-orderline-quantity-handler', item: item, cart: cart, delete_item: true %}"
                            {%  comment %} Pixfizz Code End {% endcomment %}
                          >
                            {% render 'icon-remove' %}
                          </a>
                        </cart-remove-button>
                      </div>
                      {%- if has_qty_rules or has_vol_pricing -%}
                        <button
                          type="button"
                          class="quantity-popover__info-button quantity-popover__info-button--icon-with-label button button--tertiary medium-hide large-up-hide"
                          aria-expanded="false"
                        >
                          {% render 'icon-info' %}
                          <span>
                            {%- if has_vol_pricing -%}
                              {{ 'products.product.volume_pricing.note' | t }}
                            {%- elsif has_qty_rules -%}
                              {{ 'products.product.quantity.note' | t }}
                            {%- endif -%}
                          </span>
                        </button>
                      {%- endif -%}
                      {%- if has_vol_pricing or has_qty_rules -%}
                        <div
                          class="cart-items__info global-settings-popup quantity-popover__info"
                          tabindex="-1"
                          hidden
                        >
                          {%- if has_qty_rules == false -%}
                            <span class="volume-pricing-label caption">
                              {{- 'products.product.volume_pricing.title' | t -}}
                            </span>
                          {%- endif -%}
                          <div class="quantity__rules caption no-js-hidden">
                            {%- if item.variant.quantity_rule.increment > 1 -%}
                              <span class="divider">
                                {{-
                                  'products.product.quantity.multiples_of'
                                  | t: quantity: item.variant.quantity_rule.increment
                                -}}
                              </span>
                            {%- endif -%}
                            {%- if item.variant.quantity_rule.min > 1 -%}
                              <span class="divider">
                                {{-
                                  'products.product.quantity.minimum_of'
                                  | t: quantity: item.variant.quantity_rule.min
                                -}}
                              </span>
                            {%- endif -%}
                            {%- if item.variant.quantity_rule.max != null -%}
                              <span class="divider">
                                {{-
                                  'products.product.quantity.maximum_of'
                                  | t: quantity: item.variant.quantity_rule.max
                                -}}
                              </span>
                            {%- endif -%}
                          </div>
                          <button
                            class="button-close button button--tertiary medium-hide large-up-hide"
                            type="button"
                            aria-label="{{ 'accessibility.close' | t }}"
                          >
                            {%- render 'icon-close' -%}
                          </button>
                          {%- if item.variant.quantity_price_breaks.size > 0 -%}
                            <volume-pricing class="parent-display">
                              <ul class="list-unstyled">
                                <li>
                                  <span>{{ item.variant.quantity_rule.min }}+</span>
                                  {%- assign price = item.variant.price | money_with_currency -%}
                                  <span> {{ 'sections.quick_order_list.each' | t: money: price }}</span>
                                </li>
                                {%- for price_break in item.variant.quantity_price_breaks -%}
                                  <li>
                                    <span>
                                      {{- price_break.minimum_quantity -}}
                                      <span aria-hidden="true">+</span></span
                                    >
                                    {%- assign price = price_break.price | money_with_currency -%}
                                    <span> {{ 'sections.quick_order_list.each' | t: money: price }}</span>
                                  </li>
                                {%- endfor -%}
                              </ul>
                            </volume-pricing>
                          {%- endif -%}
                        </div>
                      {%- endif -%}
                      <div class="cart-item__error" id="Line-item-error-{{ item.index | plus: 1 }}" role="alert">
                        <small class="cart-item__error-text"></small>
                        <svg
                          aria-hidden="true"
                          focusable="false"
                          class="icon icon-error"
                          viewBox="0 0 13 13"
                        >
                          <circle cx="6.5" cy="6.50049" r="5.5" stroke="white" stroke-width="2"/>
                          <circle cx="6.5" cy="6.5" r="5.5" fill="#EB001B" stroke="#EB001B" stroke-width="0.7"/>
                          <path d="M5.87413 3.52832L5.97439 7.57216H7.02713L7.12739 3.52832H5.87413ZM6.50076 9.66091C6.88091 9.66091 7.18169 9.37267 7.18169 9.00504C7.18169 8.63742 6.88091 8.34917 6.50076 8.34917C6.12061 8.34917 5.81982 8.63742 5.81982 9.00504C5.81982 9.37267 6.12061 9.66091 6.50076 9.66091Z" fill="white"/>
                          <path d="M5.87413 3.17832H5.51535L5.52424 3.537L5.6245 7.58083L5.63296 7.92216H5.97439H7.02713H7.36856L7.37702 7.58083L7.47728 3.537L7.48617 3.17832H7.12739H5.87413ZM6.50076 10.0109C7.06121 10.0109 7.5317 9.57872 7.5317 9.00504C7.5317 8.43137 7.06121 7.99918 6.50076 7.99918C5.94031 7.99918 5.46982 8.43137 5.46982 9.00504C5.46982 9.57872 5.94031 10.0109 6.50076 10.0109Z" fill="white" stroke="#EB001B" stroke-width="0.7">
                        </svg>
                      </div>
                    </quantity-popover>
                  </td>

                  <td class="cart-item__totals right small-hide">
                    <div class="loading-overlay hidden">
                      <div class="loading-overlay__spinner">
                        <svg
                          aria-hidden="true"
                          focusable="false"
                          class="spinner"
                          viewBox="0 0 66 66"
                          xmlns="http://www.w3.org/2000/svg"
                        >
                          <circle class="path" fill="none" stroke-width="6" cx="33" cy="33" r="30"></circle>
                        </svg>
                      </div>
                    </div>

                    <div class="cart-item__price-wrapper">
                      {%- if item.original_line_price != item.final_line_price -%}
                        <dl class="cart-item__discounted-prices">
                          <dt class="visually-hidden">
                            {{ 'products.product.price.regular_price' | t }}
                          </dt>
                          <dd>
                            <s class="cart-item__old-price price price--end">
                              {{ item.original_line_price | money }}
                            </s>
                          </dd>
                          <dt class="visually-hidden">
                            {{ 'products.product.price.sale_price' | t }}
                          </dt>
                          <dd class="price price--end">
                            {{ item.final_line_price | money }}
                          </dd>
                        </dl>
                      {%- else -%}
                        <span class="price price--end">
                          {{ item.original_line_price | money }}
                        </span>
                      {%- endif -%}

                      {%- if item.variant.available and item.unit_price_measurement -%}
                        <div class="unit-price caption">
                          <span class="visually-hidden">{{ 'products.product.price.unit_price' | t }}</span>
                          {{ item.unit_price | money }}
                          <span aria-hidden="true">/</span>
                          <span class="visually-hidden"
                            >&nbsp;{{ 'accessibility.unit_price_separator' | t }}&nbsp;</span
                          >
                          {%- if item.unit_price_measurement.reference_value != 1 -%}
                            {{- item.unit_price_measurement.reference_value -}}
                          {%- endif -%}
                          {{ item.unit_price_measurement.reference_unit }}
                        </div>
                      {%- endif -%}
                    </div>
                  </td>
                </tr>

                {%  comment %} Pixfizz Code Start {% endcomment %}
                {%- if item.properties._pixfizz_project_id -%}
                  {%- comment %} Check for any addon items belonging to this Pixfizz orderline {% endcomment -%}
                  {%- for addon_item in cart.items -%}
                    {%- if addon_item.properties._pixfizz_addon == item.properties._pixfizz_project_id -%}
                      <tr class="cart-item">
                        <td class="cart-item__media"></td>
                        <td class="cart-item__details">
                          <a class="cart-item__name h4 break">
                            {{ addon_item.product.title | escape }}
                          </a>
                          <div class="product-option">
                            {{ addon_item.final_price | money }}
                          </div>
                          {%- if addon_item.product.has_only_default_variant == false -%}
                            <dl>
                              {%- for option in addon_item.options_with_values -%}
                                <div class="product-option">
                                  <dt>{{ option.name }}: </dt>
                                  <dd>{{ option.value }}</dd>
                                </div>
                              {%- endfor -%}
                            </dl>
                          {%- endif -%}
                        </td>
                        <td class="cart-item__totals right medium-hide large-up-hide">
                          {{ addon_item.final_line_price | money }}
                        </td>
                        <td class="cart-item__quantity">
                          {{ addon_item.quantity }}
                        </td>
                        <td class="cart-item__totals right small-hide">
                          <div class="cart-item__price-wrapper">
                            {{ addon_item.final_line_price | money }}
                          </div>
                        </td>
                      </tr>
                    {%- endif -%}
                  {%- endfor -%}
                {%- endif -%}
                {%  comment %} Pixfizz Code End {% endcomment %}
                            
              {%- endfor -%}
            </tbody>
          </table>
        {%- endif -%}
      </div>
    </div>

    <p class="visually-hidden" id="cart-live-region-text" aria-live="polite" role="status"></p>
    <p class="visually-hidden" id="shopping-cart-line-item-status" aria-live="polite" aria-hidden="true" role="status">
      {{ 'accessibility.loading' | t }}
    </p>
  </form>
</cart-items>

{% schema %}
{
  "name": "t:sections.main-cart-items.name",
  "settings": [
    {
      "type": "header",
      "content": "t:sections.all.padding.section_padding_heading"
    },
    {
      "type": "range",
      "id": "padding_top",
      "min": 0,
      "max": 100,
      "step": 4,
      "unit": "px",
      "label": "t:sections.all.padding.padding_top",
      "default": 36
    },
    {
      "type": "range",
      "id": "padding_bottom",
      "min": 0,
      "max": 100,
      "step": 4,
      "unit": "px",
      "label": "t:sections.all.padding.padding_bottom",
      "default": 36
    }
  ]
}
{% endschema %}

Other Themes:

If you want to allow users to edit projects from the cart and/or show dynamic project previews instead of static product images, you will need to make some modifications to your cart page.

Order Edit

Locate the template that’s responsible for rendering the items in your cart page. If using the Dawn theme, you can find the code in the the main-cart-items.liquid section.

Locate the part of the template that loops through the items in the cart and renders line items. Decide where you want to put the edit link and add an edit link or button with an onclick handler that renders the snippet above, taking the line item object as a parameter. Example:

{%- if item.properties._pixfizz_project_id and item.product.metafields.pixfizz.integration_type != 'options-to-cart' -%}
  <a onclick="{% render 'pixfizz-edit-orderline-handler', item: item %}">
    edit project
  </a>
{%- endif -%}

Note that we wrap the link in an if item.properties._pixfizz_project_id so that the link doesn’t get rendered for any non-pixfizz products in the cart. Instead of an <a> element you could use a <button> or whatever else looks good in your theme. The only important part is the onclick handler.

Orderline Image

Locate the part of the template that displays the image for each item in the cart. Place the following code right after the <img> element that renders the preview. It is safe to include this even for non-pixfizz products, since the code will not do anything if the line item doesn’t have an associated pixfizz project id:

{% render 'pixfizz-orderline-preview-handler', item: item, width: 300 %}

You can replace 300 with your desired value for width . You can also use height instead (or in addition to) width.

Cut Prints

Pixfizz cut print mode is supported in Shopify, but quantities with cut prints work differently from other products.

The cut print product in Shopify should be set up with a price for a single print. The pixfizz integration will automatically set the orderline quantity to the total number of prints in the project when the user adds the prints to the cart.

That means that you will have to modify your Shopify template code to disable any quantity controls controls in Shopify (the quantity selection on the product page, orderline quantity selector on the cart page, …) in Shopify for cut print products.

There are several ways to do that and the location of the templates that need to be modified depends on the Shopify theme that you’re using. In our demo Shopify store, we set the “Product Type” field on cut print products to “Photo Prints” and we toggle the quantity selector in liquid templates based on that value. In the main-product.liquid template we wrapped the section under <div data-gb-custom-block data-tag="-" data-0='``quantity-selector'></div> into <div data-gb-custom-block data-tag="-" data-0='``Photo Prints``' data-1='``Photo Prints``'></div> ... <div data-gb-custom-block data-tag="-"></div> and on the main-cart-items.liquid template we located the <quantity-input> element and added it into and if/else block like this:

{%- if item.product.type == 'Photo Prints' -%}
  <span>{{ item.quantity }} prints</span>
{%- else -%}
  <quantity-input> ... </quantity-input>
{%- endif -%}

Setup Fulfillment Webhook

Whenever an order is placed on shopify (payment success) then that order need to be updated on Pixfizz.

First you need to create a Shopify webhook.

Go to ‘Settings > Notifications’ and scroll down to ‘create webhook’ button and click on it to create new webhook.

After clicking on create webhook, you will get a popup similar to the above image. Add the webhook detail and save. ‘Event’ select ‘Order payment’ ‘Format’ select ‘JSON’ ‘URL’ add an order endpoint as shown above screenshot, except use your Pixfizz store url.

https://yourstore.pixfizz.com/custom/shopify/create_order

Select ‘Webhook API version’ use ‘2022-04 (Latest)’ or use the (Latest webook)

Copy the webhook signed id (shown under the callback URL once you have created in the website superadmin shopify signing secret (see websites).

Once above configuration is done then you can place a successful order and mark that as paid in shopify. In the Pixfizz admin order section the order status will be changed to “Confirmed” status.

To enable Fulfilled orders to be marked automatically in pixfizz (with a status of "Shipped") then add a webhook as per order webhook above but using the event in Shopify "Fulfiliment Creation"

https://yourstore.pixfizz.com/custom/shopify/update_order?order[status]=S

Orders marked as Fullfilled in Shopify will be marked as shipped in Pixfizz

🛠️
Product Metafields
Variant Metafields
Storefront's Superadmin panel to copy & paste from Shopify.