@lancom/shared 0.0.431 → 0.0.433

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 (48) hide show
  1. package/assets/js/api/index.js +1 -1
  2. package/components/checkout/cart/cart.vue +1 -3
  3. package/components/checkout/cart/cart_entity/cart_entity_color_simple_products/cart-entity-color-simple-products.mixin.js +3 -1
  4. package/components/checkout/cart/cart_entity/cart_entity_color_simple_products/cart-entity-color-simple-products.scss +14 -2
  5. package/components/checkout/cart/cart_entity/cart_entity_color_simple_products/cart-entity-color-simple-products.vue +13 -2
  6. package/components/checkout/cart/cart_entity/cart_entity_color_simple_products/cart_entity_color_simple_product/cart-entity-color-simple-product.scss +2 -2
  7. package/components/checkout/cart/cart_shipping/cart-shipping.vue +1 -1
  8. package/components/checkout/order/order-payment-information/order-payment-information.vue +10 -2
  9. package/components/customer/customer.vue +13 -17
  10. package/components/customer/customer_form/customer-form.vue +7 -2
  11. package/components/editor/editor_colors/editor-colors.scss +6 -3
  12. package/components/editor/editor_colors/editor-colors.vue +1 -1
  13. package/components/editor/editor_layers/editor-layers.scss +40 -1
  14. package/components/editor/editor_layers/editor-layers.vue +112 -67
  15. package/components/editor/editor_layers/editor_layer_forms/editor_layer_form_text/editor-layer-form-text.scss +19 -1
  16. package/components/editor/editor_layers/editor_layer_forms/editor_layer_form_text/editor-layer-form-text.vue +114 -21
  17. package/components/editor/editor_layers/editor_layers_toolbar/editor-layers-toolbar.scss +15 -1
  18. package/components/editor/editor_layers/editor_layers_toolbar/editor-layers-toolbar.vue +20 -3
  19. package/components/editor/editor_workspace/editor-workspace.vue +17 -6
  20. package/components/editor/editor_workspace/editor_workspace_side/editor-workspace-side.vue +25 -20
  21. package/components/product/add-to-cart-btn.vue +13 -3
  22. package/components/product/editor_pricing/editor-pricing.scss +2 -1
  23. package/components/product/editor_pricing/editor-pricing.vue +5 -3
  24. package/components/product/other_products/other_product/other-product.scss +9 -0
  25. package/components/product/other_products/other_product/other-product.vue +21 -12
  26. package/components/product/product_check_delivery/product-check-delivery.scss +115 -0
  27. package/components/product/product_check_delivery/product-check-delivery.vue +135 -30
  28. package/components/product/product_colors_selector/product-colors-selector.scss +6 -1
  29. package/components/product/product_colors_selector/product-colors-selector.vue +3 -2
  30. package/components/product/product_multipacks_carousel/product-multipacks-carousel.vue +4 -47
  31. package/components/product/product_pricing_tiers/product-pricing-tiers.scss +2 -0
  32. package/components/product/product_pricing_tiers/product-pricing-tiers.vue +25 -6
  33. package/components/product/products_size_selector_color/product_size_selector_color/product-size-selector-color.scss +6 -1
  34. package/components/product/wizard/wizard_print_layers/wizard_print_layer/wizard-print-layer.vue +9 -6
  35. package/components/products/children_categories/children-categories.vue +14 -7
  36. package/components/products/products_aside/products-aside.vue +14 -2
  37. package/components/static_page/static-page.scss +15 -1
  38. package/components/static_page/static-page.vue +7 -0
  39. package/mixins/layouts/products.js +3 -2
  40. package/mixins/multipack.mixin.js +61 -0
  41. package/mixins/product-preview.js +1 -0
  42. package/package.json +1 -1
  43. package/plugins/headers.js +1 -0
  44. package/plugins/save-state.js +9 -4
  45. package/static/images/empty-layers.png +0 -0
  46. package/store/cart.js +20 -3
  47. package/store/index.js +1 -1
  48. package/store/product.js +2 -2
@@ -5,28 +5,17 @@
5
5
  name="header"
6
6
  :invalid="invalid">
7
7
  </slot>
8
+
9
+ <div class="EditorLayerFormText__preview">
10
+ <canvas ref="previewCanvas"></canvas>
11
+ </div>
12
+
13
+ <slot
14
+ name="after-canvas"
15
+ :invalid="invalid">
16
+ </slot>
17
+
8
18
  <div class="EditorLayerFormText__content" @click.stop>
9
- <validation-provider
10
- tag="div"
11
- name="Copy"
12
- rules="required|max:100"
13
- class="form-row">
14
- <label
15
- for="copy"
16
- class="form-label">
17
- Write your text
18
- </label>
19
- <textarea
20
- id="copy"
21
- ref="copy"
22
- v-model="copy"
23
- type="text"
24
- name="copy"
25
- style="height: 100px;"
26
- class="form-field bordered labelless"
27
- placeholder="Your text here"
28
- :class="{ filled: copy }"></textarea>
29
- </validation-provider>
30
19
  <div>
31
20
  <div
32
21
  v-if="copy.includes('\n')"
@@ -174,8 +163,10 @@
174
163
  </template>
175
164
 
176
165
  <script>
166
+ import { fabric } from 'fabric';
177
167
  import { inRange } from '@lancom/shared/assets/js/utils/filters';
178
168
  import { availableFonts, loadFont } from '@lancom/shared/assets/js/utils/fonts-helper';
169
+ import { createText } from '@lancom/shared/assets/js/utils/fabric/object-factory';
179
170
  import ColorPicker from '@lancom/shared/components/common/color-picker';
180
171
  import EditorLayerCommonFields from '../editor_layer_common_fields/editor-layer-common-fields';
181
172
  import FontFamilySelect from './font-family_select/font-family-select';
@@ -189,6 +180,8 @@ const editableModel = (field, prop) => ({
189
180
  set(v) {
190
181
  const value = prop && Object.prototype.hasOwnProperty.call(v, prop) ? v[prop] : v;
191
182
  this.$emit('set-layer-field', { field, value });
183
+ this.textObject[field] = value;
184
+ this.fabricCanvas.renderAll();
192
185
  }
193
186
  });
194
187
  export default {
@@ -204,6 +197,15 @@ export default {
204
197
  required: true
205
198
  }
206
199
  },
200
+ data() {
201
+ return {
202
+ fabricCanvas: null,
203
+ textObject: null,
204
+ isEditing: false,
205
+ isUpdatingFromLayer: false,
206
+ shouldAutoFocus: true
207
+ };
208
+ },
207
209
  computed: {
208
210
  copy: editableModel('copy'),
209
211
  textAlign: editableModel('textAlign'),
@@ -229,6 +231,8 @@ export default {
229
231
  value = inRange(value || 0, -300, 300);
230
232
  this.$emit('set-layer-field', { field: 'charSpacing', value });
231
233
  this.$refs.charSpacing.value = value;
234
+
235
+ this.textObject.charSpacing = value;
232
236
  }
233
237
  },
234
238
  strokeWidth: {
@@ -239,12 +243,23 @@ export default {
239
243
  value = inRange(value, 1, 30);
240
244
  this.$emit('set-layer-field', { field: 'strokeWidth', value });
241
245
  this.$refs.strokeWidth.value = value;
246
+
247
+ this.textObject.strokeWidth = value;
242
248
  }
243
249
  },
244
250
  fontFamily_options() {
245
251
  return availableFonts.map(({ label, alias }) => ({ label, value: alias }));
246
252
  }
247
253
  },
254
+ mounted() {
255
+ this.initFabricCanvas();
256
+ this.renderLayer();
257
+ },
258
+ beforeDestroy() {
259
+ if (this.fabricCanvas) {
260
+ this.fabricCanvas.dispose();
261
+ }
262
+ },
248
263
  methods: {
249
264
  async selectFont({ value }) {
250
265
  const font = await loadFont(value);
@@ -269,6 +284,84 @@ export default {
269
284
  },
270
285
  decreaseStrokeWidth() {
271
286
  this.strokeWidth -= 1;
287
+ },
288
+ initFabricCanvas() {
289
+ if (this.$refs.previewCanvas) {
290
+ this.fabricCanvas = new fabric.Canvas(this.$refs.previewCanvas, {
291
+ width: 300,
292
+ height: 200,
293
+ uniScaleTransform: false
294
+ });
295
+ this.fabricCanvas.renderOnAddRemove = false;
296
+ this.setupCanvasListeners();
297
+ }
298
+ },
299
+ setupCanvasListeners() {
300
+ this.fabricCanvas.on('text:editing:entered', () => {
301
+ this.isEditing = true;
302
+ });
303
+ this.fabricCanvas.on('text:editing:exited', () => {
304
+ this.isEditing = false;
305
+ if (this.textObject) {
306
+ this.syncTextFromCanvas();
307
+ }
308
+ });
309
+ this.fabricCanvas.on('object:modified', () => {
310
+ if (this.textObject) {
311
+ this.syncTextFromCanvas();
312
+ }
313
+ });
314
+ },
315
+ async renderLayer() {
316
+ try {
317
+ const layerWithDefaults = {
318
+ ...this.layer,
319
+ fontSize: 60,
320
+ copy: this.layer.copy || ' '
321
+ };
322
+ const textObj = await createText(layerWithDefaults);
323
+
324
+ const canvasCenterX = this.fabricCanvas.width / 2;
325
+ const canvasCenterY = this.fabricCanvas.height / 2;
326
+ textObj.set({
327
+ left: canvasCenterX,
328
+ top: canvasCenterY,
329
+ originX: 'center',
330
+ originY: 'center',
331
+ selectable: true,
332
+ evented: true,
333
+ hasControls: false,
334
+ hasBorders: false,
335
+ lockMovementX: true,
336
+ lockMovementY: true,
337
+ lockScalingX: true,
338
+ lockScalingY: true,
339
+ lockRotation: true,
340
+ lockUniScaling: true,
341
+ hoverCursor: 'text'
342
+ });
343
+
344
+ textObj.on('changed', () => {
345
+ this.syncTextFromCanvas();
346
+ });
347
+
348
+ this.fabricCanvas.add(textObj);
349
+ this.fabricCanvas.renderAll();
350
+ this.textObject = textObj;
351
+
352
+ this.$nextTick(() => {
353
+ this.fabricCanvas.setActiveObject(textObj);
354
+ textObj.enterEditing();
355
+ });
356
+ } catch (error) {
357
+ console.error('Error rendering layer:', error);
358
+ }
359
+ },
360
+ syncTextFromCanvas() {
361
+ if (!this.textObject || this.isUpdatingFromLayer) {
362
+ return;
363
+ }
364
+ this.copy = this.textObject.text;
272
365
  }
273
366
  }
274
367
  };
@@ -71,5 +71,19 @@
71
71
  background-color: $green;
72
72
  }
73
73
  }
74
+ &-message {
75
+ padding: 8px 10px;
76
+ justify-content: center;
77
+ align-items: center;
78
+ background: linear-gradient(180deg, #2254BD 50%, #194BB3 50%);
79
+ box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.10);
80
+ color: #FFF;
81
+ font-size: 14px;
82
+ font-weight: 300;
83
+ line-height: 20px;
84
+ display: block;
85
+ width: 100%;
86
+ margin-bottom: 10px;
87
+ }
74
88
  }
75
- }
89
+ }
@@ -57,15 +57,26 @@
57
57
 
58
58
  <div
59
59
  class="EditorLayersToolbar__option"
60
+ :class="{
61
+ disabled: disabledTemplates
62
+ }"
60
63
  @click="openPrintTemplates()">
61
- <i class="icon-layer-templates EditorLayersToolbar__option-icon"></i>
64
+ <div
65
+ v-if="disabledTemplates"
66
+ class="EditorLayersToolbar__option-message">
67
+ Coming Soon
68
+ </div>
69
+ <i
70
+ v-else
71
+ class="icon-layer-templates EditorLayersToolbar__option-icon"></i>
62
72
  <div class="lc_black">
63
- Templates
73
+ Stock Artwork
64
74
  </div>
65
75
  <div class="lc_regular14 lc_grey1 mt-5 hidden-sm-and-down">
66
- Get inspired
76
+ Add stars, hearts and other special effects
67
77
  </div>
68
78
  <v-popover
79
+ v-if="!disabledTemplates"
69
80
  trigger="hover"
70
81
  class="EditorLayersToolbar__popover hidden-sm-and-down">
71
82
  <i class="icon-info-circled EditorLayersToolbar__info"></i>
@@ -92,6 +103,12 @@ export default {
92
103
  mixins: [
93
104
  modals
94
105
  ],
106
+ props: {
107
+ disabledTemplates: {
108
+ type: Boolean,
109
+ default: false
110
+ }
111
+ },
95
112
  computed: {
96
113
  ...mapGetters(['shop']),
97
114
  ...mapGetters('product', ['product'])
@@ -31,7 +31,9 @@
31
31
  :key="side"
32
32
  :side="side"
33
33
  :print-area="editablePrintArea"
34
+ :zoom-size="sideZoomSize"
34
35
  :print-area-size="selectedPrintArea"
36
+ :visible-background-image="visibleBackgroundImage"
35
37
  :class="side"
36
38
  class="EditorWorkspace__side rotate-y-element">
37
39
  </editor-workspace-side>
@@ -68,6 +70,7 @@
68
70
  :print-area-size="selectedPrintArea"
69
71
  :class="editableSide.id"
70
72
  :zoom-size="sideZoomSize"
73
+ :visible-background-image="visibleBackgroundImage"
71
74
  class="EditorWorkspace__side rotate-y-element"
72
75
  @workspace="onWorkspaceChange($event)">
73
76
  </editor-workspace-side>
@@ -142,6 +145,14 @@ export default {
142
145
  visiblePrintAreaOptions: {
143
146
  type: Boolean,
144
147
  default: true
148
+ },
149
+ skipPreloadingEditor: {
150
+ type: Boolean,
151
+ default: false
152
+ },
153
+ visibleBackgroundImage: {
154
+ type: Boolean,
155
+ default: true
145
156
  }
146
157
  },
147
158
  data() {
@@ -218,7 +229,12 @@ export default {
218
229
  }
219
230
  },
220
231
  mounted() {
221
- this.preloadingEditor();
232
+ if (this.skipPreloadingEditor) {
233
+ this.preloading = false;
234
+ this.toggleSide(this.editableSide.id);
235
+ } else {
236
+ this.preloadingEditor();
237
+ }
222
238
  },
223
239
  methods: {
224
240
  ...mapMutations([
@@ -266,11 +282,6 @@ export default {
266
282
  selectPrintArea(pa) {
267
283
  const { printArea, size } = pa || {};
268
284
  const oldPrintArea = this.editablePrintArea;
269
- // console.log('');
270
- // console.log('selectPrintArea: ');
271
- // console.log('oldPrintArea: ', oldPrintArea);
272
- // console.log('printArea: ', printArea);
273
- // console.log('this.editableLayers: ', this.editableLayers);
274
285
  this.setEditablePrintArea(printArea);
275
286
  const oldPaId = oldPrintArea?.parentPrintArea || oldPrintArea?._id;
276
287
  const paId = printArea?.parentPrintArea || printArea?._id;
@@ -161,6 +161,10 @@ export default {
161
161
  },
162
162
  zoomSize: {
163
163
  type: Number
164
+ },
165
+ visibleBackgroundImage: {
166
+ type: Boolean,
167
+ default: true
164
168
  }
165
169
  },
166
170
  data() {
@@ -411,27 +415,28 @@ export default {
411
415
  return this.selectedLayer && this.selectedLayer.createdAt === layer.createdAt;
412
416
  },
413
417
  updateBackgroundImage() {
414
- // console.log(this.calcWorkspaceSize(true));
415
- const isMedium = this.calcWorkspaceSize(true) <= 400;
416
- const type = this.side === 'front' ? COLORS_IMAGES_TYPES.FRONT : COLORS_IMAGES_TYPES.BACK;
417
- const wireframeImageUrl = this.visibleWireframe && (isMedium ? this.wireframeImage?.medium : this.wireframeImage?.large);
418
- const onpressImageUrl = this.visibleOnpress && (isMedium ? this.onpressImage?.medium : this.onpressImage?.large);
419
- const getter = isMedium ? getMediumColorImage : getLargeColorImage;
420
- const imageUrl = wireframeImageUrl || onpressImageUrl || getter(this.product, type, this.editableColor, false, ['wireframe']);
421
- if (this.backgroundImage && this.backgroundImageUrl === imageUrl) {
422
- return this.fabricHelper.setBackgroundImage(this.backgroundImage);
423
- }
424
-
425
- this.backgroundImageLoaded = false;
426
- this.backgroundImageUrl = imageUrl;
427
- fabric.Image.fromURL(imageUrl, image => {
428
- if (this.backgroundImageUrl === imageUrl) {
429
- image.scale(this.editorSize.width / image.width);
430
- this.backgroundImage = image;
431
- this.backgroundImageLoaded = true;
432
- this.fabricHelper.setBackgroundImage(this.backgroundImage);
418
+ if (this.visibleBackgroundImage) {
419
+ const isMedium = this.calcWorkspaceSize(true) <= 400;
420
+ const type = this.side === 'front' ? COLORS_IMAGES_TYPES.FRONT : COLORS_IMAGES_TYPES.BACK;
421
+ const wireframeImageUrl = this.visibleWireframe && (isMedium ? this.wireframeImage?.medium : this.wireframeImage?.large);
422
+ const onpressImageUrl = this.visibleOnpress && (isMedium ? this.onpressImage?.medium : this.onpressImage?.large);
423
+ const getter = isMedium ? getMediumColorImage : getLargeColorImage;
424
+ const imageUrl = wireframeImageUrl || onpressImageUrl || getter(this.product, type, this.editableColor, false, ['wireframe']);
425
+ if (this.backgroundImage && this.backgroundImageUrl === imageUrl) {
426
+ return this.fabricHelper.setBackgroundImage(this.backgroundImage);
433
427
  }
434
- });
428
+
429
+ this.backgroundImageLoaded = false;
430
+ this.backgroundImageUrl = imageUrl;
431
+ fabric.Image.fromURL(imageUrl, image => {
432
+ if (this.backgroundImageUrl === imageUrl) {
433
+ image.scale(this.editorSize.width / image.width);
434
+ this.backgroundImage = image;
435
+ this.backgroundImageLoaded = true;
436
+ this.fabricHelper.setBackgroundImage(this.backgroundImage);
437
+ }
438
+ });
439
+ }
435
440
  },
436
441
  removeSelected() {
437
442
  this.removeTemplateLayer(this.selectedLayer);
@@ -1,10 +1,14 @@
1
1
  <template>
2
2
  <btn
3
- btn-class="green"
3
+ :btn-class="btnClass"
4
4
  btn-label="Add to cart"
5
5
  :btn-disabled="addToCartDisabled"
6
6
  :btn-processing="addingToCart"
7
- @onclick="proceedToCard" />
7
+ @onclick="proceedToCard">
8
+ <template slot="icon-before">
9
+ <slot name="icon-before"></slot>
10
+ </template>
11
+ </btn>
8
12
  </template>
9
13
 
10
14
  <script>
@@ -12,7 +16,13 @@ import addToCartMixin from '@lancom/shared/mixins/add-to-cart';
12
16
 
13
17
  export default {
14
18
  name: 'AddToCartBtn',
15
- mixins: [addToCartMixin]
19
+ mixins: [addToCartMixin],
20
+ props: {
21
+ btnClass: {
22
+ type: String,
23
+ default: 'green'
24
+ }
25
+ }
16
26
  };
17
27
  </script>
18
28
 
@@ -31,6 +31,7 @@
31
31
  display: flex;
32
32
  align-items: center;
33
33
  justify-content: space-between;
34
+ position: relative;
34
35
  @media (max-width: $bp-extra-small-max) {
35
36
  flex-wrap: wrap;
36
37
  justify-content: center;
@@ -75,4 +76,4 @@
75
76
  &.disabled {
76
77
  background-color: $gray;
77
78
  }
78
- }
79
+ }
@@ -89,9 +89,11 @@
89
89
  @click="toggleDetails">
90
90
  {{ showDetails ? 'Hide' : 'Show' }} detail
91
91
  </div>
92
- <add-to-cart-btn
93
- v-if="hasCartBtn"
94
- class="EditorPricing__add-to-cart-button" />
92
+ <slot>
93
+ <add-to-cart-btn
94
+ v-if="hasCartBtn"
95
+ class="EditorPricing__add-to-cart-button" />
96
+ </slot>
95
97
  </div>
96
98
  </div>
97
99
  </div>
@@ -40,6 +40,15 @@
40
40
  text-decoration: none;
41
41
  }
42
42
 
43
+ &__sku {
44
+ color: #6b7280;
45
+ font-size: 12px;
46
+ font-style: normal;
47
+ font-weight: 400;
48
+ line-height: 16px;
49
+ margin-top: 4px;
50
+ }
51
+
43
52
  &__pill {
44
53
  padding: 8px 14px;
45
54
  background: #e9efff;
@@ -16,21 +16,34 @@
16
16
  {{ product.name }}
17
17
  </a>
18
18
  </div>
19
+ <div
20
+ v-if="product.SKU"
21
+ class="OtherProduct__sku">
22
+ sku: {{ product.SKU }}
23
+ </div>
19
24
  <div
20
25
  v-if="product.isClearance"
21
26
  class="OtherProduct__price">
22
- <span v-if="product.oldPrice" class="OtherProduct__price-old">
23
- {{ minPrice | price }}
27
+ <span
28
+ v-if="product.oldPrice"
29
+ class="OtherProduct__price-old">
30
+ <price
31
+ :price="minPrice"
32
+ :with-gst="priceIncludeGST" />
24
33
  </span>
25
34
  <span class="OtherProduct__price-current">
26
- {{ product.minPrice | price }}
35
+ <price
36
+ :price="product.minPrice"
37
+ :with-gst="priceIncludeGST" />
27
38
  </span>
28
39
  </div>
29
40
  <div
30
41
  v-else
31
42
  class="OtherProduct__price">
32
43
  <span class="OtherProduct__price-current">
33
- {{ minPrice | price }}
44
+ <price
45
+ :price="minPrice"
46
+ :with-gst="priceIncludeGST" />
34
47
  </span>
35
48
  </div>
36
49
  </div>
@@ -39,18 +52,14 @@
39
52
 
40
53
  <script>
41
54
  import productPreview from '@lancom/shared/mixins/product-preview';
42
- import { mapGetters } from 'vuex';
43
- import { price } from '@lancom/shared/assets/js/utils/filters';
55
+ import Price from '@lancom/shared/components/common/price';
44
56
 
45
57
  export default {
46
58
  name: 'OtherProduct',
47
- filters: {
48
- price
59
+ components: {
60
+ Price
49
61
  },
50
- mixins: [productPreview],
51
- computed: {
52
- ...mapGetters(['currency'])
53
- }
62
+ mixins: [productPreview]
54
63
  };
55
64
  </script>
56
65
 
@@ -28,4 +28,119 @@
28
28
  &__postcode {
29
29
  margin-top: 18px;
30
30
  }
31
+
32
+ &__warning {
33
+ margin-top: 18px;
34
+ padding: 12px 16px;
35
+ background-color: #fff3cd;
36
+ border: 1px solid #ffc107;
37
+ border-radius: 4px;
38
+ display: flex;
39
+ align-items: center;
40
+ gap: 12px;
41
+ flex-wrap: wrap;
42
+
43
+ i {
44
+ color: #856404;
45
+ font-size: 18px;
46
+ }
47
+
48
+ span {
49
+ color: #856404;
50
+ font-size: 14px;
51
+ flex: 1;
52
+ }
53
+ }
54
+
55
+ &__recalculate-btn {
56
+ background-color: #ffc107;
57
+ color: #856404;
58
+ border: 1px solid #ffc107;
59
+ padding: 6px 12px;
60
+ font-weight: 600;
61
+ cursor: pointer;
62
+ border-radius: 4px;
63
+ font-size: 14px;
64
+ transition: background-color 0.2s;
65
+
66
+ &:hover {
67
+ background-color: #ffb300;
68
+ }
69
+
70
+ &:active {
71
+ background-color: #ffa000;
72
+ }
73
+ }
74
+
75
+ &__pricing {
76
+ margin-top: 18px;
77
+ padding: 16px;
78
+ background-color: #f5f5f5;
79
+ border-radius: 4px;
80
+ }
81
+
82
+ &__pricing-title {
83
+ font-weight: 600;
84
+ font-size: 14px;
85
+ color: #0A0A0A;
86
+ margin-bottom: 12px;
87
+ }
88
+
89
+ &__pricing-info {
90
+ display: flex;
91
+ flex-direction: column;
92
+ gap: 8px;
93
+ }
94
+
95
+ &__pricing-item {
96
+ font-size: 12px;
97
+ color: #737373;
98
+ }
99
+
100
+ &__pricing-total {
101
+ margin-top: 8px;
102
+ font-weight: 700;
103
+ font-size: 14px;
104
+ color: #0A0A0A;
105
+ padding-top: 8px;
106
+ border-top: 1px solid #e0e0e0;
107
+ }
108
+
109
+ &__calculating {
110
+ margin-top: 18px;
111
+ padding: 12px;
112
+ text-align: center;
113
+ color: #737373;
114
+ font-size: 14px;
115
+ }
116
+
117
+ &__recalc-warning {
118
+ margin-top: 18px;
119
+ margin-bottom: 8px;
120
+ padding: 12px 16px;
121
+ background-color: #fff3cd;
122
+ border: 1px solid #ffc107;
123
+ border-radius: 4px;
124
+ display: flex;
125
+ align-items: center;
126
+ gap: 12px;
127
+ flex-wrap: wrap;
128
+
129
+ span {
130
+ color: #856404;
131
+ font-size: 14px;
132
+ flex: 1;
133
+ }
134
+ .Btn__wrapper {
135
+ font-size: 12px;
136
+ padding: 6px;
137
+ height: 30px;
138
+ }
139
+ }
140
+
141
+ &__shipping {
142
+ margin-top: -8px;
143
+ }
31
144
  }
145
+
146
+ @import '../../checkout/cart/cart_shipments_pricing/cart-shipments-pricing.scss';