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

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 (223) hide show
  1. package/CHANGELOG.md +9 -7
  2. package/app-template/CHANGELOG.md +251 -204
  3. package/app-template/akinon.json +1 -1
  4. package/app-template/package.json +28 -28
  5. package/app-template/public/amex.svg +12 -0
  6. package/app-template/public/apple-pay.svg +16 -0
  7. package/app-template/public/assets/images/product-placeholder-1.jpg +0 -0
  8. package/app-template/public/assets/images/product-placeholder-2.jpg +0 -0
  9. package/app-template/public/assets/images/product-placeholder-3.jpg +0 -0
  10. package/app-template/public/assets/images/product-placeholder-4.jpg +0 -0
  11. package/app-template/public/google-pay.svg +16 -0
  12. package/app-template/public/locales/en/account.json +6 -3
  13. package/app-template/public/locales/en/auth.json +6 -7
  14. package/app-template/public/locales/en/basket.json +6 -6
  15. package/app-template/public/locales/en/blog.json +7 -0
  16. package/app-template/public/locales/en/category.json +3 -1
  17. package/app-template/public/locales/en/checkout.json +5 -4
  18. package/app-template/public/locales/en/common.json +11 -2
  19. package/app-template/public/locales/en/forgot_password.json +6 -7
  20. package/app-template/public/locales/en/product.json +4 -3
  21. package/app-template/public/locales/tr/account.json +6 -3
  22. package/app-template/public/locales/tr/auth.json +16 -17
  23. package/app-template/public/locales/tr/basket.json +4 -4
  24. package/app-template/public/locales/tr/blog.json +7 -0
  25. package/app-template/public/locales/tr/category.json +3 -1
  26. package/app-template/public/locales/tr/checkout.json +39 -38
  27. package/app-template/public/locales/tr/common.json +10 -1
  28. package/app-template/public/locales/tr/forgot_password.json +12 -13
  29. package/app-template/public/locales/tr/product.json +1 -0
  30. package/app-template/public/logo.svg +3 -27
  31. package/app-template/public/mastercard.svg +14 -0
  32. package/app-template/public/promotion-banner.jpg +0 -0
  33. package/app-template/public/shop-pay.svg +12 -0
  34. package/app-template/public/visa.svg +12 -0
  35. package/app-template/src/app/[commerce]/[locale]/[currency]/blog/[slug]/page.tsx +118 -0
  36. package/app-template/src/app/[commerce]/[locale]/[currency]/pages/[slug]/page.tsx +15 -0
  37. package/app-template/src/app/api/theme-settings/route.ts +12 -0
  38. package/app-template/src/assets/fonts/pz-icon.css +211 -49
  39. package/app-template/src/assets/fonts/pz-icon.eot +0 -0
  40. package/app-template/src/assets/fonts/pz-icon.html +486 -0
  41. package/app-template/src/assets/fonts/pz-icon.scss +373 -49
  42. package/app-template/src/assets/fonts/pz-icon.svg +215 -53
  43. package/app-template/src/assets/fonts/pz-icon.ttf +0 -0
  44. package/app-template/src/assets/fonts/pz-icon.woff +0 -0
  45. package/app-template/src/assets/fonts/pz-icon.woff2 +0 -0
  46. package/app-template/src/assets/globals.scss +4 -0
  47. package/app-template/src/assets/icons/arrow-right.svg +3 -0
  48. package/app-template/src/assets/icons/cart.svg +4 -12
  49. package/app-template/src/assets/icons/check.svg +2 -18
  50. package/app-template/src/assets/icons/chevron-down.svg +2 -7
  51. package/app-template/src/assets/icons/delete.svg +3 -0
  52. package/app-template/src/assets/icons/facebook.svg +2 -8
  53. package/app-template/src/assets/icons/fav-off.svg +5 -0
  54. package/app-template/src/assets/icons/fav-on.svg +5 -0
  55. package/app-template/src/assets/icons/filter-and-sort.svg +3 -0
  56. package/app-template/src/assets/icons/heart.svg +3 -0
  57. package/app-template/src/assets/icons/instagram.svg +2 -13
  58. package/app-template/src/assets/icons/materials.svg +3 -0
  59. package/app-template/src/assets/icons/person.svg +4 -0
  60. package/app-template/src/assets/icons/pinterest.svg +5 -11
  61. package/app-template/src/assets/icons/ruler.svg +3 -0
  62. package/app-template/src/assets/icons/search.svg +8 -11
  63. package/app-template/src/assets/icons/share.svg +2 -9
  64. package/app-template/src/assets/icons/snapchat.svg +3 -0
  65. package/app-template/src/assets/icons/tiktok.svg +3 -0
  66. package/app-template/src/assets/icons/tumblr.svg +6 -0
  67. package/app-template/src/assets/icons/twitter.svg +2 -10
  68. package/app-template/src/assets/icons/vimeo.svg +3 -0
  69. package/app-template/src/assets/icons/youtube.svg +3 -0
  70. package/app-template/src/assets/icons/zoom.svg +8 -0
  71. package/app-template/src/components/accordion.tsx +33 -11
  72. package/app-template/src/components/action-tooltip.tsx +160 -0
  73. package/app-template/src/components/currency-select.tsx +149 -4
  74. package/app-template/src/components/icon.tsx +5 -6
  75. package/app-template/src/components/index.ts +4 -1
  76. package/app-template/src/components/language-select.tsx +88 -2
  77. package/app-template/src/components/pagination.tsx +132 -20
  78. package/app-template/src/components/quantity-input.tsx +63 -0
  79. package/app-template/src/components/quantity-selector.tsx +203 -0
  80. package/app-template/src/components/route-handler.tsx +50 -0
  81. package/app-template/src/components/select.tsx +89 -69
  82. package/app-template/src/components/types/index.ts +26 -0
  83. package/app-template/src/components/widget-content.tsx +323 -0
  84. package/app-template/src/data/server/theme.ts +70 -0
  85. package/app-template/src/hooks/use-fav-button.tsx +5 -2
  86. package/app-template/src/hooks/use-product-cart.ts +11 -8
  87. package/app-template/src/hooks/use-theme-settings.ts +42 -0
  88. package/app-template/src/lib/fonts.ts +149 -0
  89. package/app-template/src/settings.js +2 -2
  90. package/app-template/src/types/hookform-resolvers-yup.d.ts +28 -0
  91. package/app-template/src/types/widget.ts +169 -0
  92. package/app-template/src/utils/formatDate.ts +48 -0
  93. package/app-template/src/utils/styles.ts +71 -0
  94. package/app-template/src/views/account/contact-form.tsx +147 -130
  95. package/app-template/src/views/basket/basket-item.tsx +691 -107
  96. package/app-template/src/views/basket/basket-summary-context.tsx +560 -0
  97. package/app-template/src/views/basket/designer-context.tsx +617 -0
  98. package/app-template/src/views/basket/index.ts +2 -0
  99. package/app-template/src/views/basket/summary.tsx +496 -75
  100. package/app-template/src/views/breadcrumb/breadcrumb-client.tsx +190 -0
  101. package/app-template/src/views/breadcrumb/breadcrumb-registrar.tsx +286 -0
  102. package/app-template/src/views/breadcrumb/constants.ts +15 -0
  103. package/app-template/src/views/breadcrumb/index.tsx +127 -0
  104. package/app-template/src/views/breadcrumb.tsx +13 -38
  105. package/app-template/src/views/category/category-banner.tsx +4 -23
  106. package/app-template/src/views/category/category-header.tsx +289 -66
  107. package/app-template/src/views/category/category-info.tsx +173 -24
  108. package/app-template/src/views/category/filters/filter-item.tsx +138 -42
  109. package/app-template/src/views/category/filters/index.tsx +208 -48
  110. package/app-template/src/views/category/layout.tsx +7 -4
  111. package/app-template/src/views/category/native-widget-context.tsx +257 -0
  112. package/app-template/src/views/category/product-list-registrar.tsx +665 -0
  113. package/app-template/src/views/checkout/auth.tsx +64 -40
  114. package/app-template/src/views/checkout/checkout-address-registrar.tsx +254 -0
  115. package/app-template/src/views/checkout/checkout-buttons-registrar.tsx +183 -0
  116. package/app-template/src/views/checkout/checkout-delivery-method-registrar.tsx +259 -0
  117. package/app-template/src/views/checkout/checkout-payment-options-registrar.tsx +253 -0
  118. package/app-template/src/views/checkout/checkout-summary-registrar.tsx +183 -0
  119. package/app-template/src/views/checkout/constants.ts +5 -0
  120. package/app-template/src/views/checkout/index.tsx +5 -0
  121. package/app-template/src/views/checkout/layout/header.tsx +9 -5
  122. package/app-template/src/views/checkout/steps/payment/index.tsx +5 -2
  123. package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +72 -1
  124. package/app-template/src/views/checkout/steps/payment/options/masterpass-rest.tsx +15 -0
  125. package/app-template/src/views/checkout/steps/payment/options/saved-card.tsx +18 -0
  126. package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +171 -40
  127. package/app-template/src/views/checkout/steps/shipping/address-box.tsx +74 -12
  128. package/app-template/src/views/checkout/steps/shipping/addresses.tsx +128 -45
  129. package/app-template/src/views/checkout/steps/shipping/shipping-options.tsx +232 -27
  130. package/app-template/src/views/checkout/summary.tsx +303 -29
  131. package/app-template/src/views/footer/footer-app-banner-context.tsx +326 -0
  132. package/app-template/src/views/footer/footer-bottom-context.tsx +215 -0
  133. package/app-template/src/views/footer/footer-bottom-wrapper.tsx +74 -0
  134. package/app-template/src/views/footer/footer-layout-constants.ts +35 -0
  135. package/app-template/src/views/footer/footer-layout-registrar.tsx +342 -0
  136. package/app-template/src/views/footer/footer-layout-switcher.tsx +110 -0
  137. package/app-template/src/views/footer/footer-menu-context.tsx +211 -0
  138. package/app-template/src/views/footer/footer-native-widgets.tsx +60 -0
  139. package/app-template/src/views/footer/footer-social-context.tsx +254 -0
  140. package/app-template/src/views/footer/footer-subscription-context.tsx +210 -0
  141. package/app-template/src/views/footer/footer-utils.ts +43 -0
  142. package/app-template/src/views/footer/footer-value-props-context.tsx +326 -0
  143. package/app-template/src/views/footer/logo-settings.ts +183 -0
  144. package/app-template/src/views/footer/native-widget-config.ts +262 -0
  145. package/app-template/src/views/footer/subscription-settings.ts +122 -0
  146. package/app-template/src/views/footer/use-footer-logo.ts +162 -0
  147. package/app-template/src/views/footer.tsx +415 -13
  148. package/app-template/src/views/guest-login/index.tsx +62 -58
  149. package/app-template/src/views/header/action-menu.tsx +277 -45
  150. package/app-template/src/views/header/band.tsx +6 -21
  151. package/app-template/src/views/header/designer-context.tsx +261 -0
  152. package/app-template/src/views/header/header-announcement-registrar.tsx +267 -0
  153. package/app-template/src/views/header/header-client-wrapper.tsx +496 -0
  154. package/app-template/src/views/header/header-content.tsx +1026 -0
  155. package/app-template/src/views/header/header-currency-registrar.tsx +348 -0
  156. package/app-template/src/views/header/header-icons-context.tsx +262 -0
  157. package/app-template/src/views/header/header-language-registrar.tsx +348 -0
  158. package/app-template/src/views/header/header-layout-context.tsx +143 -0
  159. package/app-template/src/views/header/header-layout-registrar.tsx +658 -0
  160. package/app-template/src/views/header/header-logo-context.tsx +228 -0
  161. package/app-template/src/views/header/header-logo.tsx +118 -0
  162. package/app-template/src/views/header/header-mini-basket-context.tsx +524 -0
  163. package/app-template/src/views/header/header-search-registrar.tsx +511 -0
  164. package/app-template/src/views/header/header-text-slider-registrar.tsx +382 -0
  165. package/app-template/src/views/header/index.tsx +109 -47
  166. package/app-template/src/views/header/inline-search.tsx +262 -0
  167. package/app-template/src/views/header/mini-basket.tsx +819 -44
  168. package/app-template/src/views/header/mobile-hamburger-button.tsx +5 -8
  169. package/app-template/src/views/header/mobile-menu.tsx +12 -0
  170. package/app-template/src/views/header/navbar-menu-context.tsx +219 -0
  171. package/app-template/src/views/header/navbar.tsx +178 -111
  172. package/app-template/src/views/header/search/index.tsx +71 -32
  173. package/app-template/src/views/header/search/results.tsx +127 -65
  174. package/app-template/src/views/header/search/search-input.tsx +61 -0
  175. package/app-template/src/views/header/server-settings-parser.ts +1105 -0
  176. package/app-template/src/views/header/use-header-icons.ts +241 -0
  177. package/app-template/src/views/header/use-header-logo.ts +213 -0
  178. package/app-template/src/views/header/use-navbar-menu.ts +179 -0
  179. package/app-template/src/views/login/index.tsx +54 -46
  180. package/app-template/src/views/product/accordion-section.tsx +61 -0
  181. package/app-template/src/views/product/accordion-wrapper.tsx +135 -43
  182. package/app-template/src/views/product/custom-button-group.tsx +69 -0
  183. package/app-template/src/views/product/favorites-button-section.tsx +69 -0
  184. package/app-template/src/views/product/find-in-store-section.tsx +60 -0
  185. package/app-template/src/views/product/index.ts +1 -0
  186. package/app-template/src/views/product/layout.tsx +6 -5
  187. package/app-template/src/views/product/misc-buttons.tsx +339 -25
  188. package/app-template/src/views/product/price-wrapper.tsx +3 -29
  189. package/app-template/src/views/product/product-actions.tsx +137 -8
  190. package/app-template/src/views/product/product-info-section.tsx +140 -0
  191. package/app-template/src/views/product/product-info.tsx +69 -31
  192. package/app-template/src/views/product/product-share.tsx +13 -8
  193. package/app-template/src/views/product/product-variants.tsx +2 -2
  194. package/app-template/src/views/product/quantity-section.tsx +73 -0
  195. package/app-template/src/views/product/sale-tag.tsx +10 -0
  196. package/app-template/src/views/product/share-section.tsx +357 -0
  197. package/app-template/src/views/product/slider.tsx +117 -79
  198. package/app-template/src/views/product/variant.tsx +69 -41
  199. package/app-template/src/views/product/variants-section.tsx +126 -0
  200. package/app-template/src/views/product-detail/constants.ts +272 -0
  201. package/app-template/src/views/product-detail/index.ts +10 -0
  202. package/app-template/src/views/product-detail/product-detail-registrar.tsx +616 -0
  203. package/app-template/src/views/product-item/index.tsx +119 -46
  204. package/app-template/src/views/register/index.tsx +14 -25
  205. package/app-template/src/views/share/index.tsx +9 -6
  206. package/app-template/src/views/widgets/home-hero-slider-content.tsx +41 -39
  207. package/app-template/src/widgets/flatpages/about-us/index.tsx +78 -0
  208. package/app-template/src/widgets/flatpages/blog-list/index.tsx +129 -0
  209. package/app-template/src/widgets/footer-app-banner.tsx +444 -0
  210. package/app-template/src/widgets/footer-bottom.tsx +127 -0
  211. package/app-template/src/widgets/footer-menu-compact.tsx +238 -0
  212. package/app-template/src/widgets/footer-menu-two.tsx +298 -0
  213. package/app-template/src/widgets/footer-social-client.tsx +251 -0
  214. package/app-template/src/widgets/footer-social.tsx +47 -16
  215. package/app-template/src/widgets/footer-subscription/footer-subscription-form.tsx +17 -14
  216. package/app-template/src/widgets/footer-subscription/index.tsx +183 -17
  217. package/app-template/src/widgets/footer-value-props.tsx +201 -0
  218. package/app-template/src/widgets/index.ts +7 -0
  219. package/app-template/src/widgets/schemas/about-us.json +46 -0
  220. package/app-template/src/widgets/schemas/blog-list.json +37 -0
  221. package/app-template/src/widgets/schemas/blog.json +29 -0
  222. package/app-template/tailwind.config.js +18 -2
  223. package/package.json +1 -1
@@ -9,12 +9,19 @@ 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 } from '@theme/components';
12
+ import { Button, Input, Price, Icon } 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';
18
25
 
19
26
  interface Props {
20
27
  basket: Basket;
@@ -25,6 +32,32 @@ const voucherCodeFormSchema = (t) =>
25
32
  voucherCode: yup.string().required(t('basket.summary.form.error.required'))
26
33
  });
27
34
 
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
+
28
61
  export const Summary = (props: Props) => {
29
62
  const { t } = useLocalization();
30
63
  const { basket } = props;
@@ -43,6 +76,152 @@ export const Summary = (props: Props) => {
43
76
  const dispatch = useAppDispatch();
44
77
  const [applyVoucherCodeMutation] = useApplyVoucherCodeMutation();
45
78
  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
+ : '';
46
225
 
47
226
  useEffect(() => {
48
227
  if (basket.voucher_code) {
@@ -93,6 +272,7 @@ export const Summary = (props: Props) => {
93
272
  const checkoutProviderProps = {
94
273
  className: clsx([
95
274
  'py-2.5',
275
+ 'h-[50px]',
96
276
  'bg-black',
97
277
  'relative',
98
278
  'hover:bg-black',
@@ -121,57 +301,72 @@ export const Summary = (props: Props) => {
121
301
  }, [basket]);
122
302
 
123
303
  return (
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
- </>
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)
164
318
  )}
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">
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)
328
+ )}
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
+ >
168
344
  {t('basket.summary.form.title')}
169
- </p>
170
- <form onSubmit={handleSubmit(onSubmit)} className="flex w-full">
171
- <div className="w-full md:w-1/2 lg:w-auto">
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
+ >
172
366
  <Input
173
367
  placeholder={t('basket.summary.form.placeholder')}
174
- className="h-9 w-full lg:w-40"
368
+ className="h-[38px] w-full"
369
+ style={voucherInputStyles}
175
370
  data-testid="basket-voucher-input"
176
371
  {...register('voucherCode')}
177
372
  error={errors.voucherCode}
@@ -180,34 +375,238 @@ export const Summary = (props: Props) => {
180
375
  </div>
181
376
  {basket.voucher_code ? (
182
377
  <Button
183
- className="h-9 w-20 px-0 border-gray-500 border-l-0"
184
- appearance="outlined"
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}
185
384
  data-testid="basket-voucher-remove"
186
385
  type="button"
187
- onClick={removeVoucherCode}
386
+ onClick={(e) => {
387
+ if (isDesigner) {
388
+ handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id, e);
389
+ } else {
390
+ removeVoucherCode();
391
+ }
392
+ }}
188
393
  >
189
394
  {t('basket.summary.remove')}
190
395
  </Button>
191
396
  ) : (
192
397
  <Button
193
- className="h-9 w-20 px-0 border-gray-500 border-l-0"
194
- appearance="outlined"
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}
195
404
  data-testid="basket-voucher-submit"
405
+ onClick={(e) => {
406
+ if (isDesigner) {
407
+ handleBlockClick(BASKET_SUMMARY_BLOCKS.VOUCHER_BUTTON.id, e);
408
+ }
409
+ }}
196
410
  >
197
411
  {t('basket.summary.submit')}
198
412
  </Button>
199
413
  )}
200
414
  </form>
201
415
  </div>
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" />
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
+ />
206
586
  </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
+ >
207
598
  <Button
208
- className="w-full"
209
- onClick={() => {
210
- router.push(ROUTES.CHECKOUT);
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
+ }
211
610
  }}
212
611
  data-testid="basket-checkout"
213
612
  >
@@ -224,21 +623,43 @@ export const Summary = (props: Props) => {
224
623
  props={checkoutProviderProps}
225
624
  />
226
625
 
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>
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
+ )}
242
663
  </div>
243
664
  </div>
244
665
  );