diff --git a/app/views/admin/customers/index.html.haml b/app/views/admin/customers/index.html.haml
index 2ee8bc16a3..6653b9d386 100644
--- a/app/views/admin/customers/index.html.haml
+++ b/app/views/admin/customers/index.html.haml
@@ -35,7 +35,7 @@
.row{ 'ng-if' => 'shop_id && RequestMonitor.loading' }
.sixteen.columns.alpha#loading
- %img.spinner{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
%h1
=t :loading_customers
diff --git a/app/views/admin/enterprises/_enterprise_user_index.html.haml b/app/views/admin/enterprises/_enterprise_user_index.html.haml
index eedfba8d34..b8426b104b 100644
--- a/app/views/admin/enterprises/_enterprise_user_index.html.haml
+++ b/app/views/admin/enterprises/_enterprise_user_index.html.haml
@@ -9,7 +9,7 @@
%columns-dropdown{ action: "#{controller_name}_#{action_name}" }
.row{ 'ng-if' => '!loaded' }
.sixteen.columns.alpha#loading
- %img.spinner{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
%h1= t('.loading_enterprises')
.row{ :class => "sixteen columns alpha", 'ng-show' => 'loaded && filteredEnterprises.length == 0'}
%h1#no_results= t('.no_enterprises_found')
diff --git a/app/views/admin/enterprises/form/_primary_details.html.haml b/app/views/admin/enterprises/form/_primary_details.html.haml
index a6a09106b3..5fccc81904 100644
--- a/app/views/admin/enterprises/form/_primary_details.html.haml
+++ b/app/views/admin/enterprises/form/_primary_details.html.haml
@@ -59,7 +59,8 @@
.six.columns
= f.text_field :permalink, { 'ng-model' => "Enterprise.permalink", placeholder: "eg. your-shop-name", 'ng-model-options' => "{ updateOn: 'default blur', debounce: {'default': 300, 'blur': 0} }" }
.two.columns.omega
- %img.spinner{ src: image_path("spinning-circles.svg"), width: "30px", ng: { show: "checking" } }
+ %div{ng: {show: "checking", cloak: true}, style: "width: 30px; height: 30px;"}
+ = render partial: "components/spinner"
%span{ ng: { class: 'availability.toLowerCase()', hide: "checking" } }
{{ availability }}
%i{ ng: { class: "{'icon-ok-sign': availability == 'Available', 'icon-remove-sign': availability == 'Unavailable'}" } }
diff --git a/app/views/admin/order_cycles/_loading_flash.html.haml b/app/views/admin/order_cycles/_loading_flash.html.haml
index 05aff6b748..ffd05c59b1 100644
--- a/app/views/admin/order_cycles/_loading_flash.html.haml
+++ b/app/views/admin/order_cycles/_loading_flash.html.haml
@@ -1,5 +1,5 @@
%div.sixteen.columns.alpha.omega#loading{ ng: { cloak: true, if: 'RequestMonitor.loading' } }
- %img.spinner{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
%h1{ ng: { hide: 'orderCycles.length > 0' } }
=t('.loading_order_cycles')
%h1{ ng: { show: 'orderCycles.length > 0' } }
diff --git a/app/views/admin/subscriptions/_loading_flash.html.haml b/app/views/admin/subscriptions/_loading_flash.html.haml
index ab37f06a71..130d92bb18 100644
--- a/app/views/admin/subscriptions/_loading_flash.html.haml
+++ b/app/views/admin/subscriptions/_loading_flash.html.haml
@@ -1,3 +1,3 @@
%div.sixteen.columns.alpha.omega#loading{ ng: { cloak: true, if: 'shop_id && RequestMonitor.loading' } }
- %img.spinner{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
%h1= t('.loading')
diff --git a/app/views/admin/variant_overrides/_loading_flash.html.haml b/app/views/admin/variant_overrides/_loading_flash.html.haml
index d9b2bf46bc..7832fd2160 100644
--- a/app/views/admin/variant_overrides/_loading_flash.html.haml
+++ b/app/views/admin/variant_overrides/_loading_flash.html.haml
@@ -1,3 +1,3 @@
%div.sixteen.columns.alpha.omega#loading{ ng: { cloak: true, if: 'hub_id && products.length == 0 && RequestMonitor.loading' } }
- %img.spinner{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
%h1= t('.loading_inventory')
diff --git a/app/views/components/_spinner.html.haml b/app/views/components/_spinner.html.haml
new file mode 100644
index 0000000000..8d0a371204
--- /dev/null
+++ b/app/views/components/_spinner.html.haml
@@ -0,0 +1 @@
+%img.spinner{ src: image_path("spinning-circles.svg"), style: "max-width: 100%" }
diff --git a/app/views/producers/_fat.html.haml b/app/views/producers/_fat.html.haml
index 227e5dca39..02c9bf6fef 100644
--- a/app/views/producers/_fat.html.haml
+++ b/app/views/producers/_fat.html.haml
@@ -1,7 +1,7 @@
.row.active_table_row{"ng-if" => "open()", "ng-click" => "toggle($event)", "ng-class" => "{'open' : open()}"}
.columns.small-12.fat.text-center{"ng-show" => "open() && shopfront_loading"}
%p.fullwidth
- %img.spinner.text-center{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
.columns.small-12.medium-7.large-7.fat{"ng-show" => "open() && !shopfront_loading"}
/ Will add in long description available once clean up HTML formatting producer.long_description
diff --git a/app/views/registration/steps/_logo.html.haml b/app/views/registration/steps/_logo.html.haml
index 4082defaec..06de18ff4d 100644
--- a/app/views/registration/steps/_logo.html.haml
+++ b/app/views/registration/steps/_logo.html.haml
@@ -41,6 +41,6 @@
.message{ ng: { hide: "imageSrc() || imageUploader.isUploading" } }
= t(".logo_placeholder")
.loading{ ng: { hide: "!imageUploader.isUploading" } }
- %img.spinner{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
%br/
= t("registration.steps.images.uploading")
diff --git a/app/views/registration/steps/_promo.html.haml b/app/views/registration/steps/_promo.html.haml
index efe29f6994..3a9d94db75 100644
--- a/app/views/registration/steps/_promo.html.haml
+++ b/app/views/registration/steps/_promo.html.haml
@@ -39,6 +39,6 @@
.message{ ng: { hide: "imageSrc() || imageUploader.isUploading" } }
= t(".promo_image_placeholder")
.loading{ ng: { hide: "!imageUploader.isUploading" } }
- %img.spinner{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
%br/
= t("registration.steps.images.uploading")
diff --git a/app/views/shop/products/_form.html.haml b/app/views/shop/products/_form.html.haml
index 9506cd4bcd..00255beefc 100644
--- a/app/views/shop/products/_form.html.haml
+++ b/app/views/shop/products/_form.html.haml
@@ -21,7 +21,7 @@
= t :products_loading
.row.full
.small-12.columns.text-center
- %img.spinner{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
.hide-for-medium-down.large-1.columns
-# Space between products and filters
diff --git a/app/views/shops/_fat.html.haml b/app/views/shops/_fat.html.haml
index 289b1d3dc0..a2522271ca 100644
--- a/app/views/shops/_fat.html.haml
+++ b/app/views/shops/_fat.html.haml
@@ -1,7 +1,7 @@
.row.active_table_row{"ng-show" => "open()", "ng-click" => "toggle($event)", "ng-class" => "{'open' : open()}"}
.columns.small-12.fat.text-center{"ng-show" => "open() && shopfront_loading"}
%p.fullwidth
- %img.spinner.text-center{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
.columns.small-12.medium-6.large-5.fat{"ng-show" => "open() && !shopfront_loading"}
%div{"ng-if" => "::hub.taxons"}
diff --git a/app/views/shops/_hubs.html.haml b/app/views/shops/_hubs.html.haml
index 1d19839a03..243f2e7c63 100644
--- a/app/views/shops/_hubs.html.haml
+++ b/app/views/shops/_hubs.html.haml
@@ -26,7 +26,8 @@
%a{href: "", "ng-click" => "showDistanceMatches()"}
= t :hubs_distance_filter, location: "{{ nameMatchesFiltered[0].name }}"
.more-controls
- %img.spinner.text-center{ng: {show: "closed_shops_loading"}, src: image_path("spinning-circles.svg") }
+ %span{ng: {show: "closed_shops_loading", cloak: true}}
+ = render partial: "components/spinner"
%span{ng: {if: "!show_closed", cloak: true}}
%a.button{href: "", ng: {click: "showClosedShops()"}}
= t '.show_closed_shops'
diff --git a/app/views/spree/admin/orders/bulk_management.html.haml b/app/views/spree/admin/orders/bulk_management.html.haml
index 9949b4495c..50fff333aa 100644
--- a/app/views/spree/admin/orders/bulk_management.html.haml
+++ b/app/views/spree/admin/orders/bulk_management.html.haml
@@ -103,7 +103,7 @@
%columns-dropdown{ action: "#{controller_name}_#{action_name}" }
%div.sixteen.columns.alpha#loading{ 'ng-if' => 'RequestMonitor.loading' }
- %img.spinner{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
%h1
= t("admin.orders.bulk_management.loading")
diff --git a/app/views/spree/admin/orders/index.html.haml b/app/views/spree/admin/orders/index.html.haml
index d2871fe540..b72a0506a6 100644
--- a/app/views/spree/admin/orders/index.html.haml
+++ b/app/views/spree/admin/orders/index.html.haml
@@ -81,7 +81,8 @@
%span{'ng-bind-html' => 'order.display_total'}
%td.actions
%div.row-loading-icons
- %img.spinner{src: image_path("spinning-circles.svg"), ng: {show: 'rowStatus[order.id] == "loading"'} }
+ %span{ng: {show: 'rowStatus[order.id] == "loading"', cloak: true}}
+ = render partial: "components/spinner"
%i.success.icon-ok-sign{ng: {show: 'rowStatus[order.id] == "success"'} }
%i.error.icon-remove-sign.with-tip{ng: {show: 'rowStatus[order.id] == "error"'}, 'ofn-with-tip' => t('.order_not_updated')}
%a.icon_link.with-tip.icon-edit.no-text{'ng-href' => '{{order.edit_path}}', 'data-action' => 'edit', 'ofn-with-tip' => t('.edit')}
@@ -93,7 +94,7 @@
.orders-loading{'ng-show' => 'RequestMonitor.loading'}
.row
.small-12.columns.fullwidth.text-center
- %img.spinner{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
.row
.small-12.columns.fullwidth.text-center
%span= t('.loading')
diff --git a/app/views/spree/admin/products/index/_indicators.html.haml b/app/views/spree/admin/products/index/_indicators.html.haml
index 9c002b1f1f..ae68aa7b00 100644
--- a/app/views/spree/admin/products/index/_indicators.html.haml
+++ b/app/views/spree/admin/products/index/_indicators.html.haml
@@ -1,6 +1,6 @@
%div.sixteen.columns.alpha#loading{ 'ng-if' => 'RequestMonitor.loading' }
%br
- %img.spinner{ src: image_path("spinning-circles.svg") }
+ = render partial: "components/spinner"
%h1= t('.title')
%div.sixteen.columns.alpha{ 'ng-show' => '!RequestMonitor.loading && products.length == 0 && q.query.length == 0' }