@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
@@ -10,6 +10,9 @@ import useFavButton from '../../hooks/use-fav-button';
10
10
  import { Product } from '@akinon/next/types';
11
11
  import { Image } from '@akinon/next/components/image';
12
12
  import { Price, Link } from '@theme/components';
13
+ import { SaleTag } from '../product/sale-tag';
14
+ import { useProductList } from '../category/product-list-registrar';
15
+ import { useNativeWidget } from '../category/native-widget-context';
13
16
 
14
17
  interface Props {
15
18
  product: Product;
@@ -19,17 +22,42 @@ interface Props {
19
22
  }
20
23
 
21
24
  export const ProductItem = (props: Props) => {
22
- // TODO: Static image will change (TR)
23
25
  const { product, width, height, index } = props;
24
26
  const [viewed, setViewed] = useState(false);
25
27
  const { FavButton } = useFavButton(product.pk);
26
28
  const { ref, inView } = useInView();
27
29
 
28
- const image_url = product.productimage_set[0]?.image;
30
+ // Get product-item properties from ProductListRegistrar
31
+ const {
32
+ productItemProperties: registrarProps,
33
+ productItemStyles: registrarStyles
34
+ } = useProductList();
35
+
36
+ // Get product-item properties from NativeWidgetProvider
37
+ const {
38
+ productItemProperties: widgetProps,
39
+ productItemStyles: widgetStyles
40
+ } = useNativeWidget();
41
+
42
+ // Designer mode uses registrar props, saved widget uses widget props
43
+ const isDesigner = typeof window !== 'undefined' && window.parent !== window;
44
+ const properties = isDesigner
45
+ ? { ...widgetProps, ...registrarProps }
46
+ : widgetProps;
47
+ const styles = isDesigner
48
+ ? { ...widgetStyles, ...registrarStyles }
49
+ : widgetStyles;
50
+
51
+ const showFavButton = properties['show-fav-button'] !== false;
52
+ const favButtonPosition =
53
+ (properties['fav-button-position'] as string) || 'top-right';
54
+
55
+ const image_url = product.productimage_set?.[0]?.image;
29
56
  const absolute_url = product.absolute_url;
30
57
  const product_name = product.name;
31
58
  const retail_price = product.retail_price;
32
59
  const price = product.price;
60
+ const isOnSale = parseFloat(String(retail_price)) > parseFloat(String(price));
33
61
 
34
62
  useEffect(() => {
35
63
  if (!viewed && inView) {
@@ -38,58 +66,103 @@ export const ProductItem = (props: Props) => {
38
66
  }
39
67
  }, [inView, viewed, product]);
40
68
 
69
+ // Position classes
70
+ const positionClasses = {
71
+ 'top-left': 'top-2.5 left-2.5',
72
+ 'top-right': 'top-2.5 right-2.5',
73
+ 'bottom-left': 'bottom-2.5 left-2.5',
74
+ 'bottom-right': 'bottom-2.5 right-2.5'
75
+ };
76
+
77
+ const favButtonStyles: React.CSSProperties = {
78
+ width: (styles['fav-button-size'] as string) || '32px',
79
+ height: (styles['fav-button-size'] as string) || '32px',
80
+ backgroundColor:
81
+ (styles['fav-button-bg-color'] as string) || 'rgba(255, 255, 255, 0.8)',
82
+ color: (styles['fav-button-icon-color'] as string) || '#000000',
83
+ borderRadius: (styles['fav-button-border-radius'] as string) || '50%'
84
+ };
85
+
86
+ const productNameStyles: React.CSSProperties = {
87
+ fontSize: (styles['product-name-font-size'] as string) || '14px',
88
+ color: (styles['product-name-color'] as string) || '#1a1a1a',
89
+ fontWeight: (styles['product-name-font-weight'] as string) || '400',
90
+ display: '-webkit-box',
91
+ WebkitLineClamp: parseInt(
92
+ (styles['product-name-line-clamp'] as string) || '2',
93
+ 10
94
+ ),
95
+ WebkitBoxOrient: 'vertical' as const,
96
+ overflow: 'hidden'
97
+ };
98
+
99
+ const priceStyles: React.CSSProperties = {
100
+ fontSize: (styles['price-font-size'] as string) || '16px',
101
+ color: (styles['price-color'] as string) || '#1a1a1a',
102
+ fontWeight: (styles['price-font-weight'] as string) || '400'
103
+ };
104
+
105
+ const oldPriceStyles: React.CSSProperties = {
106
+ fontSize: (styles['old-price-font-size'] as string) || '14px',
107
+ color: (styles['old-price-color'] as string) || '#6b7280'
108
+ };
109
+
41
110
  return (
42
111
  <div
43
- className="text-sm text-left flex flex-col justify-between"
112
+ className="flex flex-col group w-full"
44
113
  data-testid="product-box"
45
114
  ref={ref}
115
+ data-section-id="product-item-section"
46
116
  >
47
- <div className="relative mb-3 h-full">
117
+ <div className="relative mb-2 w-full aspect-square">
48
118
  <Link href={absolute_url} onClick={() => pushProductClicked(product)}>
49
- {image_url ? (
50
- <Image
51
- fill
52
- loading="lazy"
53
- src={image_url}
54
- alt={product_name}
55
- aspectRatio={width / height}
56
- sizes="
57
- (max-width: 768px) 50vw,
58
- (max-width: 1024px) 30vw,
59
- 33vw"
60
- crop="center"
61
- />
62
- ) : (
63
- <Image
64
- className="h-full"
65
- src="/noimage.jpg"
66
- fill
67
- aspectRatio={width / height}
68
- sizes="100vw"
69
- alt={product_name}
70
- imageClassName="object-cover"
71
- />
72
- )}
119
+ <Image
120
+ loading="lazy"
121
+ src={image_url || '/noimage.jpg'}
122
+ alt={product_name}
123
+ aspectRatio={width / height}
124
+ fill
125
+ crop="center"
126
+ sizes={`(max-width: 768px) ${
127
+ width === 260 ? 170 : width
128
+ }px, ${width}px`}
129
+ imageClassName="object-cover"
130
+ />
73
131
  </Link>
74
- <FavButton className="absolute top-4 right-4" />
132
+
133
+ {showFavButton && (
134
+ <FavButton
135
+ className={`absolute ${positionClasses[favButtonPosition]} hover:opacity-100 transition-all flex items-center justify-center z-10`}
136
+ style={favButtonStyles}
137
+ />
138
+ )}
139
+
140
+ {isOnSale && (
141
+ <div className="absolute bottom-4 left-2 z-10">
142
+ <SaleTag />
143
+ </div>
144
+ )}
75
145
  </div>
76
- <div>
77
- <Link
78
- href={absolute_url}
79
- data-testid={`${product_name}-${index}`}
80
- onClick={() => pushProductClicked(product)}
81
- >
82
- {product_name}
83
- </Link>
84
- <div className="font-semibold">
85
- {parseFloat(retail_price) > parseFloat(price) && (
86
- <Price
87
- value={retail_price}
88
- className="font-normal line-through mr-3"
89
- />
90
- )}
91
- <Price value={price} data-testid="product-price" />
92
- </div>
146
+
147
+ <Link
148
+ href={absolute_url}
149
+ data-testid={`${product_name}-${index}`}
150
+ onClick={() => pushProductClicked(product)}
151
+ className="hover:underline"
152
+ style={productNameStyles}
153
+ >
154
+ {product_name}
155
+ </Link>
156
+
157
+ <div className="flex items-center gap-2">
158
+ {isOnSale && (
159
+ <Price
160
+ value={retail_price}
161
+ className="line-through"
162
+ style={oldPriceStyles}
163
+ />
164
+ )}
165
+ <Price value={price} data-testid="product-price" style={priceStyles} />
93
166
  </div>
94
167
  </div>
95
168
  );
@@ -209,7 +209,7 @@ export const Register = () => {
209
209
  };
210
210
 
211
211
  return (
212
- <section className="w-full py-10 px-5 md:py-0 md:block md:px-8 md:mx-auto lg:px-16">
212
+ <section className="w-full mt-6 lg:mt-8">
213
213
  <Modal
214
214
  title={contentModal.title}
215
215
  portalId="portal-modal-container"
@@ -230,14 +230,6 @@ export const Register = () => {
230
230
  }}
231
231
  />
232
232
  )}
233
- <h2 className="mb-3 text-lg text-start text-black-800 font-light md:mb-9 md:text-2xl">
234
- {t('auth.register.title')}
235
- </h2>
236
-
237
- <p className="mb-3 text-xs leading-4 text-primary-400">
238
- {t('auth.register.subtitle')}
239
- </p>
240
-
241
233
  <form onSubmit={handleSubmit(onSubmit)} className="flex flex-col gap-4">
242
234
  <input
243
235
  type="hidden"
@@ -246,11 +238,11 @@ export const Register = () => {
246
238
  />
247
239
  <input type="hidden" value={locale} {...register('locale')} />
248
240
 
249
- <div className={clsx({ 'mb-4': errors.email })}>
241
+ <div>
250
242
  <Input
251
243
  labelStyle="floating"
252
244
  label={t('auth.register.form.email.placeholder')}
253
- className="h-14"
245
+ className="h-12"
254
246
  {...register('email')}
255
247
  error={errors.email}
256
248
  data-testid="register-email"
@@ -259,15 +251,13 @@ export const Register = () => {
259
251
  </div>
260
252
 
261
253
  <div
262
- className={clsx('lg:flex', {
263
- 'mb-4': errors.first_name || errors.last_name
264
- })}
254
+ className="lg:flex"
265
255
  >
266
256
  <div className="w-full lg:pr-2">
267
257
  <Input
268
258
  labelStyle="floating"
269
259
  label={t('auth.register.form.name.placeholder')}
270
- className="block h-14"
260
+ className="block h-12"
271
261
  {...register('first_name')}
272
262
  error={errors.first_name}
273
263
  data-testid="register-name"
@@ -279,7 +269,7 @@ export const Register = () => {
279
269
  <Input
280
270
  labelStyle="floating"
281
271
  label={t('auth.register.form.surname.placeholder')}
282
- className="block h-14"
272
+ className="block h-12"
283
273
  {...register('last_name')}
284
274
  error={errors.last_name}
285
275
  data-testid="register-surname"
@@ -288,12 +278,12 @@ export const Register = () => {
288
278
  </div>
289
279
  </div>
290
280
 
291
- <div className={clsx('relative', { 'mb-4': errors.password })}>
281
+ <div className="relative">
292
282
  <div className="relative">
293
283
  <Input
294
284
  labelStyle="floating"
295
285
  label={t('auth.register.form.password.placeholder')}
296
- className="h-14 pr-16"
286
+ className="h-12 pr-16"
297
287
  type={showPassword ? 'text' : 'password'}
298
288
  {...register('password')}
299
289
  data-testid="register-password"
@@ -319,11 +309,11 @@ export const Register = () => {
319
309
  />
320
310
  </div>
321
311
 
322
- <div className={clsx({ 'mb-4': errors.phone })}>
312
+ <div>
323
313
  <Input
324
314
  labelStyle="floating"
325
315
  label={t('auth.register.form.phone.placeholder')}
326
- className="h-14"
316
+ className="h-12"
327
317
  format={user_phone_format.replace(/9/g, '#')}
328
318
  allowEmptyFormatting
329
319
  mask="_"
@@ -339,7 +329,6 @@ export const Register = () => {
339
329
  <p className="mb-4">{t('auth.register.form.agreements.title')}:</p>
340
330
 
341
331
  <Checkbox
342
- className={clsx(errors.confirm ? 'mb-8' : 'mb-4')}
343
332
  {...register('confirm')}
344
333
  error={errors.confirm}
345
334
  data-testid="register-agreement-1"
@@ -358,7 +347,7 @@ export const Register = () => {
358
347
  </Checkbox>
359
348
 
360
349
  <Checkbox
361
- className={clsx(errors.kvkk_confirm ? 'mb-8' : 'mb-4')}
350
+ className="mt-4"
362
351
  {...register('kvkk_confirm')}
363
352
  error={errors.kvkk_confirm}
364
353
  data-testid="register-agreement-2"
@@ -377,7 +366,7 @@ export const Register = () => {
377
366
  </Checkbox>
378
367
 
379
368
  <Checkbox
380
- className="mb-4"
369
+ className="mt-4"
381
370
  {...register('email_allowed')}
382
371
  data-testid="register-agreement-3"
383
372
  >
@@ -395,7 +384,7 @@ export const Register = () => {
395
384
  </Checkbox>
396
385
 
397
386
  <Checkbox
398
- className="mb-4"
387
+ className="mt-4"
399
388
  {...register('sms_allowed')}
400
389
  data-testid="register-agreement-4"
401
390
  >
@@ -421,7 +410,7 @@ export const Register = () => {
421
410
  </div>
422
411
 
423
412
  <Button
424
- className="text-xs font-semibold uppercase w-full h-14"
413
+ className="w-full h-12 text-sm font-normal"
425
414
  type="submit"
426
415
  disabled={isCaptchaVisible && !captchaValidated}
427
416
  data-testid="register-submit"
@@ -4,7 +4,7 @@ import React, { useState } from 'react';
4
4
  import { Button, Icon } from '@theme/components';
5
5
  // eslint-disable-next-line @akinon/projectzero/link-import
6
6
  import Link from 'next/link';
7
- import { ShareProps } from '@theme/components/types';
7
+ import { ShareProps } from '@theme/components/types/index';
8
8
  import clsx from 'clsx';
9
9
 
10
10
  const Share = ({
@@ -13,18 +13,21 @@ const Share = ({
13
13
  buttonAppearance = 'ghost',
14
14
  className,
15
15
  buttonIconName = 'share',
16
- buttonIconSize = 16,
16
+ buttonIconSize = 24,
17
17
  buttonIconProps = {},
18
18
  items
19
19
  }: ShareProps) => {
20
20
  const [open, setOpen] = useState(false);
21
21
 
22
22
  return (
23
- <div className={clsx('flex items-center', className)}>
23
+ <div className={clsx('flex items-center gap-4 border-t', className)}>
24
24
  <Button
25
25
  onClick={() => setOpen(!open)}
26
26
  appearance={buttonAppearance}
27
- className={clsx('text-base', buttonClassName)}
27
+ className={clsx(
28
+ 'text-base p-0 bg-transparent hover:bg-transparent hover:text-primary',
29
+ buttonClassName
30
+ )}
28
31
  aria-label="Share"
29
32
  >
30
33
  <div className="flex items-center gap-2">
@@ -53,12 +56,12 @@ const Share = ({
53
56
  className={
54
57
  item.className
55
58
  ? item.className
56
- : 'px-6 py-2 h-10 flex items-center hover:bg-gray-100'
59
+ : 'p-4 h-auto flex items-center hover:bg-gray-100'
57
60
  }
58
61
  >
59
62
  <Icon
60
63
  name={item.iconName}
61
- size={item.iconSize ? item.iconSize : 16}
64
+ size={item.iconSize ? item.iconSize : 12}
62
65
  />
63
66
  </Link>
64
67
  </div>
@@ -11,44 +11,46 @@ export default function HomeHeroSliderContent({ data }) {
11
11
  };
12
12
 
13
13
  return (
14
- <CarouselCore
15
- responsive={{
16
- all: {
17
- breakpoint: { max: 5000, min: 0 },
18
- items: 1
19
- }
20
- }}
21
- arrows={false}
22
- swipeable={true}
23
- containerAspectRatio={{
24
- mobile: imageRatio.mobile,
25
- desktop: imageRatio.desktop
26
- }}
27
- >
28
- {data?.attributes?.hero_slider?.map((item, i) => (
29
- <div key={i}>
30
- <Link href={item.value.url}>
31
- <Image
32
- src={item.kwargs.value.mobile_image.url}
33
- alt={item.value.alt}
34
- aspectRatio={imageRatio.mobile}
35
- draggable={false}
36
- sizes="375px"
37
- fill
38
- className="block md:hidden"
39
- />
40
- <Image
41
- src={item.kwargs.value.image.url}
42
- alt={item.value.alt}
43
- aspectRatio={imageRatio.desktop}
44
- draggable={false}
45
- sizes="1540px"
46
- fill
47
- className="hidden md:block"
48
- />
49
- </Link>
50
- </div>
51
- ))}
52
- </CarouselCore>
14
+ <>
15
+ <CarouselCore
16
+ responsive={{
17
+ all: {
18
+ breakpoint: { max: 5000, min: 0 },
19
+ items: 1
20
+ }
21
+ }}
22
+ arrows={false}
23
+ swipeable={true}
24
+ containerAspectRatio={{
25
+ mobile: imageRatio.mobile,
26
+ desktop: imageRatio.desktop
27
+ }}
28
+ >
29
+ {data?.attributes?.hero_slider?.map((item, i) => (
30
+ <div key={i}>
31
+ <Link href={item.value.url}>
32
+ <Image
33
+ src={item.kwargs.value.mobile_image.url}
34
+ alt={item.value.alt}
35
+ aspectRatio={imageRatio.mobile}
36
+ draggable={false}
37
+ sizes="375px"
38
+ fill
39
+ className="block md:hidden"
40
+ />
41
+ <Image
42
+ src={item.kwargs.value.image.url}
43
+ alt={item.value.alt}
44
+ aspectRatio={imageRatio.desktop}
45
+ draggable={false}
46
+ sizes="1540px"
47
+ fill
48
+ className="hidden md:block"
49
+ />
50
+ </Link>
51
+ </div>
52
+ ))}
53
+ </CarouselCore>
54
+ </>
53
55
  );
54
56
  }
@@ -0,0 +1,78 @@
1
+ 'use client';
2
+ import { Image } from '@akinon/next/components';
3
+ import { useGetWidgetQuery } from '@akinon/next/data/client/misc';
4
+ import { LoaderSpinner } from '@theme/components';
5
+
6
+ export default function AboutUs() {
7
+ const { data, isLoading } = useGetWidgetQuery('about-us');
8
+
9
+ if (isLoading) {
10
+ return (
11
+ <div className="py-20">
12
+ <LoaderSpinner />;
13
+ </div>
14
+ );
15
+ }
16
+
17
+ if (!data) {
18
+ return null;
19
+ }
20
+
21
+ return (
22
+ <div>
23
+ <div className="container px-3 lg:px-0 py-4 lg:py-10">
24
+ <div className="flex gap-2.5 flex-col lg:flex-row">
25
+ <Image
26
+ src={data?.attributes?.image_1?.kwargs?.url}
27
+ alt={data?.attributes?.image_1?.value}
28
+ aspectRatio={350 / 330}
29
+ sizes="350px"
30
+ fill
31
+ />
32
+
33
+ <Image
34
+ src={data?.attributes?.image_2?.kwargs?.url}
35
+ alt={data?.attributes?.image_2?.value}
36
+ aspectRatio={350 / 330}
37
+ sizes="350px"
38
+ fill
39
+ />
40
+
41
+ <Image
42
+ src={data?.attributes?.image_3?.kwargs?.url}
43
+ alt={data?.attributes?.image_3?.value}
44
+ aspectRatio={350 / 330}
45
+ sizes="350px"
46
+ fill
47
+ />
48
+ </div>
49
+
50
+ <div className="my-10 lg:my-16 max-w-[495px] mx-auto">
51
+ <h1 className="text-[30px] lg:text-[40px] mb-8">
52
+ {data?.attributes?.title?.value}
53
+ </h1>
54
+ <div
55
+ className="text-[#121212] leading-[1.72] tracking-[0.64px]"
56
+ dangerouslySetInnerHTML={{
57
+ __html: data?.attributes?.content?.value || ''
58
+ }}
59
+ />
60
+ </div>
61
+ </div>
62
+
63
+ <div className="bg-[#fafafa] lg:bg-black text-[#121212] lg:text-white py-10 lg:py-16">
64
+ <div className="container">
65
+ <h2 className="text-center text-xl lg:text-2xl mb-8">
66
+ {data?.attributes?.highlight_section_title?.value}
67
+ </h2>
68
+ <div
69
+ className="text-center max-w-[295px] lg:max-w-[700px] mx-auto leading-[1.72] tracking-[0.64px]"
70
+ dangerouslySetInnerHTML={{
71
+ __html: data?.attributes?.highlight_section?.value || ''
72
+ }}
73
+ />
74
+ </div>
75
+ </div>
76
+ </div>
77
+ );
78
+ }
@@ -0,0 +1,129 @@
1
+ 'use client';
2
+
3
+ import { Image } from '@akinon/next/components';
4
+ import { useGetWidgetQuery } from '@akinon/next/data/client/misc';
5
+ import { useLocalization } from '@akinon/next/hooks';
6
+ import { WidgetResultType } from '@akinon/next/types';
7
+ import { LoaderSpinner } from '@theme/components';
8
+ import { formatDateToMonthYear } from '@theme/utils/formatDate';
9
+
10
+ interface BlogImageData {
11
+ value: string;
12
+ data_type: 'image';
13
+ url: string;
14
+ }
15
+
16
+ interface BlogItemValue {
17
+ link: string;
18
+ image: string;
19
+ title: string;
20
+ description: string;
21
+ date: string;
22
+ }
23
+
24
+ interface BlogItemKwargs {
25
+ value: {
26
+ image: BlogImageData;
27
+ };
28
+ data_type: 'nested';
29
+ }
30
+
31
+ interface BlogItem {
32
+ value: BlogItemValue;
33
+ kwargs: BlogItemKwargs;
34
+ }
35
+
36
+ interface BlogListAttributes {
37
+ blogs: BlogItem[];
38
+ }
39
+
40
+ export default function BlogList() {
41
+ const { locale, t } = useLocalization();
42
+ const { data, isLoading } = useGetWidgetQuery('blog-list') as ReturnType<
43
+ typeof useGetWidgetQuery
44
+ >;
45
+ const blogData = data as WidgetResultType<BlogListAttributes> | undefined;
46
+
47
+ if (isLoading) {
48
+ return (
49
+ <div className="py-20">
50
+ <LoaderSpinner />
51
+ </div>
52
+ );
53
+ }
54
+
55
+ if (!blogData) {
56
+ return (
57
+ <div className="container mx-auto py-10">
58
+ <p className="text-center py-20">{t('blog.no_blog_posts')}</p>
59
+ </div>
60
+ );
61
+ }
62
+
63
+ return (
64
+ <div>
65
+ <div className="container px-3 lg:px-0 py-4 lg:py-10">
66
+ {blogData.attributes?.blogs?.length ? (
67
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-2.5 ">
68
+ {blogData.attributes.blogs.map((blogItem, index) => (
69
+ <div
70
+ key={index}
71
+ className={
72
+ `bg-[#fafafa]` + (index === 0 ? ' lg:col-span-2' : '')
73
+ }
74
+ >
75
+ <a
76
+ key={index}
77
+ href={blogItem.value.link}
78
+ className="block group"
79
+ >
80
+ <div className="w-full relative mb-4 overflow-hidden">
81
+ <Image
82
+ src={blogItem.kwargs.value.image.url}
83
+ alt={blogItem.value.title}
84
+ aspectRatio={index === 0 ? 1072 / 481 : 530 / 440}
85
+ fill
86
+ sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
87
+ className="w-full h-full object-cover transition-transform duration-300 hidden lg:block"
88
+ />
89
+ <Image
90
+ src={blogItem.kwargs.value.image.url}
91
+ alt={blogItem.value.title}
92
+ aspectRatio={350 / 278}
93
+ fill
94
+ sizes="100vw"
95
+ className="w-full h-full object-fill transition-transform duration-300 lg:hidden"
96
+ />
97
+ </div>
98
+ <div
99
+ className={
100
+ `p-6 ` +
101
+ (index === 0
102
+ ? 'lg:p-0 lg:pb-10 lg:max-w-[700px] lg:mx-auto lg:text-center'
103
+ : '')
104
+ }
105
+ >
106
+ <h3 className="text-2xl mb-1 text-[#121212] leading-[1.72] tracking-[0.64px]">
107
+ {blogItem.value.title}
108
+ </h3>
109
+ <p className="mb-4 lg:mb-1">
110
+ {formatDateToMonthYear(
111
+ blogItem.value.date,
112
+ locale as any
113
+ )}
114
+ </p>
115
+ <p className="text-[#121212] leading-[1.72] tracking-[0.64px]">
116
+ {blogItem.value.description}
117
+ </p>
118
+ </div>
119
+ </a>
120
+ </div>
121
+ ))}
122
+ </div>
123
+ ) : (
124
+ <p>{t('blog.no_blog_posts')}</p>
125
+ )}
126
+ </div>
127
+ </div>
128
+ );
129
+ }