Shopify: Dawn – Two Column Cart

Posted on August 4, 2022 by jamie

By default dawn doesn’t have a single cart section only main-cart-items.liquid and main-footer.liquid.

To use a cart template add sections/main-cart.liquid and merge the contents from main-cart-items.liquid and main-footer.liquid they is a raw merge with a small wrapping div chnages, the below code is from Dawn Versio 6.0.2

After the fiels have been merge you will need to update cart.json to use the main-cart.liquid section, example below.


{{ '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 }}


{%- 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 -%}


<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="flex space-x-10">

    <cart-items class="item w-2/3 bg-blue{% if cart == empty %} is-empty{% else %} section-{{ section.id }}-padding{% endif %}">

    <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 == nil -%}
        <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 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 -%}
                    <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"> </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 }}"
                            >
                            </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 != nil -%}
                        <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.discounts -%}
                            <li class="discounts__discount">
                            {%- render 'icon-discount' -%}
                            {{ discount.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" role="presentation" 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.variant.unit_price | money }}
                            <span aria-hidden="true">/</span>
                            <span class="visually-hidden">&nbsp;{{ 'accessibility.unit_price_separator' | t }}&nbsp;</span>
                            {%- if item.variant.unit_price_measurement.reference_value != 1 -%}
                                {{- item.variant.unit_price_measurement.reference_value -}}
                            {%- endif -%}
                            {{ item.variant.unit_price_measurement.reference_unit }}
                            </div>
                        {%- endif -%}
                        </div>
                    </td>

                    <td class="cart-item__quantity">
                        <div class="cart-item__quantity-wrapper">
                        <label class="visually-hidden" for="Quantity-{{ item.index | plus: 1 }}">
                            {{ 'products.product.quantity.label' | t }}
                        </label>
                        <quantity-input class="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"
                            type="number"
                            name="updates[]"
                            value="{{ item.quantity }}"
                            min="0"
                            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 }}"
                            >
                            <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>

                        <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 }}">
                            {% render 'icon-remove' %}
                            </a>
                        </cart-remove-button>
                        </div>
                        <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" role="presentation" 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>
                    </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" role="presentation" 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.variant.unit_price | money }}
                            <span aria-hidden="true">/</span>
                            <span class="visually-hidden">&nbsp;{{ 'accessibility.unit_price_separator' | t }}&nbsp;</span>
                            {%- if item.variant.unit_price_measurement.reference_value != 1 -%}
                                {{- item.variant.unit_price_measurement.reference_value -}}
                            {%- endif -%}
                            {{ item.variant.unit_price_measurement.reference_unit }}
                            </div>
                        {%- endif -%}
                        </div>
                    </td>
                    </tr>
                {%- 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>

    <cart-sidebar class="item w-1/3 bg-peach">
        <div class="cart__footer">
        {%- if settings.show_cart_note -%}
            <cart-note class="cart__note field">
            <label for="Cart-note">{{ 'sections.cart.note' | t }}</label>
            <textarea class="text-area field__input" name="note" form="cart" id="Cart-note" placeholder="{{ 'sections.cart.note' | t }}">{{ cart.note }}</textarea>
            </cart-note>
        {%- endif -%}

        <div class="cart__blocks">
            {% for block in section.blocks %}
            {%- case block.type -%}
                {%- when '@app' -%}
                {% render block %}
                {%- when 'description' -%}
                    <p class="description">{{ block.settings.discount_description }}</p>
                {%- when 'delivery' -%}
                    <div class="delivery-wrapper">
                      <div class="delivery">
                        <p class="delivery-title">
                          {{ block.settings.delivery_title }}
                        </p>
                        <div tabindex="0" class="tooltip">
                          <div class="tooltip__text">
                            {{ block.settings.delivery_tooltip }}
                          </div>
                        </div>
                      </div>
                      <div class="delivery-text">                      
                        <span class="over {% if cart.total_price <= 5000 %} hidden {% endif %}">
                          {{ block.settings.delivery_description }}
                        </span>
                        <span class="under {% if cart.total_price >= 5000 %} hidden {% endif %}">
                          {{ block.settings.delivery_description_under }}                    
                        </span>
                      </div>
                    </div>
                {%- when 'subtotal' -%}
                <div class="js-contents" {{ block.shopify_attributes }}>
                    <div class="totals">
                    <h2 class="totals__subtotal">{{ 'sections.cart.subtotal' | t }}</h2>
                    <p class="totals__subtotal-value">{{ cart.total_price | money_with_currency }}</p>
                    </div>

                    <div>
                    {%- if cart.cart_level_discount_applications.size > 0 -%}
                        <ul class="discounts list-unstyled" role="list" aria-label="{{ 'customer.order.discount' | t }}">
                        {%- for discount in cart.cart_level_discount_applications -%}
                            <li class="discounts__discount discounts__discount--position">
                            {%- render 'icon-discount' -%}
                            {{ discount.title }}
                            (-{{ discount.total_allocated_amount | money }})
                            </li>
                        {%- endfor -%}
                        </ul>
                    {%- endif -%}
                    </div>

                    <small class="tax-note caption-large rte">
                    {%- if cart.taxes_included and shop.shipping_policy.body != blank -%}
                        {{ 'sections.cart.taxes_included_and_shipping_policy_html' | t: link: shop.shipping_policy.url }}
                    {%- elsif cart.taxes_included -%}
                        {{ 'sections.cart.taxes_included_but_shipping_at_checkout' | t }}
                    {%- elsif shop.shipping_policy.body != blank -%}
                        {{ 'sections.cart.taxes_and_shipping_policy_at_checkout_html' | t: link: shop.shipping_policy.url }}
                    {%- else -%}
                        {{ 'sections.cart.taxes_and_shipping_at_checkout' | t }}
                    {%- endif -%}
                    </small>
                </div>
                {%- else -%}
                <div class="cart__ctas" {{ block.shopify_attributes }}>
                    <noscript>
                    <button type="submit" class="cart__update-button button button--secondary" form="cart">
                        {{ 'sections.cart.update' | t }}
                    </button>
                    </noscript>

                    <button type="submit" id="checkout" class="cart__checkout-button button" name="checkout"{% if cart == empty %} disabled{% endif %} form="cart">
                    {{ 'sections.cart.checkout' | t }}
                    </button>
                </div>

                {%- if additional_checkout_buttons -%}
                    <div class="cart__dynamic-checkout-buttons additional-checkout-buttons">
                    {{ content_for_additional_checkout_buttons }}
                    </div>
                {%- endif -%}
            {%- endcase -%}
            {% endfor %}

            <div id="cart-errors"></div>
        </div>
        </div>
    </cart-sidebar>

</div>
  <script>
    document.addEventListener('DOMContentLoaded', function() {
      function isIE() {
        const ua = window.navigator.userAgent;
        const msie = ua.indexOf('MSIE ');
        const trident = ua.indexOf('Trident/');

        return (msie > 0 || trident > 0);
      }

      if (!isIE()) return;
      const cartSubmitInput = document.createElement('input');
      cartSubmitInput.setAttribute('name', 'checkout');
      cartSubmitInput.setAttribute('type', 'hidden');
      document.querySelector('#cart').appendChild(cartSubmitInput);
      document.querySelector('#checkout').addEventListener('click', function(event) {
        document.querySelector('#cart').submit();
      });
    });
  </script>

{% schema %}
{
  "name": "main-cart",
  "class": "page-width",
  "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
    }
  ],
  "blocks": [
    {
      "type": "description",
      "name": "Description",
      "limit": 1,
      "settings": [
        {
          "type": "text",
          "id": "discount_description",
          "label": "Discount description"
        }
      ]
    },
    {
      "type": "delivery",
      "name": "Delivery",
      "limit": 1,
      "settings": [
        {
          "type": "text",
          "id": "delivery_title",
          "label": "Delivery Title"
        },
        {
          "type": "text",
          "id": "delivery_description",
          "label": "Delivery Description"
        },
        {
          "type": "text",
          "id": "delivery_description_under",
          "label": "Delivery Description line 2"
        },
        {
          "type": "richtext",
          "id": "delivery_tooltip",
          "label": "Delivery tooltip text"
        }
      ]
    },
    {
      "type": "subtotal",
      "name": "Subtotal Price",
      "limit": 1
    },
    {
      "type": "buttons",
      "name": "Checkout Button",
      "limit": 1
    },
    {
      "type": "@app"
    }
  ]
}
{% endschema %}
{
  "sections": {
    "cart": {
      "type": "main-cart"
    },
    "featured-collection": {
      "type": "featured-collection",
      "settings": {
        "title": "Featured collection",
        "heading_size": "h2",
        "collection": "all",
        "products_to_show": 4,
        "columns_desktop": 4,
        "show_view_all": true,
        "color_scheme": "background-1",
        "image_ratio": "square",
        "show_secondary_image": false,
        "show_vendor": false,
        "show_rating": false,
        "columns_mobile": "2",
        "swipe_on_mobile": false,
        "padding_top": 36,
        "padding_bottom": 36
      }
    }
  },
  "order": [
    "cart",
    "featured-collection"
  ]
}