@akinon/projectzero 2.0.0-beta.20 → 2.0.0-beta.21

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 (138) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/app-template/CHANGELOG.md +138 -0
  3. package/app-template/next.config.mjs +0 -1
  4. package/app-template/package.json +31 -30
  5. package/app-template/src/app/[pz]/[...prettyurl]/page.tsx +2 -2
  6. package/app-template/src/app/[pz]/account/layout.tsx +2 -1
  7. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/blog/[slug]/page.tsx +4 -2
  8. package/app-template/src/app/[pz]/category/[pk]/page.tsx +11 -1
  9. package/app-template/src/app/[pz]/group-product/[pk]/page.tsx +2 -2
  10. package/app-template/src/app/[pz]/layout.tsx +3 -1
  11. package/app-template/src/app/[pz]/list/page.tsx +11 -1
  12. package/app-template/src/app/[pz]/page.tsx +13 -35
  13. package/app-template/src/app/[pz]/pages/[slug]/page.tsx +19 -0
  14. package/app-template/src/app/[pz]/product/[pk]/page.tsx +2 -2
  15. package/app-template/src/app/api/barcode-search/route.ts +1 -1
  16. package/app-template/src/app/api/cache/route.ts +1 -1
  17. package/app-template/src/app/api/image-proxy/route.ts +1 -1
  18. package/app-template/src/app/api/logout/route.ts +1 -1
  19. package/app-template/src/app/api/product-categories/route.ts +1 -1
  20. package/app-template/src/app/api/similar-product-list/route.ts +1 -1
  21. package/app-template/src/app/api/similar-products/route.ts +1 -1
  22. package/app-template/src/app/api/virtual-try-on/route.ts +1 -1
  23. package/app-template/src/app/api/web-vitals/route.ts +1 -1
  24. package/app-template/src/components/quantity-selector.tsx +16 -4
  25. package/app-template/src/components/widget-content.tsx +3 -3
  26. package/app-template/src/routes/index.ts +6 -6
  27. package/app-template/src/utils/__tests__/theme-page-context.test.ts +145 -0
  28. package/app-template/src/utils/theme-page-context.ts +309 -0
  29. package/app-template/src/views/basket/basket-item.tsx +107 -691
  30. package/app-template/src/views/basket/index.ts +0 -2
  31. package/app-template/src/views/basket/summary.tsx +75 -496
  32. package/app-template/src/views/breadcrumb.tsx +38 -13
  33. package/app-template/src/views/category/category-header.tsx +66 -289
  34. package/app-template/src/views/category/category-info.tsx +24 -173
  35. package/app-template/src/views/category/filters/index.tsx +48 -208
  36. package/app-template/src/views/category/layout.tsx +5 -7
  37. package/app-template/src/views/checkout/index.tsx +0 -5
  38. package/app-template/src/views/checkout/steps/payment/index.tsx +2 -5
  39. package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +1 -72
  40. package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +40 -171
  41. package/app-template/src/views/checkout/steps/shipping/address-box.tsx +12 -74
  42. package/app-template/src/views/checkout/steps/shipping/addresses.tsx +45 -128
  43. package/app-template/src/views/checkout/steps/shipping/shipping-options.tsx +27 -232
  44. package/app-template/src/views/checkout/summary.tsx +29 -303
  45. package/app-template/src/views/footer.tsx +13 -415
  46. package/app-template/src/views/guest-login/index.tsx +1 -1
  47. package/app-template/src/views/header/action-menu.tsx +45 -277
  48. package/app-template/src/views/header/band.tsx +21 -6
  49. package/app-template/src/views/header/index.tsx +47 -109
  50. package/app-template/src/views/header/mini-basket.tsx +45 -820
  51. package/app-template/src/views/header/navbar.tsx +111 -178
  52. package/app-template/src/views/header/search/index.tsx +32 -71
  53. package/app-template/src/views/header/search/results.tsx +65 -127
  54. package/app-template/src/views/product/accordion-wrapper.tsx +43 -135
  55. package/app-template/src/views/product/index.ts +1 -1
  56. package/app-template/src/views/product/layout.tsx +7 -2
  57. package/app-template/src/views/product/misc-buttons.tsx +25 -339
  58. package/app-template/src/views/product/product-actions.tsx +8 -137
  59. package/app-template/src/views/product/product-info.tsx +31 -69
  60. package/app-template/src/views/product/product-share.tsx +8 -11
  61. package/app-template/src/views/product/slider.tsx +79 -117
  62. package/app-template/src/views/product-item/index.tsx +46 -119
  63. package/app-template/src/widgets/footer-social.tsx +16 -47
  64. package/app-template/src/widgets/footer-subscription/index.tsx +17 -183
  65. package/dist/commands/plugins.js +23 -2
  66. package/package.json +1 -1
  67. package/app-template/src/app/[commerce]/[locale]/[currency]/pages/[slug]/page.tsx +0 -15
  68. package/app-template/src/views/basket/basket-summary-context.tsx +0 -560
  69. package/app-template/src/views/basket/designer-context.tsx +0 -617
  70. package/app-template/src/views/breadcrumb/breadcrumb-client.tsx +0 -190
  71. package/app-template/src/views/breadcrumb/breadcrumb-registrar.tsx +0 -286
  72. package/app-template/src/views/breadcrumb/constants.ts +0 -15
  73. package/app-template/src/views/breadcrumb/index.tsx +0 -127
  74. package/app-template/src/views/category/native-widget-context.tsx +0 -257
  75. package/app-template/src/views/category/product-list-registrar.tsx +0 -665
  76. package/app-template/src/views/checkout/checkout-address-registrar.tsx +0 -254
  77. package/app-template/src/views/checkout/checkout-buttons-registrar.tsx +0 -183
  78. package/app-template/src/views/checkout/checkout-delivery-method-registrar.tsx +0 -259
  79. package/app-template/src/views/checkout/checkout-payment-options-registrar.tsx +0 -253
  80. package/app-template/src/views/checkout/checkout-summary-registrar.tsx +0 -183
  81. package/app-template/src/views/checkout/constants.ts +0 -5
  82. package/app-template/src/views/checkout/steps/payment/options/masterpass-rest.tsx +0 -15
  83. package/app-template/src/views/checkout/steps/payment/options/saved-card.tsx +0 -18
  84. package/app-template/src/views/footer/footer-app-banner-context.tsx +0 -326
  85. package/app-template/src/views/footer/footer-bottom-context.tsx +0 -215
  86. package/app-template/src/views/footer/footer-bottom-wrapper.tsx +0 -74
  87. package/app-template/src/views/footer/footer-layout-constants.ts +0 -35
  88. package/app-template/src/views/footer/footer-layout-registrar.tsx +0 -342
  89. package/app-template/src/views/footer/footer-layout-switcher.tsx +0 -110
  90. package/app-template/src/views/footer/footer-menu-context.tsx +0 -211
  91. package/app-template/src/views/footer/footer-native-widgets.tsx +0 -60
  92. package/app-template/src/views/footer/footer-social-context.tsx +0 -254
  93. package/app-template/src/views/footer/footer-subscription-context.tsx +0 -210
  94. package/app-template/src/views/footer/footer-utils.ts +0 -43
  95. package/app-template/src/views/footer/footer-value-props-context.tsx +0 -326
  96. package/app-template/src/views/footer/logo-settings.ts +0 -183
  97. package/app-template/src/views/footer/native-widget-config.ts +0 -262
  98. package/app-template/src/views/footer/subscription-settings.ts +0 -122
  99. package/app-template/src/views/footer/use-footer-logo.ts +0 -162
  100. package/app-template/src/views/header/designer-context.tsx +0 -261
  101. package/app-template/src/views/header/header-announcement-registrar.tsx +0 -267
  102. package/app-template/src/views/header/header-client-wrapper.tsx +0 -496
  103. package/app-template/src/views/header/header-content.tsx +0 -1026
  104. package/app-template/src/views/header/header-currency-registrar.tsx +0 -348
  105. package/app-template/src/views/header/header-icons-context.tsx +0 -262
  106. package/app-template/src/views/header/header-language-registrar.tsx +0 -348
  107. package/app-template/src/views/header/header-layout-context.tsx +0 -143
  108. package/app-template/src/views/header/header-layout-registrar.tsx +0 -658
  109. package/app-template/src/views/header/header-logo-context.tsx +0 -228
  110. package/app-template/src/views/header/header-logo.tsx +0 -118
  111. package/app-template/src/views/header/header-mini-basket-context.tsx +0 -524
  112. package/app-template/src/views/header/header-search-registrar.tsx +0 -511
  113. package/app-template/src/views/header/header-text-slider-registrar.tsx +0 -382
  114. package/app-template/src/views/header/inline-search.tsx +0 -262
  115. package/app-template/src/views/header/navbar-menu-context.tsx +0 -219
  116. package/app-template/src/views/header/search/search-input.tsx +0 -61
  117. package/app-template/src/views/header/server-settings-parser.ts +0 -1105
  118. package/app-template/src/views/header/use-header-icons.ts +0 -241
  119. package/app-template/src/views/header/use-header-logo.ts +0 -213
  120. package/app-template/src/views/header/use-navbar-menu.ts +0 -179
  121. package/app-template/src/views/product/accordion-section.tsx +0 -61
  122. package/app-template/src/views/product/custom-button-group.tsx +0 -69
  123. package/app-template/src/views/product/favorites-button-section.tsx +0 -69
  124. package/app-template/src/views/product/find-in-store-section.tsx +0 -60
  125. package/app-template/src/views/product/product-info-section.tsx +0 -140
  126. package/app-template/src/views/product/quantity-section.tsx +0 -73
  127. package/app-template/src/views/product/sale-tag.tsx +0 -10
  128. package/app-template/src/views/product/share-section.tsx +0 -357
  129. package/app-template/src/views/product/variants-section.tsx +0 -126
  130. package/app-template/src/views/product-detail/constants.ts +0 -272
  131. package/app-template/src/views/product-detail/index.ts +0 -10
  132. package/app-template/src/views/product-detail/product-detail-registrar.tsx +0 -616
  133. package/app-template/src/widgets/footer-app-banner.tsx +0 -444
  134. package/app-template/src/widgets/footer-bottom.tsx +0 -127
  135. package/app-template/src/widgets/footer-menu-compact.tsx +0 -238
  136. package/app-template/src/widgets/footer-menu-two.tsx +0 -298
  137. package/app-template/src/widgets/footer-social-client.tsx +0 -251
  138. package/app-template/src/widgets/footer-value-props.tsx +0 -201
@@ -1,4 +1,2 @@
1
1
  export * from './basket-item';
2
2
  export * from './summary';
3
- export * from './designer-context';
4
- export * from './basket-summary-context';
@@ -9,19 +9,12 @@ import {
9
9
  useRemoveVoucherCodeMutation
10
10
  } from '@akinon/next/data/client/basket';
11
11
  import { Basket, Error } from '@akinon/next/types';
12
- import { Button, Input, Price, Icon } from '@theme/components';
12
+ import { Button, Input, Price } from '@theme/components';
13
13
  import { pushBeginCheckout } from '@theme/utils/gtm';
14
14
  import { ROUTES } from '@theme/routes';
15
15
  import { useLocalization, useRouter } from '@akinon/next/hooks';
16
16
  import PluginModule, { Component } from '@akinon/next/components/plugin-module';
17
17
  import clsx from 'clsx';
18
- import { useGetWidgetQuery } from '@akinon/next/data/client/misc';
19
- import {
20
- useBasketSummary,
21
- BASKET_SUMMARY_PLACEHOLDER_ID,
22
- BASKET_SUMMARY_SECTION_ID,
23
- BASKET_SUMMARY_BLOCKS
24
- } from './basket-summary-context';
25
18
 
26
19
  interface Props {
27
20
  basket: Basket;
@@ -32,32 +25,6 @@ const voucherCodeFormSchema = (t) =>
32
25
  voucherCode: yup.string().required(t('basket.summary.form.error.required'))
33
26
  });
34
27
 
35
- const convertStylesToCSS = (
36
- styles: Record<string, unknown> | undefined
37
- ): React.CSSProperties => {
38
- if (!styles) return {};
39
- const cssStyles: React.CSSProperties = {};
40
- Object.entries(styles).forEach(([key, value]) => {
41
- const rawValue =
42
- typeof value === 'object' && value !== null && 'desktop' in value
43
- ? (value as Record<string, unknown>).desktop
44
- : value;
45
-
46
- const cssValue =
47
- typeof rawValue === 'number'
48
- ? rawValue
49
- : typeof rawValue === 'string'
50
- ? rawValue
51
- : '';
52
-
53
- if (cssValue !== '' && cssValue !== null && cssValue !== undefined) {
54
- const camelKey = key.replace(/-([a-z])/g, (g) => g[1].toUpperCase());
55
- (cssStyles as Record<string, unknown>)[camelKey] = cssValue;
56
- }
57
- });
58
- return cssStyles;
59
- };
60
-
61
28
  export const Summary = (props: Props) => {
62
29
  const { t } = useLocalization();
63
30
  const { basket } = props;
@@ -76,152 +43,6 @@ export const Summary = (props: Props) => {
76
43
  const dispatch = useAppDispatch();
77
44
  const [applyVoucherCodeMutation] = useApplyVoucherCodeMutation();
78
45
  const [removeVoucherCodeMutation] = useRemoveVoucherCodeMutation();
79
- const {
80
- data: basketSummaryBenefits,
81
- isLoading: isLoadingBasketSummaryBenefits
82
- } = useGetWidgetQuery('basket-summary-benefits');
83
-
84
- const {
85
- isDesigner,
86
- isSectionSelected,
87
- selectedBlockId,
88
- getSectionStyles,
89
- getBlockData
90
- } = useBasketSummary();
91
-
92
- const handleBlockClick = (blockId: string, e?: React.MouseEvent) => {
93
- if (!isDesigner) return;
94
- e?.stopPropagation();
95
- if (typeof window !== 'undefined' && window.parent) {
96
- window.parent.postMessage(
97
- {
98
- type: 'SELECT_BLOCK_FROM_PREVIEW',
99
- data: {
100
- placeholderId: BASKET_SUMMARY_PLACEHOLDER_ID,
101
- sectionId: BASKET_SUMMARY_SECTION_ID,
102
- blockId
103
- }
104
- },
105
- '*'
106
- );
107
- }
108
- };
109
-
110
- const handleSectionClick = (e: React.MouseEvent) => {
111
- if (!isDesigner) return;
112
- e.stopPropagation();
113
- if (typeof window !== 'undefined' && window.parent) {
114
- window.parent.postMessage(
115
- {
116
- type: 'SELECT_SECTION',
117
- data: {
118
- placeholderId: BASKET_SUMMARY_PLACEHOLDER_ID,
119
- sectionId: BASKET_SUMMARY_SECTION_ID
120
- }
121
- },
122
- '*'
123
- );
124
- }
125
- };
126
-
127
- const titleBlock = getBlockData(BASKET_SUMMARY_BLOCKS.TITLE.id);
128
- const voucherSectionBlock = getBlockData(
129
- BASKET_SUMMARY_BLOCKS.VOUCHER_SECTION.id
130
- );
131
- const voucherTitleBlock = getBlockData(
132
- BASKET_SUMMARY_BLOCKS.VOUCHER_TITLE.id
133
- );
134
- const voucherFormBlock = getBlockData(BASKET_SUMMARY_BLOCKS.VOUCHER_FORM.id);
135
- const voucherInputBlock = getBlockData(
136
- BASKET_SUMMARY_BLOCKS.VOUCHER_INPUT.id
137
- );
138
- const voucherButtonBlock = getBlockData(
139
- BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id
140
- );
141
- const priceSectionBlock = getBlockData(
142
- BASKET_SUMMARY_BLOCKS.PRICE_SECTION.id
143
- );
144
- const subtotalRowBlock = getBlockData(BASKET_SUMMARY_BLOCKS.SUBTOTAL_ROW.id);
145
- const subtotalLabelBlock = getBlockData(
146
- BASKET_SUMMARY_BLOCKS.SUBTOTAL_LABEL.id
147
- );
148
- const subtotalPriceBlock = getBlockData(
149
- BASKET_SUMMARY_BLOCKS.SUBTOTAL_PRICE.id
150
- );
151
- const discountItemRowBlock = getBlockData(
152
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_ROW.id
153
- );
154
- const discountItemLabelBlock = getBlockData(
155
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_LABEL.id
156
- );
157
- const discountItemPriceBlock = getBlockData(
158
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_PRICE.id
159
- );
160
- const discountsTotalLabelBlock = getBlockData(
161
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_LABEL.id
162
- );
163
- const discountsTotalPriceBlock = getBlockData(
164
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_PRICE.id
165
- );
166
- const discountsTotalRowBlock = getBlockData(
167
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_ROW.id
168
- );
169
- const totalRowBlock = getBlockData(BASKET_SUMMARY_BLOCKS.TOTAL_ROW.id);
170
- const totalLabelBlock = getBlockData(BASKET_SUMMARY_BLOCKS.TOTAL_LABEL.id);
171
- const totalPriceBlock = getBlockData(BASKET_SUMMARY_BLOCKS.TOTAL_PRICE.id);
172
- const checkoutSectionBlock = getBlockData(
173
- BASKET_SUMMARY_BLOCKS.CHECKOUT_SECTION.id
174
- );
175
- const checkoutButtonBlock = getBlockData(
176
- BASKET_SUMMARY_BLOCKS.CHECKOUT_BUTTON.id
177
- );
178
-
179
- const sectionStyles = convertStylesToCSS(getSectionStyles());
180
- const titleStyles = convertStylesToCSS(titleBlock?.styles);
181
- const voucherSectionStyles = convertStylesToCSS(voucherSectionBlock?.styles);
182
- const voucherTitleStyles = convertStylesToCSS(voucherTitleBlock?.styles);
183
- const voucherFormStyles = convertStylesToCSS(voucherFormBlock?.styles);
184
- const voucherInputStyles = convertStylesToCSS(voucherInputBlock?.styles);
185
- const voucherButtonStyles = convertStylesToCSS(voucherButtonBlock?.styles);
186
- const priceSectionStyles = convertStylesToCSS(priceSectionBlock?.styles);
187
- const subtotalRowStyles = convertStylesToCSS(subtotalRowBlock?.styles);
188
- const subtotalLabelStyles = convertStylesToCSS(subtotalLabelBlock?.styles);
189
- const subtotalPriceStyles = convertStylesToCSS(subtotalPriceBlock?.styles);
190
- const discountItemRowStyles = convertStylesToCSS(
191
- discountItemRowBlock?.styles
192
- );
193
- const discountItemLabelStyles = convertStylesToCSS(
194
- discountItemLabelBlock?.styles
195
- );
196
- const discountItemPriceStyles = convertStylesToCSS(
197
- discountItemPriceBlock?.styles
198
- );
199
- const discountsTotalLabelStyles = convertStylesToCSS(
200
- discountsTotalLabelBlock?.styles
201
- );
202
- const discountsTotalPriceStyles = convertStylesToCSS(
203
- discountsTotalPriceBlock?.styles
204
- );
205
- const discountsTotalRowStyles = convertStylesToCSS(
206
- discountsTotalRowBlock?.styles
207
- );
208
- const totalRowStyles = convertStylesToCSS(totalRowBlock?.styles);
209
- const totalLabelStyles = convertStylesToCSS(totalLabelBlock?.styles);
210
- const totalPriceStyles = convertStylesToCSS(totalPriceBlock?.styles);
211
- const checkoutSectionStyles = convertStylesToCSS(
212
- checkoutSectionBlock?.styles
213
- );
214
- const checkoutButtonStyles = convertStylesToCSS(checkoutButtonBlock?.styles);
215
-
216
- const ringClass = (blockId: string) =>
217
- isDesigner
218
- ? clsx(
219
- 'relative cursor-pointer',
220
- selectedBlockId === blockId
221
- ? 'ring-2 ring-blue-500 ring-inset'
222
- : 'hover:ring-2 hover:ring-blue-300 hover:ring-inset'
223
- )
224
- : '';
225
46
 
226
47
  useEffect(() => {
227
48
  if (basket.voucher_code) {
@@ -272,7 +93,6 @@ export const Summary = (props: Props) => {
272
93
  const checkoutProviderProps = {
273
94
  className: clsx([
274
95
  'py-2.5',
275
- 'h-[50px]',
276
96
  'bg-black',
277
97
  'relative',
278
98
  'hover:bg-black',
@@ -301,72 +121,57 @@ export const Summary = (props: Props) => {
301
121
  }, [basket]);
302
122
 
303
123
  return (
304
- <div
305
- className={clsx(
306
- 'w-full xl:w-[400px] bg-gray-30 p-6',
307
- isDesigner &&
308
- 'relative cursor-pointer hover:ring-2 hover:ring-blue-300 hover:ring-inset',
309
- isDesigner && isSectionSelected && 'ring-2 ring-blue-500 ring-inset'
310
- )}
311
- style={sectionStyles}
312
- onClick={handleSectionClick}
313
- >
314
- <h2
315
- className={clsx(
316
- 'tracking-[-0.31px] text-black-850 mb-6',
317
- ringClass(BASKET_SUMMARY_BLOCKS.TITLE.id)
318
- )}
319
- style={titleStyles}
320
- onClick={(e) => handleBlockClick(BASKET_SUMMARY_BLOCKS.TITLE.id, e)}
321
- >
322
- {t('basket.summary.title')}
323
- </h2>
324
- <div
325
- className={clsx(
326
- 'flex flex-col gap-3 mb-5',
327
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_SECTION.id)
124
+ <div className="w-full xl:w-[300px]">
125
+ <div className="py-3 border-b border-gray-200 flex justify-between items-end">
126
+ <h2 className="text-xl font-light">{t('basket.summary.title')}</h2>
127
+ <span className="text-xs" data-testid="basket-count">
128
+ {basket.basketitem_set.map((x) => x.quantity).reduce((a, b) => a + b)}{' '}
129
+ {t('basket.summary.items').toUpperCase()}
130
+ </span>
131
+ </div>
132
+ <div className="py-3 border-b border-gray-200 text-xs leading-6">
133
+ <div className="flex justify-between">
134
+ <p>
135
+ {t('basket.summary.subtotal')} (
136
+ {basket.basketitem_set
137
+ .map((x) => x.quantity)
138
+ .reduce((a, b) => a + b)}{' '}
139
+ {t('basket.summary.items')})
140
+ </p>
141
+ <p>
142
+ <Price value={basket.total_product_amount} />
143
+ </p>
144
+ </div>
145
+ {basket.discounts.length > 0 && (
146
+ <>
147
+ {basket.discounts.map((discount, index) => (
148
+ <div key={index} className="flex justify-between text-secondary">
149
+ <p data-testid="basket-voucher-code">{discount.description}</p>
150
+ <Price value={discount.discount} useNegative />
151
+ </div>
152
+ ))}
153
+ <div className="flex justify-between">
154
+ <p>{t('basket.summary.discounts_total')}</p>
155
+ <Price
156
+ value={basket.discounts.reduce(
157
+ (acc, curr) => acc + Number(curr.discount),
158
+ 0
159
+ )}
160
+ useNegative
161
+ />
162
+ </div>
163
+ </>
328
164
  )}
329
- style={voucherSectionStyles}
330
- onClick={(e) =>
331
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_SECTION.id, e)
332
- }
333
- >
334
- <h3
335
- className={clsx(
336
- 'text-sm text-black-850 tracking-[-0.15px]',
337
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_TITLE.id)
338
- )}
339
- style={voucherTitleStyles}
340
- onClick={(e) =>
341
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_TITLE.id, e)
342
- }
343
- >
165
+ </div>
166
+ <div className="bg-gray-50 py-3 px-5 border-b border-gray-200 text-xs">
167
+ <p className="mb-3 text-lg font-light">
344
168
  {t('basket.summary.form.title')}
345
- </h3>
346
- <form
347
- onSubmit={handleSubmit(onSubmit)}
348
- className={clsx(
349
- 'flex w-full gap-2',
350
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_FORM.id)
351
- )}
352
- style={voucherFormStyles}
353
- onClick={(e) =>
354
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_FORM.id, e)
355
- }
356
- >
357
- <div
358
- className={clsx(
359
- 'w-full',
360
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_INPUT.id)
361
- )}
362
- onClick={(e) =>
363
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_INPUT.id, e)
364
- }
365
- >
169
+ </p>
170
+ <form onSubmit={handleSubmit(onSubmit)} className="flex w-full">
171
+ <div className="w-full md:w-1/2 lg:w-auto">
366
172
  <Input
367
173
  placeholder={t('basket.summary.form.placeholder')}
368
- className="h-[38px] w-full"
369
- style={voucherInputStyles}
174
+ className="h-9 w-full lg:w-40"
370
175
  data-testid="basket-voucher-input"
371
176
  {...register('voucherCode')}
372
177
  error={errors.voucherCode}
@@ -375,238 +180,34 @@ export const Summary = (props: Props) => {
375
180
  </div>
376
181
  {basket.voucher_code ? (
377
182
  <Button
378
- className={clsx(
379
- 'h-[38px] w-16 px-0 shrink-0 text-sm placeholder:text-sm',
380
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id)
381
- )}
382
- appearance="filled"
383
- style={voucherButtonStyles}
183
+ className="h-9 w-20 px-0 border-gray-500 border-l-0"
184
+ appearance="outlined"
384
185
  data-testid="basket-voucher-remove"
385
186
  type="button"
386
- onClick={(e) => {
387
- if (isDesigner) {
388
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id, e);
389
- } else {
390
- removeVoucherCode();
391
- }
392
- }}
187
+ onClick={removeVoucherCode}
393
188
  >
394
189
  {t('basket.summary.remove')}
395
190
  </Button>
396
191
  ) : (
397
192
  <Button
398
- className={clsx(
399
- 'h-[38px] w-16 px-0 shrink-0 text-sm placeholder:text-sm',
400
- ringClass(BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id)
401
- )}
402
- appearance="filled"
403
- style={voucherButtonStyles}
193
+ className="h-9 w-20 px-0 border-gray-500 border-l-0"
194
+ appearance="outlined"
404
195
  data-testid="basket-voucher-submit"
405
- onClick={(e) => {
406
- if (isDesigner) {
407
- handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id, e);
408
- }
409
- }}
410
196
  >
411
197
  {t('basket.summary.submit')}
412
198
  </Button>
413
199
  )}
414
200
  </form>
415
201
  </div>
416
-
417
- <div
418
- className={clsx(
419
- 'text-black-850 text-sm tracking-[-0.15px] flex flex-col gap-3 border-y border-black/10 mb-6 py-6',
420
- ringClass(BASKET_SUMMARY_BLOCKS.PRICE_SECTION.id)
421
- )}
422
- style={priceSectionStyles}
423
- onClick={(e) =>
424
- handleBlockClick(BASKET_SUMMARY_BLOCKS.PRICE_SECTION.id, e)
425
- }
426
- >
427
- <div
428
- className={clsx(
429
- 'flex justify-between',
430
- ringClass(BASKET_SUMMARY_BLOCKS.SUBTOTAL_ROW.id)
431
- )}
432
- style={subtotalRowStyles}
433
- onClick={(e) =>
434
- handleBlockClick(BASKET_SUMMARY_BLOCKS.SUBTOTAL_ROW.id, e)
435
- }
436
- >
437
- <p
438
- className={ringClass(BASKET_SUMMARY_BLOCKS.SUBTOTAL_LABEL.id)}
439
- style={subtotalLabelStyles}
440
- onClick={(e) =>
441
- handleBlockClick(BASKET_SUMMARY_BLOCKS.SUBTOTAL_LABEL.id, e)
442
- }
443
- >
444
- {t('basket.summary.subtotal')}
445
- </p>
446
- <p
447
- className={ringClass(BASKET_SUMMARY_BLOCKS.SUBTOTAL_PRICE.id)}
448
- style={subtotalPriceStyles}
449
- onClick={(e) =>
450
- handleBlockClick(BASKET_SUMMARY_BLOCKS.SUBTOTAL_PRICE.id, e)
451
- }
452
- >
453
- <Price value={basket.total_product_amount} />
454
- </p>
455
- </div>
456
-
457
- {basket.discounts.length > 0 && (
458
- <>
459
- {basket.discounts.map((discount, index) => (
460
- <div
461
- key={index}
462
- className={clsx(
463
- 'flex justify-between',
464
- ringClass(BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_ROW.id)
465
- )}
466
- style={discountItemRowStyles}
467
- onClick={(e) =>
468
- handleBlockClick(
469
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_ROW.id,
470
- e
471
- )
472
- }
473
- >
474
- <p
475
- data-testid="basket-voucher-code"
476
- className={ringClass(
477
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_LABEL.id
478
- )}
479
- style={discountItemLabelStyles}
480
- onClick={(e) =>
481
- handleBlockClick(
482
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_LABEL.id,
483
- e
484
- )
485
- }
486
- >
487
- {discount.description}
488
- </p>
489
- <Price
490
- value={discount.discount}
491
- className={ringClass(
492
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_PRICE.id
493
- )}
494
- style={discountItemPriceStyles}
495
- onClick={(e) =>
496
- handleBlockClick(
497
- BASKET_SUMMARY_BLOCKS.DISCOUNT_ITEM_PRICE.id,
498
- e
499
- )
500
- }
501
- useNegative
502
- />
503
- </div>
504
- ))}
505
- <div
506
- className={clsx(
507
- 'flex justify-between',
508
- ringClass(BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_ROW.id)
509
- )}
510
- style={discountsTotalRowStyles}
511
- onClick={(e) =>
512
- handleBlockClick(
513
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_ROW.id,
514
- e
515
- )
516
- }
517
- >
518
- <p
519
- className={ringClass(
520
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_LABEL.id
521
- )}
522
- style={discountsTotalLabelStyles}
523
- onClick={(e) =>
524
- handleBlockClick(
525
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_LABEL.id,
526
- e
527
- )
528
- }
529
- >
530
- {t('basket.summary.discounts_total')}
531
- </p>
532
- <Price
533
- value={basket.discounts.reduce(
534
- (acc, curr) => acc + Number(curr.discount),
535
- 0
536
- )}
537
- className={ringClass(
538
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_PRICE.id
539
- )}
540
- style={discountsTotalPriceStyles}
541
- onClick={(e) =>
542
- handleBlockClick(
543
- BASKET_SUMMARY_BLOCKS.DISCOUNTS_TOTAL_PRICE.id,
544
- e
545
- )
546
- }
547
- useNegative
548
- />
549
- </div>
550
- </>
551
- )}
552
- <div
553
- className={clsx(
554
- 'flex justify-between mt-2.5',
555
- ringClass(BASKET_SUMMARY_BLOCKS.TOTAL_ROW.id)
556
- )}
557
- style={totalRowStyles}
558
- onClick={(e) =>
559
- handleBlockClick(BASKET_SUMMARY_BLOCKS.TOTAL_ROW.id, e)
560
- }
561
- >
562
- <h2
563
- className={clsx(
564
- 'text-base tracking-[-0.31px]',
565
- ringClass(BASKET_SUMMARY_BLOCKS.TOTAL_LABEL.id)
566
- )}
567
- style={totalLabelStyles}
568
- onClick={(e) =>
569
- handleBlockClick(BASKET_SUMMARY_BLOCKS.TOTAL_LABEL.id, e)
570
- }
571
- >
572
- {t('basket.summary.total')}
573
- </h2>
574
- <Price
575
- value={basket.total_amount}
576
- className={clsx(
577
- 'text-xl tracking-[-0.45px]',
578
- ringClass(BASKET_SUMMARY_BLOCKS.TOTAL_PRICE.id)
579
- )}
580
- style={totalPriceStyles}
581
- data-testid="basket-total"
582
- onClick={(e) =>
583
- handleBlockClick(BASKET_SUMMARY_BLOCKS.TOTAL_PRICE.id, e)
584
- }
585
- />
202
+ <div>
203
+ <div className="flex justify-between py-3 text-xl">
204
+ <h2 className="font-light">{t('basket.summary.total')}</h2>
205
+ <Price value={basket.total_amount} data-testid="basket-total" />
586
206
  </div>
587
- </div>
588
- <div
589
- className={clsx(
590
- 'flex flex-col border-b border-black/10 pb-3 mb-6',
591
- ringClass(BASKET_SUMMARY_BLOCKS.CHECKOUT_SECTION.id)
592
- )}
593
- style={checkoutSectionStyles}
594
- onClick={(e) =>
595
- handleBlockClick(BASKET_SUMMARY_BLOCKS.CHECKOUT_SECTION.id, e)
596
- }
597
- >
598
207
  <Button
599
- className={clsx(
600
- 'w-full h-[50px] font-base tracking-[-0.64px]',
601
- ringClass(BASKET_SUMMARY_BLOCKS.CHECKOUT_BUTTON.id)
602
- )}
603
- style={checkoutButtonStyles}
604
- onClick={(e) => {
605
- if (isDesigner) {
606
- handleBlockClick(BASKET_SUMMARY_BLOCKS.CHECKOUT_BUTTON.id, e);
607
- } else {
608
- router.push(ROUTES.CHECKOUT);
609
- }
208
+ className="w-full"
209
+ onClick={() => {
210
+ router.push(ROUTES.CHECKOUT);
610
211
  }}
611
212
  data-testid="basket-checkout"
612
213
  >
@@ -623,43 +224,21 @@ export const Summary = (props: Props) => {
623
224
  props={checkoutProviderProps}
624
225
  />
625
226
 
626
- <PluginModule
627
- component={Component.BasketVirtualTryOn}
628
- props={{
629
- basketItems: basket.basketitem_set.map((item) => ({
630
- pk: item.product.pk,
631
- sku: item.product.sku,
632
- name: item.product.name,
633
- productimage_set: item.product.productimage_set,
634
- attributes: item.product.attributes,
635
- category: (item.product as any).category
636
- }))
637
- }}
638
- />
639
- </div>
640
- <div className="flex flex-col gap-2">
641
- {isLoadingBasketSummaryBenefits ? (
642
- <>
643
- {[1, 2, 3].map((i) => (
644
- <div key={i} className="flex items-center gap-1.5 animate-pulse">
645
- <div className="w-3 h-3 bg-gray-200 rounded" />
646
- <div className="h-3 bg-gray-200 rounded w-3/4" />
647
- </div>
648
- ))}
649
- </>
650
- ) : (
651
- basketSummaryBenefits?.attributes?.basket_summary_benefits?.map(
652
- (benefit, index) => (
653
- <div
654
- key={index}
655
- className="flex items-center text-black-850 gap-1.5"
656
- >
657
- <Icon name="check" size={12} />
658
- <span className="text-xs">{benefit?.value?.title}</span>
659
- </div>
660
- )
661
- )
662
- )}
227
+ <div className="mt-4">
228
+ <PluginModule
229
+ component={Component.BasketVirtualTryOn}
230
+ props={{
231
+ basketItems: basket.basketitem_set.map((item) => ({
232
+ pk: item.product.pk,
233
+ sku: item.product.sku,
234
+ name: item.product.name,
235
+ productimage_set: item.product.productimage_set,
236
+ attributes: item.product.attributes,
237
+ category: (item.product as any).category
238
+ }))
239
+ }}
240
+ />
241
+ </div>
663
242
  </div>
664
243
  </div>
665
244
  );