Discuss and resolve questions on Liquid, JavaScript, themes, sales channels, and site speed enhancements.
Hello, hope everyone is keeping well.
I'm trying to add a progress bar to the blog page of my website: https://ulx1rv79plsm6f59-66498363644.shopifypreview.com (under petition, on the main menu, the first blog) password: impactful.
I'd like it to be how the progress bar is on the change.org website (https://www.change.org/p/california-state-senate-end-child-marriage-in-california).
The progress bar doesn't progress once I click the contact form submit button. Even though the counter changes every time I click submit, by the time the page reloads, the counter sets to 0. I need help to have the counter value persist even after page reloads.
I'm open to suggestions for apps as well, free or paid.
Any help will be greatly appreciated.
progress-bar.liquid:
{{ 'section-contact-form.css' | asset_url | stylesheet_tag }}
{{ 'progress-bar.js' | asset_url | script_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 -%}
<div class="contact page-width page-width--narrow section-{{ section.id }}-padding">
{%- if section.settings.heading != blank -%}
<h2 class="title title-wrapper--no-top-margin {{ section.settings.heading_size }}">{{ section.settings.heading | escape }}</h2>
{%- else -%}
<h2 class="visually-hidden">{{ 'templates.contact.form.title' | t }}</h2>
{%- endif -%}
{%- form 'contact', id: 'ContactForm', class: 'isolate' -%}
{%- if form.posted_successfully? -%}
<h2 class="form-status form-status-list form__message" tabindex="-1" autofocus>{% render 'icon-success' %} {{ 'templates.contact.form.post_success' | t }}</h2>
{%- elsif form.errors -%}
<div class="form__message">
<h2 class="form-status caption-large text-body" role="alert" tabindex="-1" autofocus>{% render 'icon-error' %} {{ 'templates.contact.form.error_heading' | t }}</h2>
</div>
<ul class="form-status-list caption-large" role="list">
<li>
<a href="#ContactForm-email" class="link">
{{ form.errors.translated_fields['email'] | capitalize }} {{ form.errors.messages['email'] }}
</a>
</li>
</ul>
{%- endif -%}
{%- for block in section.blocks -%}
{%- case block.type -%}
{%- when 'bar' -%}
<div class="progress">
<div id="download" class="progress__bar" data-total="{{ block.settings.total }}"></div>
</div>
{%- endcase -%}
{%- endfor -%}
<div class="contact__fields">
<div class="field">
<input class="field__input" autocomplete="name" type="text" id="ContactForm-name" name="contact[{{ 'templates.contact.form.name' | t }}]" value="{% if form.name %}{{ form.name }}{% elsif customer %}{{ customer.name }}{% endif %}" placeholder="{{ 'templates.contact.form.name' | t }}">
<label class="field__label" for="ContactForm-name">{{ 'templates.contact.form.name' | t }}</label>
</div>
<div class="field field--with-error">
<input
autocomplete="email"
type="email"
id="ContactForm-email"
class="field__input"
name="contact[email]"
spellcheck="false"
autocapitalize="off"
value="{% if form.email %}{{ form.email }}{% elsif customer %}{{ customer.email }}{% endif %}"
aria-required="true"
{% if form.errors contains 'email' %}
aria-invalid="true"
aria-describedby="ContactForm-email-error"
{% endif %}
placeholder="{{ 'templates.contact.form.email' | t }}"
>
<label class="field__label" for="ContactForm-email">{{ 'templates.contact.form.email' | t }} <span aria-hidden="true">*</span></label>
{%- if form.errors contains 'email' -%}
<small class="contact__field-error" id="ContactForm-email-error">
<span class="visually-hidden">{{ 'accessibility.error' | t }}</span>
<span class="form__message">{% render 'icon-error' %}{{ form.errors.translated_fields['email'] | capitalize }} {{ form.errors.messages['email'] }}</span>
</small>
{%- endif -%}
</div>
</div>
<div class="field">
<input type="tel" id="ContactForm-phone" class="field__input" autocomplete="tel" name="contact[{{ 'templates.contact.form.phone' | t }}]" pattern="[0-9\-]*" value="{% if form.phone %}{{ form.phone }}{% elsif customer %}{{ customer.phone }}{% endif %}" placeholder="{{ 'templates.contact.form.phone' | t }}">
<label class="field__label" for="ContactForm-phone">{{ 'templates.contact.form.phone' | t }}</label>
</div>
<div class="field">
<textarea
rows="10"
id="ContactForm-body"
class="text-area field__input"
name="contact[{{ 'templates.contact.form.comment' | t }}]"
placeholder="{{ 'templates.contact.form.comment' | t }}"
>
{{- form.body -}}
</textarea>
<label class="form__label field__label" for="ContactForm-body">{{ 'templates.contact.form.comment' | t }}</label>
</div>
<div class="contact__button">
<button type="submit" class="button" id="submitbutton">
{{ 'templates.contact.form.send' | t }}
</button>
</div>
{%- endform -%}
</div>
{% schema %}
{
"name": "Progress bar",
"tag": "section",
"class": "section",
"settings": [
{
"type": "text",
"id": "heading",
"default": "Contact form",
"label": "Heading"
},
{
"type": "select",
"id": "heading_size",
"options": [
{
"value": "h2",
"label": "t:sections.all.heading_size.options__1.label"
},
{
"value": "h1",
"label": "t:sections.all.heading_size.options__2.label"
},
{
"value": "h0",
"label": "t:sections.all.heading_size.options__3.label"
}
],
"default": "h1",
"label": "t:sections.all.heading_size.label"
},
{
"type": "select",
"id": "color_scheme",
"options": [
{
"value": "accent-1",
"label": "t:sections.all.colors.accent_1.label"
},
{
"value": "accent-2",
"label": "t:sections.all.colors.accent_2.label"
},
{
"value": "background-1",
"label": "t:sections.all.colors.background_1.label"
},
{
"value": "background-2",
"label": "t:sections.all.colors.background_2.label"
},
{
"value": "inverse",
"label": "t:sections.all.colors.inverse.label"
}
],
"default": "background-1",
"label": "t:sections.all.colors.label"
},
{
"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": "bar",
"name": "Progress bar",
"settings": [
{
"type": "number",
"id": "total",
"default": 500,
"label": "The total number of signatures wanted."
}
]
}
],
"presets": [
{
"name": "Progress bar"
}
]
}
{% endschema %}
progress-bar.js:
$(document).ready(function() {
let progressbar = document.getElementById("download");
var value = progressbar.getAttribute("data-total");
var count = 0;
function updateProgressBar(value) {
if (value >= 0 && value <= 100) {
progressbar.style.width = value + "%";
}
}
function handleInput() {
console.log("hello")
console.log("Total: " + value);
count++;
console.log("Count: " + count);
var num = parseInt(value);
var add = (1/num) * 100;
console.log("Current: " + add);
updateProgressBar(add);
}
document.getElementById("submitbutton").addEventListener("click", handleInput, false);
});
section-contact-form.css:
.contact img {
max-width: 100%;
}
.contact .form__message {
align-items: flex-start;
}
.contact .icon-success {
margin-top: 0.2rem;
}
.contact .field {
margin-bottom: 1.5rem;
}
@media screen and (min-width: 750px) {
.contact .field {
margin-bottom: 2rem;
}
}
.contact__button {
margin-top: 3rem;
}
@media screen and (min-width: 750px) {
.contact__button {
margin-top: 4rem;
}
}
@media screen and (min-width: 750px) {
.contact__fields {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-column-gap: 2rem;
}
}
/****************************************** PROGRESS BAR STYLING ******************************************/
.progress {
margin: 50px auto;
padding: 0px;
width: 100%;
max-width: 500px;
background: white;
border: 1px solid #000;
border-radius: 5px;
height: 10px;
overflow: hidden;
}
.progress .progress__bar {
height: 100%;
width: 0;
border-radius: 4px;
background: linear-gradient(
to right, red, orange , yellow, green, cyan, blue, violet);
transition: 0.3s;
}
Shopify and our financial partners regularly review and update verification requiremen...
By Jacqui Mar 14, 2025Unlock the potential of marketing on your business growth with Shopify Academy's late...
By Shopify Mar 12, 2025Learn how to increase conversion rates in every stage of the customer journey by enroll...
By Shopify Mar 5, 2025