@ecomplus/storefront-components 1.0.0-beta.18 → 1.0.0-beta.181

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 (125) hide show
  1. package/CHANGELOG.md +1278 -133
  2. package/README.md +9 -4
  3. package/all.js +3 -1
  4. package/dist/1.storefront-components.min.js +2 -0
  5. package/dist/1.storefront-components.min.js.map +1 -0
  6. package/dist/2.storefront-components.min.js +5 -0
  7. package/dist/2.storefront-components.min.js.map +1 -0
  8. package/dist/3.storefront-components.min.js +5 -0
  9. package/dist/3.storefront-components.min.js.map +1 -0
  10. package/dist/storefront-components.min.js +33 -12
  11. package/dist/storefront-components.min.js.map +1 -1
  12. package/package.json +17 -12
  13. package/src/APagination.vue +2 -0
  14. package/src/AShare.vue +2 -0
  15. package/src/AccountAddresses.vue +3 -0
  16. package/src/AccountForm.vue +3 -0
  17. package/src/AccountPoints.vue +3 -0
  18. package/src/BuyTogether.vue +3 -0
  19. package/src/EarnPointsProgress.vue +3 -0
  20. package/src/ItemCustomizations.vue +2 -0
  21. package/src/KitProductVariations.vue +3 -0
  22. package/src/PointsApplier.vue +2 -0
  23. package/src/ProductQuickview.vue +3 -0
  24. package/src/QuantitySelector.vue +3 -0
  25. package/src/RecommendedItems.vue +3 -0
  26. package/src/ShippingLine.vue +1 -0
  27. package/src/TheCart.vue +3 -0
  28. package/src/html/APagination.html +90 -0
  29. package/src/html/APrices.html +24 -4
  30. package/src/html/AShare.html +31 -0
  31. package/src/html/AccountAddresses.html +90 -0
  32. package/src/html/AccountForm.html +269 -0
  33. package/src/html/AccountPoints.html +39 -0
  34. package/src/html/AddressForm.html +9 -7
  35. package/src/html/BuyTogether.html +60 -0
  36. package/src/html/CartItem.html +86 -38
  37. package/src/html/CartQuickview.html +28 -5
  38. package/src/html/DiscountApplier.html +2 -2
  39. package/src/html/EarnPointsProgress.html +28 -0
  40. package/src/html/InputDate.html +1 -1
  41. package/src/html/InputDocNumber.html +1 -0
  42. package/src/html/InputPhone.html +1 -1
  43. package/src/html/InstantSearch.html +3 -3
  44. package/src/html/ItemCustomizations.html +14 -0
  45. package/src/html/KitProductVariations.html +92 -0
  46. package/src/html/LoginBlock.html +34 -32
  47. package/src/html/LoginModal.html +9 -4
  48. package/src/html/PaymentOption.html +7 -5
  49. package/src/html/PointsApplier.html +26 -0
  50. package/src/html/ProductCard.html +56 -8
  51. package/src/html/ProductGallery.html +21 -3
  52. package/src/html/ProductQuickview.html +64 -0
  53. package/src/html/ProductVariations.html +30 -3
  54. package/src/html/QuantitySelector.html +85 -0
  55. package/src/html/RecommendedItems.html +48 -0
  56. package/src/html/SearchEngine.html +100 -24
  57. package/src/html/ShippingCalculator.html +84 -3
  58. package/src/html/ShippingLine.html +5 -2
  59. package/src/html/TheAccount.html +43 -9
  60. package/src/html/TheCart.html +156 -0
  61. package/src/html/TheProduct.html +416 -138
  62. package/src/js/APagination.js +74 -0
  63. package/src/js/APicture.js +27 -7
  64. package/src/js/APrices.js +80 -41
  65. package/src/js/AShare.js +83 -0
  66. package/src/js/AccountAddresses.js +192 -0
  67. package/src/js/AccountForm.js +312 -0
  68. package/src/js/AccountPoints.js +63 -0
  69. package/src/js/AddressForm.js +80 -35
  70. package/src/js/BuyTogether.js +246 -0
  71. package/src/js/CartItem.js +67 -14
  72. package/src/js/CartQuickview.js +20 -1
  73. package/src/js/DiscountApplier.js +165 -48
  74. package/src/js/EarnPointsProgress.js +77 -0
  75. package/src/js/InputDate.js +8 -8
  76. package/src/js/InputDocNumber.js +20 -0
  77. package/src/js/ItemCustomizations.js +10 -0
  78. package/src/js/KitProductVariations.js +218 -0
  79. package/src/js/LoginBlock.js +46 -5
  80. package/src/js/LoginModal.js +17 -4
  81. package/src/js/PaymentOption.js +28 -1
  82. package/src/js/PointsApplier.js +110 -0
  83. package/src/js/ProductCard.js +97 -11
  84. package/src/js/ProductGallery.js +32 -12
  85. package/src/js/ProductQuickview.js +72 -0
  86. package/src/js/ProductVariations.js +76 -19
  87. package/src/js/QuantitySelector.js +175 -0
  88. package/src/js/RecommendedItems.js +178 -0
  89. package/src/js/SearchEngine.js +185 -55
  90. package/src/js/ShippingCalculator.js +176 -35
  91. package/src/js/ShippingLine.js +35 -5
  92. package/src/js/TheAccount.js +97 -6
  93. package/src/js/TheCart.js +146 -0
  94. package/src/js/TheProduct.js +387 -43
  95. package/src/js/helpers/add-idle-callback.js +7 -0
  96. package/src/js/helpers/check-form-validity.js +3 -0
  97. package/src/js/helpers/favorite-products.js +24 -0
  98. package/src/js/helpers/scroll-to-element.js +10 -0
  99. package/src/js/helpers/sort-apps.js +14 -0
  100. package/src/js/helpers/wait-storefront-info.js +21 -0
  101. package/src/scss/APicture.scss +2 -0
  102. package/src/scss/APrices.scss +13 -1
  103. package/src/scss/AccountAddresses.scss +27 -0
  104. package/src/scss/AccountForm.scss +5 -0
  105. package/src/scss/AccountPoints.scss +17 -0
  106. package/src/scss/BuyTogether.scss +38 -0
  107. package/src/scss/CartItem.scss +17 -1
  108. package/src/scss/EarnPointsProgress.scss +6 -0
  109. package/src/scss/InstantSearch.scss +1 -0
  110. package/src/scss/KitProductVariations.scss +72 -0
  111. package/src/scss/LoginBlock.scss +5 -0
  112. package/src/scss/PaymentOption.scss +10 -1
  113. package/src/scss/ProductCard.scss +66 -28
  114. package/src/scss/ProductGallery.scss +4 -2
  115. package/src/scss/ProductQuickview.scss +36 -0
  116. package/src/scss/ProductVariations.scss +20 -4
  117. package/src/scss/QuantitySelector.scss +39 -0
  118. package/src/scss/RecommendedItems.scss +28 -0
  119. package/src/scss/SearchEngine.scss +9 -5
  120. package/src/scss/ShippingCalculator.scss +42 -1
  121. package/src/scss/ShippingLine.scss +24 -0
  122. package/src/scss/TheAccount.scss +4 -0
  123. package/src/scss/TheCart.scss +54 -0
  124. package/src/scss/TheProduct.scss +146 -1
  125. package/webpack.config.js +20 -6
@@ -0,0 +1,39 @@
1
+ <div
2
+ v-if="validPointsEntries.length"
3
+ class="account-points"
4
+ >
5
+ <div class="account-points__info">
6
+ <h4>{{ i19loyaltyPoints }}</h4>
7
+ <span>{{ i19available }}: <b>{{ totalPoints.toFixed(1) }}</b> / Cashback: <b>{{ formatMoney(totalCashback) }}</b></span>
8
+ </div>
9
+
10
+ <ul class="list-group">
11
+ <li
12
+ v-for="pointsEntry in validPointsEntries"
13
+ class="list-group-item account-points__entry"
14
+ >
15
+ <div class="account-points__entry-title">
16
+ <h5 class="mb-1">
17
+ {{ pointsEntry.name }}
18
+ </h5>
19
+ <small v-if="pointsEntry.valid_thru">
20
+ {{ i19upTo }}
21
+ {{ formatDate(pointsEntry.valid_thru) }}
22
+ </small>
23
+ </div>
24
+
25
+ {{ i19available }}:
26
+ <b>{{ pointsEntry.active_points.toFixed(1) }}</b>
27
+ <small
28
+ v-if="pointsEntry.earned_points"
29
+ class="text-muted"
30
+ >
31
+ / {{ `${pointsEntry.earned_points.toFixed(1)} ${i19pointsEarned}` }}
32
+ </small>
33
+ <div class="account-points__cashback">
34
+ Cashback:
35
+ <b>{{ formatMoney(pointsEntry.active_points * pointsEntry.ratio) }}</b>
36
+ </div>
37
+ </li>
38
+ </ul>
39
+ </div>
@@ -28,16 +28,16 @@
28
28
  />
29
29
 
30
30
  <div
31
- v-if="!isZipReady"
31
+ v-if="zipLoading || zipInfoLink"
32
32
  class="input-group-append"
33
33
  >
34
34
  <span class="input-group-text">
35
35
  <a
36
- v-if="!isZipLoading"
37
- href="http://www.buscacep.correios.com.br/sistemas/buscacep/default.cfm"
36
+ v-if="!zipLoading"
37
+ :href="zipInfoLink"
38
38
  target="_blank"
39
39
  >
40
- <i class="fas fa-question-circle"></i>
40
+ <i class="i-question-circle"></i>
41
41
  </a>
42
42
  <div
43
43
  v-else
@@ -102,6 +102,7 @@
102
102
  type="text"
103
103
  class="form-control"
104
104
  id="address-form-compl"
105
+ maxlength="100"
105
106
  v-model="localAddress.complement"
106
107
  >
107
108
  </div>
@@ -114,6 +115,7 @@
114
115
  type="text"
115
116
  class="form-control"
116
117
  id="address-form-ref"
118
+ maxlength="100"
117
119
  v-model="localAddress.near_to"
118
120
  >
119
121
  </div>
@@ -174,7 +176,7 @@
174
176
  type="text"
175
177
  class="form-control"
176
178
  id="address-form-pc"
177
- pattern="[a-z]{2}"
179
+ pattern="[A-Z]{2}"
178
180
  maxlength="2"
179
181
  placeholder="AA"
180
182
  v-model="provinceCode"
@@ -189,8 +191,8 @@
189
191
  class="btn btn-lg btn-primary"
190
192
  type="submit"
191
193
  >
192
- <i class="fas fa-check mr-1"></i>
193
- {{ i19save }}
194
+ <i class="i-check mr-1"></i>
195
+ {{ btnText }}
194
196
  </button>
195
197
  </div>
196
198
  </transition>
@@ -0,0 +1,60 @@
1
+ <div class="buy-together">
2
+ <transition enter-active-class="animated fadeInDown">
3
+ <div v-if="hasLoadedItems && recommendedItems.length">
4
+ <div class="buy-together__title">
5
+ <div class="buy-together__discount lead mb-3">
6
+ {{ i19buyTogether }}
7
+ <span
8
+ v-if="discount"
9
+ class="badge badge-success"
10
+ >
11
+ {{ formatMoney(discount) }} <span>OFF</span>
12
+ </span>
13
+ </div>
14
+ </div>
15
+
16
+ <div class="buy-together__row row">
17
+ <div
18
+ class="col-12"
19
+ :class="productIds.length > 1 ? 'col-md' : 'col-md-6 col-lg-4'"
20
+ >
21
+ <div class="row">
22
+ <div
23
+ v-if="items.length"
24
+ v-for="item in items"
25
+ :key="item._id"
26
+ class="buy-together__item col-12"
27
+ :class="`col-md-${(12 / items.length)}`"
28
+ >
29
+ <product-card
30
+ :product="item"
31
+ :productId="item._id"
32
+ :is-loaded="true"
33
+ v-bind="productCardProps"
34
+ />
35
+ </div>
36
+ </div>
37
+ </div>
38
+ <div class="buy-together__cta col-auto">
39
+ <a-prices
40
+ :product="{ price: subtotal - discount, base_price: subtotal }"
41
+ :is-literal="true"
42
+ :is-big="true"
43
+ />
44
+ <button
45
+ v-if="canAddToCart"
46
+ class="btn btn-lg btn-primary mt-3"
47
+ @click="buy"
48
+ >
49
+ <i class="i-shopping-basket mr-1"></i>
50
+ {{ i19buyTogether }}
51
+ </button>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </transition>
56
+
57
+ <transition leave-active-class="animated fadeOut">
58
+ <slot v-if="!hasLoadedItems"/>
59
+ </transition>
60
+ </div>
@@ -1,8 +1,11 @@
1
- <section class="cart-item">
1
+ <section
2
+ class="cart-item"
3
+ :class="isFreebie ? 'cart-item--freebie' : null"
4
+ >
2
5
  <div class="cart-item__container">
3
6
  <div class="cart-item__thumb">
4
7
  <component
5
- v-if="item.picture && Object.keys(item.picture).length"
8
+ v-if="img"
6
9
  :is="item.slug ? 'a-link' : 'span'"
7
10
  :href="`/${item.slug}`"
8
11
  >
@@ -15,13 +18,21 @@
15
18
 
16
19
  <div class="cart-item__data">
17
20
  <button
21
+ v-if="!isFreebie"
18
22
  type="button"
19
23
  class="close"
20
24
  :title="i19remove"
21
25
  @click="remove"
22
26
  >
23
- <i class="fas fa-trash-alt"></i>
27
+ <i class="i-trash"></i>
24
28
  </button>
29
+ <span
30
+ v-else
31
+ class="cart-item__freebie"
32
+ >
33
+ <i class="i-gift mr-1"></i>
34
+ {{ i19freebie }}
35
+ </span>
25
36
 
26
37
  <div
27
38
  class="cart-item__name"
@@ -36,51 +47,88 @@
36
47
  <template v-else>
37
48
  {{ name }}
38
49
  </template>
50
+
51
+ <small
52
+ class="cart-item__name-subtitle"
53
+ v-if="item.kit_product"
54
+ >
55
+ {{ formatName(item.kit_product.name) }}
56
+ </small>
39
57
  </div>
40
58
 
41
- <div
42
- :title="i19quantity"
43
- class="cart-item__quantity"
59
+ <small
60
+ v-if="maxQuantity === 0"
61
+ class="cart-item__out-of-stock"
44
62
  >
45
- <select
46
- v-if="canInputSelect && inputType === 'select'"
47
- class="custom-select"
48
- v-model.number="quantity"
49
- @change="updateInputType"
63
+ {{ i19outOfStock }}
64
+ </small>
65
+
66
+ <template v-else>
67
+ <div
68
+ :title="i19quantity"
69
+ class="cart-item__quantity"
50
70
  >
51
- <option
52
- v-for="qnt in (item.max_quantity || 10)"
53
- :value="qnt"
54
- :selected="qnt === quantity"
71
+ <strong v-if="item.kit_product || item.keep_item_quantity">
72
+ {{ quantity }}x
73
+ </strong>
74
+
75
+ <select
76
+ v-else-if="canInputSelect && inputType === 'select'"
77
+ class="custom-select"
78
+ v-model.number="quantity"
79
+ :disabled="!price"
80
+ @change="updateInputType"
55
81
  >
56
- {{ qnt }}
57
- </option>
58
- <option :value="11">
59
- 11+
60
- </option>
61
- </select>
82
+ <option
83
+ v-for="qnt in Math.min(maxQuantity, 10)"
84
+ v-if="qnt >= minQuantity"
85
+ :key="`qnt-${qnt}`"
86
+ :value="qnt"
87
+ :selected="qnt === quantity"
88
+ >
89
+ {{ qnt }}
90
+ </option>
91
+ <option
92
+ v-if="maxQuantity > 10"
93
+ :value="11"
94
+ >
95
+ 11+
96
+ </option>
97
+ </select>
62
98
 
63
- <input
64
- v-else
65
- ref="input"
66
- :type="inputType && inputType !== 'select' ? inputType : 'number'"
67
- class="form-control"
68
- placeholder="1"
69
- v-model.number="quantity"
70
- @blur="updateInputType"
71
- >
72
- </div>
99
+ <input
100
+ v-else
101
+ ref="input"
102
+ :type="inputType && inputType !== 'select' ? inputType : 'number'"
103
+ :min="minQuantity"
104
+ :max="maxQuantity"
105
+ :step="isIntegerQnt ? null : 0.001"
106
+ class="form-control"
107
+ v-model.number="quantity"
108
+ :readonly="!price"
109
+ @blur="updateInputType"
110
+ >
111
+ </div>
73
112
 
74
- <div class="cart-item__prices">
75
113
  <div
76
- class="cart-item__price-un fade"
77
- :class="{ show: quantity > 1 }"
114
+ v-if="!isFreebie || price > 0"
115
+ class="cart-item__prices"
78
116
  >
79
- {{ formatMoney(price) }}
80
- <small>/un</small>
117
+ <div
118
+ class="cart-item__price-un fade"
119
+ :class="{ show: quantity > 1 }"
120
+ >
121
+ {{ formatMoney(price) }}
122
+ <small>/un</small>
123
+ </div>
124
+ {{ formatMoney(price * quantity) }}
81
125
  </div>
82
- {{ formatMoney(price * quantity) }}
83
- </div>
126
+ </template>
127
+
128
+ <item-customizations
129
+ :item="item"
130
+ class="cart-item__customizations"
131
+ />
84
132
  </div>
85
133
  </div>
86
134
  </section>
@@ -64,11 +64,25 @@
64
64
  href="#"
65
65
  @click.prevent="toggle"
66
66
  >
67
- <i class="fas fa-arrow-left mr-1"></i>
67
+ <i class="i-arrow-left mr-1"></i>
68
68
  {{ i19continueShopping }}
69
69
  </a>
70
70
  </slot>
71
71
  </div>
72
+
73
+ <div
74
+ class="minicart__shipping"
75
+ v-if="cart.items.length && hasShippingCalculator"
76
+ key="shipping"
77
+ >
78
+ <hr>
79
+ <shipping-calculator
80
+ class="minicart__shipping-calculator"
81
+ :can-select-services="true"
82
+ :shipped-items="cart.items"
83
+ @select-service="selectShippingService"
84
+ />
85
+ </div>
72
86
  </transition-group>
73
87
  </article>
74
88
 
@@ -79,12 +93,12 @@
79
93
  >
80
94
  <div class="minicart__summary">
81
95
  <span>{{ i19subtotal }}</span>
82
- <strong class="minicart__subtotal">
96
+ <div class="minicart__subtotal">
83
97
  <a-prices
84
- :product="{ price: cart.subtotal }"
98
+ :product="{ price: total || cart.subtotal }"
85
99
  :is-literal="true"
86
100
  />
87
- </strong>
101
+ </div>
88
102
  </div>
89
103
 
90
104
  <a-link
@@ -92,7 +106,7 @@
92
106
  role="button"
93
107
  :href="checkoutUrl"
94
108
  >
95
- <i class="fas fa-check mr-1"></i>
109
+ <i class="i-check mr-1"></i>
96
110
  {{ i19checkout }}
97
111
  </a-link>
98
112
  <a-link
@@ -102,6 +116,15 @@
102
116
  >
103
117
  {{ i19seeCart }}
104
118
  </a-link>
119
+
120
+ <button
121
+ type="button"
122
+ class="minicart__btn-back btn btn-block btn-sm btn-link d-md-none"
123
+ @click="toggle"
124
+ >
125
+ <i class="i-arrow-left mr-1"></i>
126
+ {{ i19continueShopping }}
127
+ </button>
105
128
  </footer>
106
129
  </slot>
107
130
  </aside>
@@ -21,7 +21,7 @@
21
21
  @click.prevent="isFormVisible = !isFormVisible"
22
22
  type="button"
23
23
  >
24
- <i class="fas fa-tag mr-1"></i>
24
+ <i class="i-tag mr-1"></i>
25
25
  {{ i19addDiscountCoupon }}
26
26
  </button>
27
27
  </div>
@@ -77,7 +77,7 @@
77
77
  disabled
78
78
  type="button"
79
79
  >
80
- <i class="fas fa-check-circle"></i>
80
+ <i class="i-check-circle"></i>
81
81
  </button>
82
82
  </div>
83
83
  </div>
@@ -0,0 +1,28 @@
1
+ <div
2
+ v-if="minSubtotalToEarn > cartSubtotal"
3
+ class="earn-points-progress"
4
+ >
5
+ <span>
6
+ {{ i19add$1ToEarn.replace('$1', formatMoney(minSubtotalToEarn - cartSubtotal)) }}
7
+ <strong>{{ i19loyaltyPoints.toLowerCase() }}</strong>
8
+ </span>
9
+
10
+ <div
11
+ v-if="earnFromPercentage >= 33"
12
+ class="progress"
13
+ >
14
+ <div
15
+ class="progress-bar progress-bar-striped"
16
+ role="progressbar"
17
+ :style="`width: ${earnFromPercentage}%`"
18
+ :aria-valuenow="earnFromPercentage"
19
+ aria-valuemin="0"
20
+ aria-valuemax="100"
21
+ >
22
+ <span>
23
+ {{ programName }}
24
+ <strong>{{ earnFromPercentage }}%</strong>
25
+ </span>
26
+ </div>
27
+ </div>
28
+ </div>
@@ -1,7 +1,7 @@
1
1
  <cleave-input
2
2
  type="tel"
3
3
  class="form-control"
4
- pattern="[\d/-]{10}"
4
+ pattern="[0-9\/\-]{10}"
5
5
  :options="cleaveOptions"
6
6
  v-model="localValue"
7
7
  :placeholder="placeholder"
@@ -1,6 +1,7 @@
1
1
  <cleave-input
2
2
  type="tel"
3
3
  class="form-control"
4
+ :class="isInvalid ? 'is-invalid' : null"
4
5
  :pattern="pattern"
5
6
  :options="cleaveOptions"
6
7
  v-model="localValue"
@@ -1,7 +1,7 @@
1
1
  <cleave-input
2
2
  type="tel"
3
3
  class="form-control"
4
- pattern="(\+[\d]{2})?([\d]{2,})?([\s-]?[\d]{4,}){2,}"
4
+ pattern="(\+[\d]{2}\s?)?([1-9][\d]+)?([\s\-]?[\d]{4,}){2,}"
5
5
  :options="cleaveOptions"
6
6
  v-model="localValue"
7
7
  :placeholder="placeholder"
@@ -32,7 +32,7 @@
32
32
  class="search__submit"
33
33
  :aria-label="i19search"
34
34
  >
35
- <i class="fas fa-search"></i>
35
+ <i class="i-search"></i>
36
36
  </button>
37
37
  </div>
38
38
 
@@ -50,7 +50,7 @@
50
50
  :aria-label="i19close"
51
51
  @click="hide"
52
52
  >
53
- <i class="fas fa-times-circle"></i>
53
+ <i class="i-times-circle"></i>
54
54
  </button>
55
55
  </div>
56
56
  </header>
@@ -111,7 +111,7 @@
111
111
  v-if="history.length"
112
112
  class="search__history d-none d-lg-block"
113
113
  >
114
- <i class="fas fa-history"></i>
114
+ <i class="i-history"></i>
115
115
  <a
116
116
  class="search__history-link"
117
117
  v-for="term in history"
@@ -0,0 +1,14 @@
1
+ <div
2
+ v-if="item.customizations && item.customizations.length"
3
+ class="item-customizations small"
4
+ >
5
+ <div
6
+ v-for="({ _id, label, option }) in item.customizations"
7
+ :key="`cs-${_id}`"
8
+ >
9
+ <span class="text-muted">
10
+ {{ label }}:
11
+ </span>
12
+ {{ option.text }}
13
+ </div>
14
+ </div>
@@ -0,0 +1,92 @@
1
+ <div class="kit-product-variations">
2
+ <div
3
+ class="glide"
4
+ ref="glide"
5
+ >
6
+ <div
7
+ class="glide__track"
8
+ data-glide-el="track"
9
+ >
10
+ <ul class="glide__slides kit-product-variations__list">
11
+ <li
12
+ v-for="(item, index) in localItems"
13
+ class="glide__slide"
14
+ >
15
+ <button
16
+ v-if="variationKit[activeIndex]"
17
+ @click="removeItemFromKit(activeIndex)"
18
+ type="button"
19
+ :aria-label="i19close"
20
+ class="close"
21
+ >
22
+ <i class="i-times-circle"></i>
23
+ </button>
24
+ <div class="kit-product-variations__item">
25
+ <div class="kit-product-variations__item-head">
26
+ <div class="kit-product-variations__picture">
27
+ <a-picture
28
+ class="gallery__big-image"
29
+ :src="getImg(item, null, 'normal')"
30
+ />
31
+ </div>
32
+ <div class="kit-product-variations__info">
33
+ <h2>{{ getName(item) }}</h2>
34
+ <b>{{ i19quantity }}: 1 </b>
35
+ </div>
36
+ </div>
37
+
38
+ <slot name="variations">
39
+ <product-variations
40
+ :key="item.key"
41
+ :product="item"
42
+ :selected-id.sync="selectedVariationId"
43
+ :max-options-btns="maxOptionsBtns"
44
+ :class="variationKit[activeIndex] || variationKitReady.length < max
45
+ ? 'kit-product-variations--show'
46
+ : 'kit-product-variations--hide'"
47
+ />
48
+ <a-alert
49
+ v-if="variationKitReady.length === max && !variationKit[activeIndex]"
50
+ :can-show="variationKitReady.length === max"
51
+ :variant="alertVariant"
52
+ >
53
+ {{ i19maxQuantity }}:
54
+ <strong>{{ max }}</strong>
55
+ </a-alert>
56
+
57
+ <slot name="variations-info"/>
58
+ </slot>
59
+ </div>
60
+ </li>
61
+ </ul>
62
+ </div>
63
+
64
+ <div class="glide__pagination">
65
+ <span class="glide__pagination--current">{{ activeIndex + 1 }}</span>
66
+ <span class="glide__pagination--total">/ {{ localItems.length }}</span>
67
+ </div>
68
+ </div>
69
+ <div class="kit-product-variations__actions">
70
+ <button @click="activeIndex++" class="btn btn-block btn-primary"><span>{{ i19next }} {{ i19item }}</span></button>
71
+ <button @click="activeIndex--" class="btn btn-block btn-outline-secondary">
72
+ <span>{{ i19item }} {{ i19previous }}</span>
73
+ </button>
74
+ </div>
75
+ <div class="kit-product-variations__buy">
76
+ <slot
77
+ name="buy"
78
+ v-bind="{ variationKit }"
79
+ >
80
+ <button
81
+ type="button"
82
+ class="btn btn-lg btn-primary my-3"
83
+ @click="buy"
84
+ :disabled="variationKitReady.length !== min"
85
+ >
86
+ <slot name="buy-button-content">
87
+ <i class="i-shopping-bag mr-1"></i>
88
+ </slot>
89
+ </button>
90
+ </slot>
91
+ </div>
92
+ </div>