wickes-css2 2.113.0-develop.11 → 2.113.0-develop.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/build/css/category-main.css +1 -1
  2. package/build/css/components/price-block-v2-critical.css +1 -1
  3. package/build/css/components/price-block-v2.css +1 -1
  4. package/build/css/main.css +1 -1
  5. package/build/css/my-account-main-v2.css +1 -1
  6. package/build/css/my-account-main.css +1 -1
  7. package/build/css/pages/page_products-list-combined.css +1 -1
  8. package/build/css/pages/page_products-list_v2.css +1 -1
  9. package/build/css/pdp-main-before-combine.css +1 -1
  10. package/build/css/pdp-main-critical.css +1 -1
  11. package/build/css/pdp-main-non-critical.css +1 -1
  12. package/build/css/pdp-main.css +1 -1
  13. package/build/css/plp-main.css +1 -1
  14. package/build/js/page/ripple/thumb-gallery.js +102 -34
  15. package/package.json +1 -1
  16. package/src/components/suite-product-card.hbs +2 -2
  17. package/src/js/page/ripple/thumb-gallery.js +102 -34
  18. package/src/page_bathroom-plp-vat.html +1 -1
  19. package/src/page_bathroom-plp-without-load-more.html +1 -1
  20. package/src/page_bathroom-plp.html +1 -1
  21. package/src/page_product-details-ripple-gallery-1-image.html +120 -0
  22. package/src/page_product-details-ripple-gallery-missing-image.html +121 -0
  23. package/src/page_product-details-ripple-gallery.html +1 -1
  24. package/src/page_product-details-suite-includes-banners.html +1 -1
  25. package/src/page_product-details-suite-includes-billie.html +1 -1
  26. package/src/page_product-details-suite-includes-klarna.html +1 -1
  27. package/src/page_product-details-suite-includes-vat.html +1 -1
  28. package/src/page_product-details-suite-includes.html +1 -1
  29. package/src/scss/common/_loading-button.scss +3 -1
  30. package/src/scss/components/_thumb-gallery-critical.scss +5 -4
  31. package/src/scss/components/_thumb-gallery.scss +9 -1
  32. package/src/scss/components/price-block-v2-critical.scss +4 -0
  33. package/src/scss/components/price-block-v2.scss +4 -0
  34. package/src/scss/pages/page_products-list-combined.scss +8 -6
  35. package/src/scss/pages/page_products-list_v2.scss +8 -6
  36. package/src/sitemap.html +2 -0
@@ -1,9 +1,6 @@
1
1
  var Wick = window.Wick || {};
2
2
 
3
3
  Wick.ThumbGallery = (function () {
4
- const BASE_URL = 'https://media.wickes.co.uk/image/upload/';
5
- const productName = window.pdpProduct && window.pdpProduct.name ? window.pdpProduct.name : '';
6
-
7
4
  const IMG_BREAKPOINTS = [
8
5
  { media: '(max-width: 576px)', w: 576, h: 324 },
9
6
  { media: '(max-width: 768px)', w: 510, h: 287 },
@@ -13,40 +10,75 @@ Wick.ThumbGallery = (function () {
13
10
  const MAIN_DEFAULT = { w: 710, h: 399 };
14
11
  const THUMB = { w: 100, h: 56 };
15
12
 
16
- function buildCloudinaryUrl(publicId, w, h) {
13
+ function getMediaDomain() {
14
+ return (typeof window !== 'undefined' && window.mediaDomain) || 'media.wickes.co.uk';
15
+ }
16
+
17
+ function getProductName() {
18
+ return (typeof window !== 'undefined' && window.pdpProduct && window.pdpProduct.name) || '';
19
+ }
20
+
21
+ function getBaseUrl(customDomain) {
22
+ const domain = customDomain || getMediaDomain();
23
+ const cleanDomain = domain.replace(/^https?:\/\//, '').replace(/\/$/, '');
24
+ return `https://${cleanDomain}/image/upload/`;
25
+ }
26
+
27
+ function buildCloudinaryUrl(publicId, w, h, baseUrl) {
28
+ const base = baseUrl || getBaseUrl();
29
+ const cleanId = String(publicId).replace(/^\/+/, '');
17
30
  const transforms = `b_rgb:FFFFFF,c_pad,dpr_1.0,f_jpg,h_${h},q_auto:good,w_${w}`;
18
- return `${BASE_URL}${transforms}/c_pad,h_${h},w_${w}/v1/${publicId}?pgw=1`;
31
+ return `${base}${transforms}/c_pad,h_${h},w_${w}/v1/${cleanId}`;
19
32
  }
20
33
 
21
34
  function parseIdentifiers(hybrisString) {
22
- return hybrisString
23
- .trim()
24
- .slice(1, hybrisString.length - 1)
35
+ if (Array.isArray(hybrisString)) {
36
+ return hybrisString.filter(Boolean);
37
+ }
38
+ if (!hybrisString || typeof hybrisString !== 'string') {
39
+ return [];
40
+ }
41
+ const trimmed = hybrisString.trim();
42
+ const content = trimmed.startsWith('[') && trimmed.endsWith(']')
43
+ ? trimmed.slice(1, -1)
44
+ : trimmed;
45
+
46
+ return content
25
47
  .split(',')
26
48
  .map((s) => s.trim())
27
49
  .filter(Boolean);
28
50
  }
29
51
 
30
- function generateMainSlideHtml(publicId) {
31
- const sources = IMG_BREAKPOINTS.map(
32
- (bp) =>
33
- `<source srcset="${buildCloudinaryUrl(publicId, bp.w, bp.h)}" media="${bp.media}">`
34
- ).join('\n ');
35
-
52
+ function renderMainSlide(src, sourcesHtml = '') {
53
+ const productName = getProductName();
36
54
  return `<div class="thumb-gallery__slide-wrapper swiper-slide">
37
55
  <picture>
38
- ${sources}
39
- <img class="swiper-slide-main" src="${buildCloudinaryUrl(publicId, MAIN_DEFAULT.w, MAIN_DEFAULT.h)}" alt="${productName}">
56
+ ${sourcesHtml}
57
+ <img class="swiper-slide-main" src="${src}" alt="${productName}">
40
58
  </picture>
41
59
  </div>`;
42
60
  }
43
61
 
44
- function generateThumbSlideHtml(publicId) {
62
+ function renderThumbSlide(src) {
63
+ const productName = getProductName();
45
64
  return `<div class="thumb-gallery__slide-wrapper swiper-slide">
46
- <img class="swiper-slide-thumbs" src="${buildCloudinaryUrl(publicId, THUMB.w, THUMB.h)}" alt="${productName}">
65
+ <img class="swiper-slide-thumbs" src="${src}" alt="${productName}">
47
66
  </div>`;
48
67
  }
49
68
 
69
+ function generateCloudinaryMainSlide(publicId, baseUrl) {
70
+ const sourcesHtml = IMG_BREAKPOINTS.map(
71
+ (bp) => `<source srcset="${buildCloudinaryUrl(publicId, bp.w, bp.h, baseUrl)}" media="${bp.media}">`
72
+ ).join('\n ');
73
+ const fallbackSrc = buildCloudinaryUrl(publicId, MAIN_DEFAULT.w, MAIN_DEFAULT.h, baseUrl);
74
+ return renderMainSlide(fallbackSrc, sourcesHtml);
75
+ }
76
+
77
+ function generateCloudinaryThumbSlide(publicId, baseUrl) {
78
+ const src = buildCloudinaryUrl(publicId, THUMB.w, THUMB.h, baseUrl);
79
+ return renderThumbSlide(src);
80
+ }
81
+
50
82
  const SELECTORS = {
51
83
  galleryCarousel: '.thumb-gallery',
52
84
  swiperContainerMain: '.swiper-container-main',
@@ -89,7 +121,11 @@ Wick.ThumbGallery = (function () {
89
121
  function handleThumbClick(swiper) {
90
122
  return function () {
91
123
  const clickedIndex = $(this).index();
92
- swiper.slideToLoop(clickedIndex);
124
+ if (swiper.params && swiper.params.loop) {
125
+ swiper.slideToLoop(clickedIndex);
126
+ } else {
127
+ swiper.slideTo(clickedIndex);
128
+ }
93
129
  };
94
130
  }
95
131
 
@@ -110,9 +146,11 @@ Wick.ThumbGallery = (function () {
110
146
  };
111
147
  }
112
148
 
113
- function getMainSwiperConfig($nextBtn, $prevBtn, thumbsSwiper, onSlideChange) {
149
+ function getMainSwiperConfig($nextBtn, $prevBtn, thumbsSwiper, onSlideChange, count) {
114
150
  return {
115
151
  ...MAIN_SWIPER_CONFIG,
152
+ loop: count > 1,
153
+ simulateTouch: count > 1,
116
154
  navigation: {
117
155
  nextEl: $nextBtn[0],
118
156
  prevEl: $prevBtn[0],
@@ -122,17 +160,44 @@ Wick.ThumbGallery = (function () {
122
160
  };
123
161
  }
124
162
 
125
- function initializeCarousel($slider, ids) {
126
- $slider.find(SELECTORS.swiperMainWrapper).html(ids.map(generateMainSlideHtml).join('\n'));
127
- $slider
128
- .find(SELECTORS.swiperThumbsWrapper)
129
- .html(ids.map(generateThumbSlideHtml).join('\n'));
163
+ function initializeCarousel($slider, ids, baseUrl, missingImage) {
164
+ const isMissing = ids.length === 0 && Boolean(missingImage);
165
+ if (ids.length === 0 && !missingImage) {
166
+ return;
167
+ }
130
168
 
131
169
  const $container = $slider.find(SELECTORS.swiperContainerMain);
170
+ const $thumbContainer = $slider.find(SELECTORS.swiperContainerThumbs);
171
+ if (!$container.length || !$thumbContainer.length) {
172
+ return;
173
+ }
174
+
175
+ if ($container[0].swiper) {
176
+ $container[0].swiper.destroy(true, true);
177
+ }
178
+ if ($thumbContainer[0].swiper) {
179
+ $thumbContainer[0].swiper.destroy(true, true);
180
+ }
181
+
182
+ const total = isMissing ? 1 : ids.length;
183
+ $slider.attr('data-length', total);
184
+
185
+ if (isMissing) {
186
+ $slider.addClass('thumb-gallery--missing-image');
187
+ $slider.find(SELECTORS.swiperMainWrapper).html(renderMainSlide(missingImage));
188
+ $slider.find(SELECTORS.swiperThumbsWrapper).html(renderThumbSlide(missingImage));
189
+ } else {
190
+ $slider.removeClass('thumb-gallery--missing-image');
191
+ $slider
192
+ .find(SELECTORS.swiperMainWrapper)
193
+ .html(ids.map((id) => generateCloudinaryMainSlide(id, baseUrl)).join('\n'));
194
+ $slider
195
+ .find(SELECTORS.swiperThumbsWrapper)
196
+ .html(ids.map((id) => generateCloudinaryThumbSlide(id, baseUrl)).join('\n'));
197
+ }
198
+
132
199
  const $nextBtn = $slider.find(SELECTORS.nextBtn);
133
200
  const $prevBtn = $slider.find(SELECTORS.prevBtn);
134
-
135
- const $thumbContainer = $slider.find(SELECTORS.swiperContainerThumbs);
136
201
  const $thumbNextBtn = $slider.find(SELECTORS.thumbNextBtn);
137
202
  const $thumbPrevBtn = $slider.find(SELECTORS.thumbPrevBtn);
138
203
 
@@ -145,22 +210,25 @@ Wick.ThumbGallery = (function () {
145
210
  $container[0],
146
211
  getMainSwiperConfig($nextBtn, $prevBtn, thumbsSwiper, () => {
147
212
  updateActiveThumbnail(swiper, thumbsSwiper);
148
- })
213
+ }, total)
149
214
  );
150
215
 
151
- $thumbContainer.on('click', SELECTORS.swiperSlide, handleThumbClick(swiper));
216
+ $thumbContainer
217
+ .off('click', SELECTORS.swiperSlide)
218
+ .on('click', SELECTORS.swiperSlide, handleThumbClick(swiper));
219
+
152
220
  updateActiveThumbnail(swiper, thumbsSwiper);
153
221
  }
154
222
 
155
- function init(hybrisString) {
223
+ function init(hybrisString, options = {}) {
156
224
  const ids = parseIdentifiers(hybrisString);
157
225
 
158
- if (ids.length < 2) {
159
- return;
160
- }
226
+ const opts = typeof options === 'string' ? { mediaDomain: options } : (options || {});
227
+ const baseUrl = getBaseUrl(opts.mediaDomain);
228
+ const missingImage = opts.missingImage || '';
161
229
 
162
230
  $(SELECTORS.galleryCarousel).each(function (_, slider) {
163
- initializeCarousel($(slider), ids);
231
+ initializeCarousel($(slider), ids, baseUrl, missingImage);
164
232
  });
165
233
  }
166
234
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wickes-css2",
3
- "version": "2.113.0-develop.11",
3
+ "version": "2.113.0-develop.12",
4
4
  "description": "CSS and JS and page templates in use by Wickes",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -16,12 +16,12 @@
16
16
  <div class="suite-product-card__price-qty">
17
17
  <div class="suite-product-card__vat including-vat">
18
18
  <span class="suite-product-card__price{{#if was_price}} suite-product-card__price--red{{/if}}">&pound;{{price-vat}}</span>
19
- <span class="suite-product-card__vat-text">Inc. VAT</span>
19
+ <span class="suite-product-card__vat-text">Inc.VAT</span>
20
20
  </div>
21
21
 
22
22
  <div class="suite-product-card__vat excluding-vat d-none">
23
23
  <span class="suite-product-card__price{{#if was_price}} suite-product-card__price--red{{/if}}">&pound;{{price}}</span>
24
- <span class="suite-product-card__vat-text">Exc. VAT</span>
24
+ <span class="suite-product-card__vat-text">Exc.VAT</span>
25
25
  </div>
26
26
 
27
27
  <span class="suite-product-card__quantity">
@@ -1,9 +1,6 @@
1
1
  var Wick = window.Wick || {};
2
2
 
3
3
  Wick.ThumbGallery = (function () {
4
- const BASE_URL = 'https://media.wickes.co.uk/image/upload/';
5
- const productName = window.pdpProduct && window.pdpProduct.name ? window.pdpProduct.name : '';
6
-
7
4
  const IMG_BREAKPOINTS = [
8
5
  { media: '(max-width: 576px)', w: 576, h: 324 },
9
6
  { media: '(max-width: 768px)', w: 510, h: 287 },
@@ -13,40 +10,75 @@ Wick.ThumbGallery = (function () {
13
10
  const MAIN_DEFAULT = { w: 710, h: 399 };
14
11
  const THUMB = { w: 100, h: 56 };
15
12
 
16
- function buildCloudinaryUrl(publicId, w, h) {
13
+ function getMediaDomain() {
14
+ return (typeof window !== 'undefined' && window.mediaDomain) || 'media.wickes.co.uk';
15
+ }
16
+
17
+ function getProductName() {
18
+ return (typeof window !== 'undefined' && window.pdpProduct && window.pdpProduct.name) || '';
19
+ }
20
+
21
+ function getBaseUrl(customDomain) {
22
+ const domain = customDomain || getMediaDomain();
23
+ const cleanDomain = domain.replace(/^https?:\/\//, '').replace(/\/$/, '');
24
+ return `https://${cleanDomain}/image/upload/`;
25
+ }
26
+
27
+ function buildCloudinaryUrl(publicId, w, h, baseUrl) {
28
+ const base = baseUrl || getBaseUrl();
29
+ const cleanId = String(publicId).replace(/^\/+/, '');
17
30
  const transforms = `b_rgb:FFFFFF,c_pad,dpr_1.0,f_jpg,h_${h},q_auto:good,w_${w}`;
18
- return `${BASE_URL}${transforms}/c_pad,h_${h},w_${w}/v1/${publicId}?pgw=1`;
31
+ return `${base}${transforms}/c_pad,h_${h},w_${w}/v1/${cleanId}`;
19
32
  }
20
33
 
21
34
  function parseIdentifiers(hybrisString) {
22
- return hybrisString
23
- .trim()
24
- .slice(1, hybrisString.length - 1)
35
+ if (Array.isArray(hybrisString)) {
36
+ return hybrisString.filter(Boolean);
37
+ }
38
+ if (!hybrisString || typeof hybrisString !== 'string') {
39
+ return [];
40
+ }
41
+ const trimmed = hybrisString.trim();
42
+ const content = trimmed.startsWith('[') && trimmed.endsWith(']')
43
+ ? trimmed.slice(1, -1)
44
+ : trimmed;
45
+
46
+ return content
25
47
  .split(',')
26
48
  .map((s) => s.trim())
27
49
  .filter(Boolean);
28
50
  }
29
51
 
30
- function generateMainSlideHtml(publicId) {
31
- const sources = IMG_BREAKPOINTS.map(
32
- (bp) =>
33
- `<source srcset="${buildCloudinaryUrl(publicId, bp.w, bp.h)}" media="${bp.media}">`
34
- ).join('\n ');
35
-
52
+ function renderMainSlide(src, sourcesHtml = '') {
53
+ const productName = getProductName();
36
54
  return `<div class="thumb-gallery__slide-wrapper swiper-slide">
37
55
  <picture>
38
- ${sources}
39
- <img class="swiper-slide-main" src="${buildCloudinaryUrl(publicId, MAIN_DEFAULT.w, MAIN_DEFAULT.h)}" alt="${productName}">
56
+ ${sourcesHtml}
57
+ <img class="swiper-slide-main" src="${src}" alt="${productName}">
40
58
  </picture>
41
59
  </div>`;
42
60
  }
43
61
 
44
- function generateThumbSlideHtml(publicId) {
62
+ function renderThumbSlide(src) {
63
+ const productName = getProductName();
45
64
  return `<div class="thumb-gallery__slide-wrapper swiper-slide">
46
- <img class="swiper-slide-thumbs" src="${buildCloudinaryUrl(publicId, THUMB.w, THUMB.h)}" alt="${productName}">
65
+ <img class="swiper-slide-thumbs" src="${src}" alt="${productName}">
47
66
  </div>`;
48
67
  }
49
68
 
69
+ function generateCloudinaryMainSlide(publicId, baseUrl) {
70
+ const sourcesHtml = IMG_BREAKPOINTS.map(
71
+ (bp) => `<source srcset="${buildCloudinaryUrl(publicId, bp.w, bp.h, baseUrl)}" media="${bp.media}">`
72
+ ).join('\n ');
73
+ const fallbackSrc = buildCloudinaryUrl(publicId, MAIN_DEFAULT.w, MAIN_DEFAULT.h, baseUrl);
74
+ return renderMainSlide(fallbackSrc, sourcesHtml);
75
+ }
76
+
77
+ function generateCloudinaryThumbSlide(publicId, baseUrl) {
78
+ const src = buildCloudinaryUrl(publicId, THUMB.w, THUMB.h, baseUrl);
79
+ return renderThumbSlide(src);
80
+ }
81
+
50
82
  const SELECTORS = {
51
83
  galleryCarousel: '.thumb-gallery',
52
84
  swiperContainerMain: '.swiper-container-main',
@@ -89,7 +121,11 @@ Wick.ThumbGallery = (function () {
89
121
  function handleThumbClick(swiper) {
90
122
  return function () {
91
123
  const clickedIndex = $(this).index();
92
- swiper.slideToLoop(clickedIndex);
124
+ if (swiper.params && swiper.params.loop) {
125
+ swiper.slideToLoop(clickedIndex);
126
+ } else {
127
+ swiper.slideTo(clickedIndex);
128
+ }
93
129
  };
94
130
  }
95
131
 
@@ -110,9 +146,11 @@ Wick.ThumbGallery = (function () {
110
146
  };
111
147
  }
112
148
 
113
- function getMainSwiperConfig($nextBtn, $prevBtn, thumbsSwiper, onSlideChange) {
149
+ function getMainSwiperConfig($nextBtn, $prevBtn, thumbsSwiper, onSlideChange, count) {
114
150
  return {
115
151
  ...MAIN_SWIPER_CONFIG,
152
+ loop: count > 1,
153
+ simulateTouch: count > 1,
116
154
  navigation: {
117
155
  nextEl: $nextBtn[0],
118
156
  prevEl: $prevBtn[0],
@@ -122,17 +160,44 @@ Wick.ThumbGallery = (function () {
122
160
  };
123
161
  }
124
162
 
125
- function initializeCarousel($slider, ids) {
126
- $slider.find(SELECTORS.swiperMainWrapper).html(ids.map(generateMainSlideHtml).join('\n'));
127
- $slider
128
- .find(SELECTORS.swiperThumbsWrapper)
129
- .html(ids.map(generateThumbSlideHtml).join('\n'));
163
+ function initializeCarousel($slider, ids, baseUrl, missingImage) {
164
+ const isMissing = ids.length === 0 && Boolean(missingImage);
165
+ if (ids.length === 0 && !missingImage) {
166
+ return;
167
+ }
130
168
 
131
169
  const $container = $slider.find(SELECTORS.swiperContainerMain);
170
+ const $thumbContainer = $slider.find(SELECTORS.swiperContainerThumbs);
171
+ if (!$container.length || !$thumbContainer.length) {
172
+ return;
173
+ }
174
+
175
+ if ($container[0].swiper) {
176
+ $container[0].swiper.destroy(true, true);
177
+ }
178
+ if ($thumbContainer[0].swiper) {
179
+ $thumbContainer[0].swiper.destroy(true, true);
180
+ }
181
+
182
+ const total = isMissing ? 1 : ids.length;
183
+ $slider.attr('data-length', total);
184
+
185
+ if (isMissing) {
186
+ $slider.addClass('thumb-gallery--missing-image');
187
+ $slider.find(SELECTORS.swiperMainWrapper).html(renderMainSlide(missingImage));
188
+ $slider.find(SELECTORS.swiperThumbsWrapper).html(renderThumbSlide(missingImage));
189
+ } else {
190
+ $slider.removeClass('thumb-gallery--missing-image');
191
+ $slider
192
+ .find(SELECTORS.swiperMainWrapper)
193
+ .html(ids.map((id) => generateCloudinaryMainSlide(id, baseUrl)).join('\n'));
194
+ $slider
195
+ .find(SELECTORS.swiperThumbsWrapper)
196
+ .html(ids.map((id) => generateCloudinaryThumbSlide(id, baseUrl)).join('\n'));
197
+ }
198
+
132
199
  const $nextBtn = $slider.find(SELECTORS.nextBtn);
133
200
  const $prevBtn = $slider.find(SELECTORS.prevBtn);
134
-
135
- const $thumbContainer = $slider.find(SELECTORS.swiperContainerThumbs);
136
201
  const $thumbNextBtn = $slider.find(SELECTORS.thumbNextBtn);
137
202
  const $thumbPrevBtn = $slider.find(SELECTORS.thumbPrevBtn);
138
203
 
@@ -145,22 +210,25 @@ Wick.ThumbGallery = (function () {
145
210
  $container[0],
146
211
  getMainSwiperConfig($nextBtn, $prevBtn, thumbsSwiper, () => {
147
212
  updateActiveThumbnail(swiper, thumbsSwiper);
148
- })
213
+ }, total)
149
214
  );
150
215
 
151
- $thumbContainer.on('click', SELECTORS.swiperSlide, handleThumbClick(swiper));
216
+ $thumbContainer
217
+ .off('click', SELECTORS.swiperSlide)
218
+ .on('click', SELECTORS.swiperSlide, handleThumbClick(swiper));
219
+
152
220
  updateActiveThumbnail(swiper, thumbsSwiper);
153
221
  }
154
222
 
155
- function init(hybrisString) {
223
+ function init(hybrisString, options = {}) {
156
224
  const ids = parseIdentifiers(hybrisString);
157
225
 
158
- if (ids.length < 2) {
159
- return;
160
- }
226
+ const opts = typeof options === 'string' ? { mediaDomain: options } : (options || {});
227
+ const baseUrl = getBaseUrl(opts.mediaDomain);
228
+ const missingImage = opts.missingImage || '';
161
229
 
162
230
  $(SELECTORS.galleryCarousel).each(function (_, slider) {
163
- initializeCarousel($(slider), ids);
231
+ initializeCarousel($(slider), ids, baseUrl, missingImage);
164
232
  });
165
233
  }
166
234
 
@@ -19,7 +19,7 @@
19
19
  {{> search-filter collapsed="accordion_collapsed" hidden="hidden-state"}}
20
20
  </aside>
21
21
 
22
- <div class="package-plp__content">
22
+ <div class="package-plp__content products-list-v2">
23
23
  <div class="plp-filters" data-component="plp-filters" aria-label="Product filters">
24
24
  <div class="plp-filters__bar plp-filters__bar-mobile" role="tablist" aria-label="Filters">
25
25
  {{> kitchen/mobile-nav-item
@@ -26,7 +26,7 @@
26
26
  {{> search-filter collapsed="accordion_collapsed" hidden="hidden-state"}}
27
27
  </aside>
28
28
 
29
- <div class="package-plp__content">
29
+ <div class="package-plp__content products-list-v2">
30
30
  <div class="plp-filters" data-component="plp-filters" aria-label="Product filters">
31
31
  <div class="plp-filters__bar plp-filters__bar-mobile" role="tablist" aria-label="Filters">
32
32
  {{> kitchen/mobile-nav-item
@@ -26,7 +26,7 @@
26
26
  {{> search-filter collapsed="accordion_collapsed" hidden="hidden-state"}}
27
27
  </aside>
28
28
 
29
- <div class="package-plp__content">
29
+ <div class="package-plp__content products-list-v2">
30
30
  <div class="plp-filters" data-component="plp-filters" aria-label="Product filters">
31
31
  <div class="plp-filters__bar plp-filters__bar-mobile" role="tablist" aria-label="Filters">
32
32
  {{> kitchen/mobile-nav-item
@@ -0,0 +1,120 @@
1
+ {{#extend "base" pageClass="page-product-details" title="PDP - Gallery with 1 image"
2
+ isDiscount=false
3
+ isExcludingDelivery=true
4
+ isCashback=false
5
+ isQuantity=true
6
+ isSize=false
7
+ klarna-placement=true
8
+ clearpay-placement=true
9
+ hourly-delivery=true
10
+ step3=true
11
+ currentlyInStock=true
12
+ pagePdp=true
13
+ package=true
14
+ postcodeChecker=true
15
+ }}
16
+ {{#content "head" mode="append" pagePdp=true}}
17
+ {{/content}}
18
+ {{#content "body"}}
19
+ <main class="pdp__main">
20
+ <div class="container">
21
+ <div class="pdp pdp--ripple">
22
+ <div class="pdp__title">
23
+ <h1 class="pdp__heading">Bosch PSB 1800 LI-2 18V Li-Ion Cordless Combi Drill Example with long
24
+ title in two raws
25
+ </h1>
26
+ <div class="pdp__reviews_small">
27
+ <span class="product-code product-code-v2">Product code: <strong id="product-code-val">236334</strong></span>
28
+ <div class="product-card__reviews review-star">
29
+ <div class="product-rating product-rating-v2">
30
+ <div class="rating-bg">
31
+ <i class="fa fa-star" aria-hidden="true"></i>
32
+ <i class="fa fa-star" aria-hidden="true"></i>
33
+ <i class="fa fa-star" aria-hidden="true"></i>
34
+ <i class="fa fa-star" aria-hidden="true"></i>
35
+ <i class="fa fa-star" aria-hidden="true"></i>
36
+ <div class="rating-overlay"
37
+ data-rating="{{#if review-rating}}{{review-rating}}{{else}}0{{/if}}">
38
+ <i class="fa fa-star" aria-hidden="true"></i>
39
+ <i class="fa fa-star ml-1" aria-hidden="true"></i>
40
+ <i class="fa fa-star ml-1" aria-hidden="true"></i>
41
+ <i class="fa fa-star ml-1" aria-hidden="true"></i>
42
+ <i class="fa fa-star ml-1" aria-hidden="true"></i>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ <span class="review-star-average review-star-average-v2">(4.6)</span>
47
+ </div>
48
+ <span class="pdp__reviews-link-wrap"><a href="#" data-link="#pdp-reviews" id="open-review">82 reviews</a></span>
49
+ </div>
50
+ </div>
51
+
52
+ <div class="pdp__full-gallery">
53
+ {{> thumb-gallery }}
54
+ </div>
55
+
56
+ <div class="pdp__aside">
57
+ {{> price-block-v2 isProductSaved=false isUserLogedOut=false price=ripple-pdp.price}}
58
+ </div>
59
+
60
+ <div class="pdp__full-description">
61
+ {{> product-main-info-v2 currentlyInStock=false hideShareButton=true}}
62
+ </div>
63
+
64
+
65
+ <div class="pdp__suite-includes">
66
+ {{> suite-includes products=ripple-pdp.suite-products price=ripple-pdp.price price-vat=ripple-pdp.price-vat }}
67
+ </div>
68
+
69
+ {{> fulfilment-accordions}}
70
+ </div>
71
+ </div>
72
+ <div class="container container-info">
73
+ <div class="pdp pdp--ripple">
74
+ <div class="pdp__info">
75
+ {{> pdp-info-v2 floor=true }}
76
+ </div>
77
+ </div>
78
+ </div>
79
+ <div class="pdp--ripple">
80
+ {{> seo-widgets title="Related category" }}
81
+ </div>
82
+ </main>
83
+ {{/content}}
84
+ {{#content "foot" mode="append"}}
85
+ <script type="text/html" id="mini-basket-popup">
86
+ {{> popover-mini-basket mod="popover-mini-basket_just-added" products=mini-basket.just-added just-added=true}}
87
+ </script>
88
+ <script defer src="./js/page/pdp.js"></script>
89
+ {{> click-and-collect-modal}}
90
+ {{> thank-you-modal}}
91
+ {{/content}}
92
+ {{/extend}}
93
+ <!--<script defer src="./js/page/ti.js"></script>-->
94
+ <script type="module" defer src="./js/page/installation/fi.js"></script>
95
+ <script defer src="./js/page/ripple/thumb-gallery.js" onload="Wick.ThumbGallery.init('[products/wickes/GPID_5000143102_00]', { mediaDomain: 'media.wickes.co.uk' })"></script>
96
+ <script defer src="./js/postcode-checker.min.js"></script>
97
+ <script>
98
+ if (navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1) {
99
+ $(document).ready(function () {
100
+ $('.modal').on('scroll', function () {
101
+ $(':focus').blur();
102
+ });
103
+ });
104
+ }
105
+
106
+ $(document).ready(function () {
107
+
108
+ $('#info-details').toggleClass('accordion_collapsed');
109
+ $('#details-content').css('display', 'block');
110
+
111
+ $('#open-review').on('click', function () {
112
+ $('#info-review').toggleClass('accordion_collapsed');
113
+ $('#review-content').css('display', 'block');
114
+ });
115
+
116
+ $('.ti__next ti__next3 .btn').on('click', function () {
117
+ alert('Click');
118
+ });
119
+ })
120
+ </script>