@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
package/CHANGELOG.md CHANGED
@@ -1,7 +1,15 @@
1
1
  # @akinon/projectzero
2
2
 
3
+ ## 2.0.0-beta.21
4
+
3
5
  ## 2.0.0-beta.20
4
6
 
7
+ ## 1.126.0
8
+
9
+ ## 1.125.2
10
+
11
+ ## 1.125.1
12
+
5
13
  ## 1.125.0
6
14
 
7
15
  ## 1.124.0
@@ -1,5 +1,47 @@
1
1
  # projectzeronext
2
2
 
3
+ ## 2.0.0-beta.21
4
+
5
+ ### Patch Changes
6
+
7
+ - 5d44ff77: ZERO-4312: Extract ThemePlaceholder system into new @akinon/pz-theme package and strip native widget code
8
+
9
+ Introduce a dedicated `@akinon/pz-theme` package that contains the ThemePlaceholder system (CMS-driven sections/blocks, designer features, utilities). Remove native widget registration infrastructure from both `@akinon/pz-theme` and `projectzeronext` so the beta branch can be merged to main with only stable ThemePlaceholder functionality. Native widget integrations will be reintroduced via `@akinon/pz-theme` once they stabilize on the `theme-editor` branch.
10
+
11
+ Consumers should update imports:
12
+
13
+ - `@akinon/next/components/theme-editor/*` -> `@akinon/pz-theme/src/*`
14
+ - Add `@akinon/pz-theme` to package.json dependencies (matching `@akinon/next` version)
15
+
16
+ - Updated dependencies [5d44ff77]
17
+ - @akinon/pz-theme@2.0.0-beta.21
18
+ - @akinon/next@2.0.0-beta.21
19
+ - @akinon/pz-virtual-try-on@2.0.0-beta.21
20
+ - @akinon/pz-akifast@2.0.0-beta.21
21
+ - @akinon/pz-apple-pay@2.0.0-beta.21
22
+ - @akinon/pz-b2b@2.0.0-beta.21
23
+ - @akinon/pz-basket-gift-pack@2.0.0-beta.21
24
+ - @akinon/pz-bkm@2.0.0-beta.21
25
+ - @akinon/pz-checkout-gift-pack@2.0.0-beta.21
26
+ - @akinon/pz-click-collect@2.0.0-beta.21
27
+ - @akinon/pz-credit-payment@2.0.0-beta.21
28
+ - @akinon/pz-cybersource-uc@2.0.0-beta.21
29
+ - @akinon/pz-flow-payment@2.0.0-beta.21
30
+ - @akinon/pz-google-pay@2.0.0-beta.21
31
+ - @akinon/pz-gpay@2.0.0-beta.21
32
+ - @akinon/pz-haso@2.0.0-beta.21
33
+ - @akinon/pz-hepsipay@2.0.0-beta.21
34
+ - @akinon/pz-masterpass@2.0.0-beta.21
35
+ - @akinon/pz-masterpass-rest@2.0.0-beta.21
36
+ - @akinon/pz-multi-basket@2.0.0-beta.21
37
+ - @akinon/pz-one-click-checkout@2.0.0-beta.21
38
+ - @akinon/pz-otp@2.0.0-beta.21
39
+ - @akinon/pz-pay-on-delivery@2.0.0-beta.21
40
+ - @akinon/pz-saved-card@2.0.0-beta.21
41
+ - @akinon/pz-similar-products@2.0.0-beta.21
42
+ - @akinon/pz-tabby-extension@2.0.0-beta.21
43
+ - @akinon/pz-tamara-extension@2.0.0-beta.21
44
+
3
45
  ## 2.0.0-beta.20
4
46
 
5
47
  ### Minor Changes
@@ -46,6 +88,102 @@
46
88
  - @akinon/pz-tabby-extension@2.0.0-beta.20
47
89
  - @akinon/pz-tamara-extension@2.0.0-beta.20
48
90
 
91
+ ## 1.126.0
92
+
93
+ ### Patch Changes
94
+
95
+ - Updated dependencies [46d787e6]
96
+ - @akinon/pz-flow-payment@1.126.0
97
+ - @akinon/next@1.126.0
98
+ - @akinon/pz-akifast@1.126.0
99
+ - @akinon/pz-apple-pay@1.126.0
100
+ - @akinon/pz-b2b@1.126.0
101
+ - @akinon/pz-basket-gift-pack@1.126.0
102
+ - @akinon/pz-bkm@1.126.0
103
+ - @akinon/pz-checkout-gift-pack@1.126.0
104
+ - @akinon/pz-click-collect@1.126.0
105
+ - @akinon/pz-credit-payment@1.126.0
106
+ - @akinon/pz-cybersource-uc@1.126.0
107
+ - @akinon/pz-google-pay@1.126.0
108
+ - @akinon/pz-gpay@1.126.0
109
+ - @akinon/pz-haso@1.126.0
110
+ - @akinon/pz-hepsipay@1.126.0
111
+ - @akinon/pz-masterpass@1.126.0
112
+ - @akinon/pz-masterpass-rest@1.126.0
113
+ - @akinon/pz-multi-basket@1.126.0
114
+ - @akinon/pz-one-click-checkout@1.126.0
115
+ - @akinon/pz-otp@1.126.0
116
+ - @akinon/pz-pay-on-delivery@1.126.0
117
+ - @akinon/pz-saved-card@1.126.0
118
+ - @akinon/pz-similar-products@1.126.0
119
+ - @akinon/pz-tabby-extension@1.126.0
120
+ - @akinon/pz-tamara-extension@1.126.0
121
+ - @akinon/pz-virtual-try-on@1.126.0
122
+
123
+ ## 1.125.2
124
+
125
+ ### Patch Changes
126
+
127
+ - Updated dependencies [0220a136]
128
+ - @akinon/pz-flow-payment@1.125.2
129
+ - @akinon/next@1.125.2
130
+ - @akinon/pz-akifast@1.125.2
131
+ - @akinon/pz-apple-pay@1.125.2
132
+ - @akinon/pz-b2b@1.125.2
133
+ - @akinon/pz-basket-gift-pack@1.125.2
134
+ - @akinon/pz-bkm@1.125.2
135
+ - @akinon/pz-checkout-gift-pack@1.125.2
136
+ - @akinon/pz-click-collect@1.125.2
137
+ - @akinon/pz-credit-payment@1.125.2
138
+ - @akinon/pz-cybersource-uc@1.125.2
139
+ - @akinon/pz-google-pay@1.125.2
140
+ - @akinon/pz-gpay@1.125.2
141
+ - @akinon/pz-haso@1.125.2
142
+ - @akinon/pz-hepsipay@1.125.2
143
+ - @akinon/pz-masterpass@1.125.2
144
+ - @akinon/pz-masterpass-rest@1.125.2
145
+ - @akinon/pz-multi-basket@1.125.2
146
+ - @akinon/pz-one-click-checkout@1.125.2
147
+ - @akinon/pz-otp@1.125.2
148
+ - @akinon/pz-pay-on-delivery@1.125.2
149
+ - @akinon/pz-saved-card@1.125.2
150
+ - @akinon/pz-similar-products@1.125.2
151
+ - @akinon/pz-tabby-extension@1.125.2
152
+ - @akinon/pz-tamara-extension@1.125.2
153
+ - @akinon/pz-virtual-try-on@1.125.2
154
+
155
+ ## 1.125.1
156
+
157
+ ### Patch Changes
158
+
159
+ - Updated dependencies [06da9a95]
160
+ - @akinon/next@1.125.1
161
+ - @akinon/pz-virtual-try-on@1.125.1
162
+ - @akinon/pz-akifast@1.125.1
163
+ - @akinon/pz-apple-pay@1.125.1
164
+ - @akinon/pz-b2b@1.125.1
165
+ - @akinon/pz-basket-gift-pack@1.125.1
166
+ - @akinon/pz-bkm@1.125.1
167
+ - @akinon/pz-checkout-gift-pack@1.125.1
168
+ - @akinon/pz-click-collect@1.125.1
169
+ - @akinon/pz-credit-payment@1.125.1
170
+ - @akinon/pz-cybersource-uc@1.125.1
171
+ - @akinon/pz-flow-payment@1.125.1
172
+ - @akinon/pz-google-pay@1.125.1
173
+ - @akinon/pz-gpay@1.125.1
174
+ - @akinon/pz-haso@1.125.1
175
+ - @akinon/pz-hepsipay@1.125.1
176
+ - @akinon/pz-masterpass@1.125.1
177
+ - @akinon/pz-masterpass-rest@1.125.1
178
+ - @akinon/pz-multi-basket@1.125.1
179
+ - @akinon/pz-one-click-checkout@1.125.1
180
+ - @akinon/pz-otp@1.125.1
181
+ - @akinon/pz-pay-on-delivery@1.125.1
182
+ - @akinon/pz-saved-card@1.125.1
183
+ - @akinon/pz-similar-products@1.125.1
184
+ - @akinon/pz-tabby-extension@1.125.1
185
+ - @akinon/pz-tamara-extension@1.125.1
186
+
49
187
  ## 1.125.0
50
188
 
51
189
  ### Patch Changes
@@ -4,7 +4,6 @@ import withPzConfig from '@akinon/next/with-pz-config.js';
4
4
 
5
5
  /** @type {import('next').NextConfig} */
6
6
  const nextConfig = {
7
- // Your Next.js config to override defaults
8
7
  rewrites: async () => {
9
8
  return [
10
9
  {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "projectzeronext",
3
- "version": "2.0.0-beta.20",
3
+ "version": "2.0.0-beta.21",
4
4
  "private": true,
5
5
  "license": "MIT",
6
6
  "scripts": {
@@ -24,32 +24,33 @@
24
24
  "test:middleware": "jest middleware-matcher.test.ts --bail"
25
25
  },
26
26
  "dependencies": {
27
- "@akinon/next": "2.0.0-beta.20",
28
- "@akinon/pz-akifast": "2.0.0-beta.20",
29
- "@akinon/pz-apple-pay": "2.0.0-beta.20",
30
- "@akinon/pz-b2b": "2.0.0-beta.20",
31
- "@akinon/pz-basket-gift-pack": "2.0.0-beta.20",
32
- "@akinon/pz-bkm": "2.0.0-beta.20",
33
- "@akinon/pz-checkout-gift-pack": "2.0.0-beta.20",
34
- "@akinon/pz-click-collect": "2.0.0-beta.20",
35
- "@akinon/pz-credit-payment": "2.0.0-beta.20",
36
- "@akinon/pz-cybersource-uc": "2.0.0-beta.20",
37
- "@akinon/pz-flow-payment": "2.0.0-beta.20",
38
- "@akinon/pz-google-pay": "2.0.0-beta.20",
39
- "@akinon/pz-gpay": "2.0.0-beta.20",
40
- "@akinon/pz-haso": "2.0.0-beta.20",
41
- "@akinon/pz-hepsipay": "2.0.0-beta.20",
42
- "@akinon/pz-masterpass": "2.0.0-beta.20",
43
- "@akinon/pz-masterpass-rest": "2.0.0-beta.20",
44
- "@akinon/pz-multi-basket": "2.0.0-beta.20",
45
- "@akinon/pz-one-click-checkout": "2.0.0-beta.20",
46
- "@akinon/pz-otp": "2.0.0-beta.20",
47
- "@akinon/pz-pay-on-delivery": "2.0.0-beta.20",
48
- "@akinon/pz-saved-card": "2.0.0-beta.20",
49
- "@akinon/pz-similar-products": "2.0.0-beta.20",
50
- "@akinon/pz-tabby-extension": "2.0.0-beta.20",
51
- "@akinon/pz-tamara-extension": "2.0.0-beta.20",
52
- "@akinon/pz-virtual-try-on": "2.0.0-beta.20",
27
+ "@akinon/next": "2.0.0-beta.21",
28
+ "@akinon/pz-akifast": "2.0.0-beta.21",
29
+ "@akinon/pz-apple-pay": "2.0.0-beta.21",
30
+ "@akinon/pz-b2b": "2.0.0-beta.21",
31
+ "@akinon/pz-basket-gift-pack": "2.0.0-beta.21",
32
+ "@akinon/pz-bkm": "2.0.0-beta.21",
33
+ "@akinon/pz-checkout-gift-pack": "2.0.0-beta.21",
34
+ "@akinon/pz-click-collect": "2.0.0-beta.21",
35
+ "@akinon/pz-credit-payment": "2.0.0-beta.21",
36
+ "@akinon/pz-cybersource-uc": "2.0.0-beta.21",
37
+ "@akinon/pz-flow-payment": "2.0.0-beta.21",
38
+ "@akinon/pz-google-pay": "2.0.0-beta.21",
39
+ "@akinon/pz-gpay": "2.0.0-beta.21",
40
+ "@akinon/pz-haso": "2.0.0-beta.21",
41
+ "@akinon/pz-hepsipay": "2.0.0-beta.21",
42
+ "@akinon/pz-masterpass": "2.0.0-beta.21",
43
+ "@akinon/pz-masterpass-rest": "2.0.0-beta.21",
44
+ "@akinon/pz-multi-basket": "2.0.0-beta.21",
45
+ "@akinon/pz-one-click-checkout": "2.0.0-beta.21",
46
+ "@akinon/pz-otp": "2.0.0-beta.21",
47
+ "@akinon/pz-pay-on-delivery": "2.0.0-beta.21",
48
+ "@akinon/pz-saved-card": "2.0.0-beta.21",
49
+ "@akinon/pz-similar-products": "2.0.0-beta.21",
50
+ "@akinon/pz-tabby-extension": "2.0.0-beta.21",
51
+ "@akinon/pz-tamara-extension": "2.0.0-beta.21",
52
+ "@akinon/pz-theme": "2.0.0-beta.21",
53
+ "@akinon/pz-virtual-try-on": "2.0.0-beta.21",
53
54
  "@hookform/resolvers": "2.9.0",
54
55
  "@next/third-parties": "16.1.6",
55
56
  "@react-google-maps/api": "2.17.1",
@@ -60,8 +61,8 @@
60
61
  "next-pwa": "5.6.0",
61
62
  "pino": "8.11.0",
62
63
  "postcss": "8.4.49",
63
- "react": "19.2.4",
64
- "react-dom": "19.2.4",
64
+ "react": "19.2.5",
65
+ "react-dom": "19.2.5",
65
66
  "react-google-recaptcha": "2.1.0",
66
67
  "react-hook-form": "7.71.2",
67
68
  "react-intersection-observer": "9.4.0",
@@ -72,7 +73,7 @@
72
73
  "yup": "0.32.11"
73
74
  },
74
75
  "devDependencies": {
75
- "@akinon/eslint-plugin-projectzero": "2.0.0-beta.20",
76
+ "@akinon/eslint-plugin-projectzero": "2.0.0-beta.21",
76
77
  "@semantic-release/changelog": "6.0.2",
77
78
  "@semantic-release/exec": "6.0.3",
78
79
  "@semantic-release/git": "10.0.1",
@@ -1,5 +1,5 @@
1
1
  import { URLS } from '@akinon/next/data/urls';
2
- import { Metadata, PageProps } from '@akinon/next/types';
2
+ import { Metadata, AsyncPageProps } from '@akinon/next/types';
3
3
  import logger from '@akinon/next/utils/log';
4
4
  import { notFound } from 'next/navigation';
5
5
 
@@ -56,7 +56,7 @@ const resolvePrettyUrlHandler =
56
56
  return prettyUrlResult;
57
57
  };
58
58
 
59
- export async function generateMetadata(props: PageProps) {
59
+ export async function generateMetadata(props: AsyncPageProps) {
60
60
  const params = await props.params;
61
61
  let result: Metadata = {};
62
62
  const { prettyurl } = params;
@@ -1,5 +1,6 @@
1
1
  import AccountBackButton from '@theme/views/account/back-button';
2
2
  import AccountMenu from '@theme/views/account/account-menu';
3
+ import ThemePlaceholder from '@akinon/pz-theme/src/theme-placeholder';
3
4
  import { auth } from 'auth';
4
5
  import { ROUTES } from 'routes';
5
6
  import { redirect } from '@akinon/next/utils/redirect';
@@ -20,7 +21,7 @@ export default async function AccountLayout({
20
21
  <AccountMenu />
21
22
  <div className="w-full flex-1">
22
23
  <AccountBackButton />
23
-
24
+ <ThemePlaceholder slug="account-page-body" />
24
25
  {children}
25
26
  </div>
26
27
  </div>
@@ -3,9 +3,10 @@
3
3
  import { Image } from '@akinon/next/components';
4
4
  import { useGetWidgetQuery } from '@akinon/next/data/client/misc';
5
5
  import { useLocalization } from '@akinon/next/hooks/use-localization';
6
- import { PageProps, WidgetResultType } from '@akinon/next/types';
6
+ import { WidgetResultType } from '@akinon/next/types';
7
7
  import { Icon, Link, LoaderSpinner } from '@theme/components';
8
8
  import { formatDateToMonthYear } from '@theme/utils/formatDate';
9
+ import { useParams } from 'next/navigation';
9
10
 
10
11
  interface BlogItemKwargs {
11
12
  url: string;
@@ -26,7 +27,8 @@ type BlogType = {
26
27
  date: blogItem;
27
28
  };
28
29
 
29
- export default function Page({ params }: PageProps<{ slug: string }>) {
30
+ export default function Page() {
31
+ const params = useParams<{ slug: string }>();
30
32
  const { locale, t } = useLocalization();
31
33
  const slug = params.slug;
32
34
  const { data, isLoading } = useGetWidgetQuery(slug) as ReturnType<
@@ -2,6 +2,7 @@ import { getCategoryData } from '@akinon/next/data/server';
2
2
  import { withSegmentDefaults } from '@akinon/next/hocs/server';
3
3
  import { ResolvedPageProps } from '@akinon/next/types';
4
4
  import CategoryLayout from '@theme/views/category/layout';
5
+ import { buildListingPageContext } from '@theme/utils/theme-page-context';
5
6
  import { notFound } from 'next/navigation';
6
7
 
7
8
  async function Page({ params, searchParams }: ResolvedPageProps<{ pk: number }>) {
@@ -13,7 +14,16 @@ async function Page({ params, searchParams }: ResolvedPageProps<{ pk: number }>)
13
14
 
14
15
  return (
15
16
  <>
16
- <CategoryLayout data={data} breadcrumbData={breadcrumbData} />
17
+ <CategoryLayout
18
+ data={data}
19
+ breadcrumbData={breadcrumbData}
20
+ pageContext={buildListingPageContext({
21
+ data,
22
+ breadcrumbData,
23
+ pageType: 'category',
24
+ path: data.category?.absolute_url
25
+ })}
26
+ />
17
27
  </>
18
28
  );
19
29
  } catch (error: unknown) {
@@ -2,12 +2,12 @@ import ProductLayout from '@theme/views/product/layout';
2
2
  import { ProductGroupInfo } from '@theme/views/product';
3
3
  import { getProductData, getWidgetData } from '@akinon/next/data/server';
4
4
  import { withSegmentDefaults } from '@akinon/next/hocs/server';
5
- import { PageProps, ResolvedPageProps, Metadata } from '@akinon/next/types';
5
+ import { AsyncPageProps, ResolvedPageProps, Metadata } from '@akinon/next/types';
6
6
  import { generateJsonLd } from '@theme/utils/generate-jsonld';
7
7
  import { notFound } from 'next/navigation';
8
8
 
9
9
  export async function generateMetadata(
10
- props: PageProps<{ pk: number }>
10
+ props: AsyncPageProps<{ pk: number }>
11
11
  ) {
12
12
  const params = await props.params;
13
13
  const searchParams = await props.searchParams;
@@ -13,6 +13,7 @@ import MobileAppToggler from '@akinon/next/components/mobile-app-toggler';
13
13
  import pwaTags from '@theme/components/pwa-tags';
14
14
  import type { Viewport } from 'next';
15
15
  import settings from '@theme/settings';
16
+ import RouteHandler from '@theme/components/route-handler';
16
17
 
17
18
  export const viewport: Viewport = {
18
19
  width: 'device-width',
@@ -49,12 +50,13 @@ async function RootLayout({ locale, translations, children }: ResolvedRootLayout
49
50
  <body className="overflow-x-hidden">
50
51
  <PzRoot translations={translations} locale={locale.value}>
51
52
  <ClientRoot>
52
- <div className="overflow-x-hidden">
53
+ <div className="overflow-x-clip">
53
54
  <MobileAppToggler>
54
55
  <Header />
55
56
  </MobileAppToggler>
56
57
  <main>
57
58
  {children}
59
+ <RouteHandler />
58
60
  <RootModal />
59
61
  </main>
60
62
  <MobileAppToggler>
@@ -2,13 +2,23 @@ import { getListData } from '@akinon/next/data/server';
2
2
  import { withSegmentDefaults } from '@akinon/next/hocs/server';
3
3
  import { ResolvedPageProps } from '@akinon/next/types';
4
4
  import CategoryLayout from '@theme/views/category/layout';
5
+ import { ROUTES } from '@theme/routes';
6
+ import { buildListingPageContext } from '@theme/utils/theme-page-context';
5
7
 
6
8
  async function Page({ searchParams }: ResolvedPageProps) {
7
9
  const data = await getListData({ searchParams });
10
+ const pageType = data.search_text ? 'search' : 'plp';
8
11
 
9
12
  return (
10
13
  <>
11
- <CategoryLayout data={data} />
14
+ <CategoryLayout
15
+ data={data}
16
+ pageContext={buildListingPageContext({
17
+ data,
18
+ pageType,
19
+ path: ROUTES.LIST
20
+ })}
21
+ />
12
22
  </>
13
23
  );
14
24
  }
@@ -1,46 +1,24 @@
1
1
  import 'server-only';
2
2
 
3
- import { HOME_WIDGETS } from '@theme/widgets';
4
- import { getWidgetData } from '@akinon/next/data/server';
5
3
  import { withSegmentDefaults } from '@akinon/next/hocs/server';
6
- import LazyComponent from '@akinon/next/components/lazy-component';
7
-
8
- type HomeWidgetOrderType = {
9
- widget_order: Array<{
10
- value: { item_slug: string };
11
- kwargs: { value: object; data_type: string };
12
- }>;
13
- };
4
+ import ThemePlaceholder from '@akinon/pz-theme/src/theme-placeholder';
5
+ import { buildHomepagePageContext } from '@theme/utils/theme-page-context';
14
6
 
15
7
  export const dynamic = 'force-static';
16
8
  export const revalidate = 600;
17
9
 
18
- async function Page() {
19
- const data = await getWidgetData<HomeWidgetOrderType>({
20
- slug: 'home-widget-order'
21
- });
22
-
23
- if (!data?.attributes?.widget_order) {
24
- return null;
25
- }
26
-
27
- return data.attributes.widget_order.map((widget, index) => {
28
- const Widget = HOME_WIDGETS[widget.value.item_slug];
29
-
30
- if (Widget) {
31
- if (index > 2) {
32
- return (
33
- <LazyComponent key={widget.value.item_slug} className="min-h-[150px]">
34
- <Widget />
35
- </LazyComponent>
36
- );
37
- }
38
-
39
- return <Widget key={widget.value.item_slug} />;
40
- }
10
+ const getPlaceholderSlug = (baseSlug: string) => {
11
+ const isDevelopment = process.env.NODE_ENV === 'development';
12
+ return isDevelopment ? `${baseSlug}-dev` : baseSlug;
13
+ };
41
14
 
42
- return null;
43
- });
15
+ async function Page() {
16
+ return (
17
+ <ThemePlaceholder
18
+ slug={getPlaceholderSlug('homepage-body-new')}
19
+ pageContext={buildHomepagePageContext()}
20
+ />
21
+ );
44
22
  }
45
23
 
46
24
  export async function generateStaticParams() {
@@ -0,0 +1,19 @@
1
+ import ThemePlaceholder from '@akinon/pz-theme/src/theme-placeholder';
2
+ import { withSegmentDefaults } from '@akinon/next/hocs/server';
3
+ import { ResolvedPageProps } from '@akinon/next/types';
4
+ import { buildCustomPageContext } from '@theme/utils/theme-page-context';
5
+
6
+ export const dynamic = 'force-dynamic';
7
+
8
+ async function Page({ params }: ResolvedPageProps<{ slug: string }>) {
9
+ return (
10
+ <div className="min-h-screen">
11
+ <ThemePlaceholder
12
+ slug={`page-${params.slug}`}
13
+ pageContext={buildCustomPageContext(params.slug)}
14
+ />
15
+ </div>
16
+ );
17
+ }
18
+
19
+ export default withSegmentDefaults(Page, { segmentType: 'page' });
@@ -1,13 +1,13 @@
1
1
  import { getProductData, getWidgetData } from '@akinon/next/data/server';
2
2
  import { withSegmentDefaults } from '@akinon/next/hocs/server';
3
- import { PageProps, ResolvedPageProps, Metadata } from '@akinon/next/types';
3
+ import { AsyncPageProps, ResolvedPageProps, Metadata } from '@akinon/next/types';
4
4
  import { generateJsonLd } from '@theme/utils/generate-jsonld';
5
5
  import { AccordionWrapper, ProductInfo } from '@theme/views/product';
6
6
  import ProductLayout from '@theme/views/product/layout';
7
7
  import { notFound } from 'next/navigation';
8
8
 
9
9
  export async function generateMetadata(
10
- props: PageProps<{ pk: number }>
10
+ props: AsyncPageProps<{ pk: number }>
11
11
  ) {
12
12
  const params = await props.params;
13
13
  const searchParams = await props.searchParams;
@@ -1 +1 @@
1
- export * from '@akinon/next/api/barcode-search';
1
+ export { GET } from "@akinon/next/api/barcode-search";
@@ -1 +1 @@
1
- export * from '@akinon/next/api/cache';
1
+ export { POST, PUT } from "@akinon/next/api/cache";
@@ -1 +1 @@
1
- export * from '@akinon/next/api/image-proxy';
1
+ export { GET, POST } from "@akinon/next/api/image-proxy";
@@ -1 +1 @@
1
- export * from '@akinon/next/api/logout';
1
+ export { POST } from "@akinon/next/api/logout";
@@ -1 +1 @@
1
- export * from '@akinon/next/api/product-categories';
1
+ export { GET } from "@akinon/next/api/product-categories";
@@ -1 +1 @@
1
- export * from '@akinon/next/api/similar-product-list';
1
+ export { GET } from "@akinon/next/api/similar-product-list";
@@ -1 +1 @@
1
- export * from '@akinon/next/api/similar-products';
1
+ export { GET, POST } from "@akinon/next/api/similar-products";
@@ -1 +1 @@
1
- export * from '@akinon/next/api/virtual-try-on';
1
+ export { GET, POST, PUT, OPTIONS } from "@akinon/next/api/virtual-try-on";
@@ -1 +1 @@
1
- export * from '@akinon/next/api/web-vitals';
1
+ export { POST } from "@akinon/next/api/web-vitals";
@@ -1,13 +1,25 @@
1
1
  'use client';
2
2
 
3
3
  import { Button, Icon, LoaderSpinner, Select } from '@theme/components';
4
- import {
5
- QuantityDisplayType,
6
- QuantityStyles
7
- } from '@theme/views/product-detail';
8
4
  import clsx from 'clsx';
9
5
  import { useMemo } from 'react';
10
6
 
7
+ type QuantityDisplayType = 'buttons' | 'dropdown';
8
+
9
+ type QuantityStyles = {
10
+ width?: string;
11
+ height?: string;
12
+ color?: string;
13
+ 'background-color'?: string;
14
+ 'border-color'?: string;
15
+ 'border-width'?: string;
16
+ 'border-radius'?: string;
17
+ 'font-size'?: string;
18
+ 'font-weight'?: string | number;
19
+ 'button-color'?: string;
20
+ 'button-hover-color'?: string;
21
+ };
22
+
11
23
  interface QuantitySelectorProps {
12
24
  quantity: number;
13
25
  onChange?: (newQuantity: number) => void;
@@ -136,7 +136,7 @@ export function WidgetContent({
136
136
  case 'text':
137
137
  Tag = (
138
138
  componentData.tag || 'div'
139
- ).toLowerCase() as keyof JSX.IntrinsicElements;
139
+ ).toLowerCase() as keyof React.JSX.IntrinsicElements;
140
140
  return wrapWithTooltip(
141
141
  <Tag
142
142
  id={componentId}
@@ -278,7 +278,7 @@ export function WidgetContent({
278
278
  default:
279
279
  if (componentData.tag) {
280
280
  CustomTag =
281
- componentData.tag.toLowerCase() as keyof JSX.IntrinsicElements;
281
+ componentData.tag.toLowerCase() as keyof React.JSX.IntrinsicElements;
282
282
  return wrapWithTooltip(
283
283
  <CustomTag
284
284
  id={componentId}
@@ -307,7 +307,7 @@ export function WidgetContent({
307
307
  if (parentData && !skipParentWrapper) {
308
308
  const ParentTag = (
309
309
  parentData.tag || 'div'
310
- ).toLowerCase() as keyof JSX.IntrinsicElements;
310
+ ).toLowerCase() as keyof React.JSX.IntrinsicElements;
311
311
  return (
312
312
  <ParentTag
313
313
  id={parentData.id}
@@ -1,17 +1,17 @@
1
- enum GENERAL_ROUTES {
1
+ export enum GENERAL_ROUTES {
2
2
  HOME = '/',
3
3
  BASKET = '/baskets/basket',
4
4
  LIST = '/list'
5
5
  }
6
6
 
7
- enum AUTH_ROUTES {
7
+ export enum AUTH_ROUTES {
8
8
  AUTH = '/users/auth',
9
9
  FORGOT_PASSWORD = '/users/password/reset',
10
10
  EMAIL_SET_PRIMARY = '/users/email-set-primary/.+',
11
11
  CONFIRM_EMAIL = '/users/registration/account-confirm-email/.+'
12
12
  }
13
13
 
14
- enum ACCOUNT_ROUTES {
14
+ export enum ACCOUNT_ROUTES {
15
15
  ACCOUNT = '/account',
16
16
  ACCOUNT_ADDRESS = '/account/address',
17
17
  ACCOUNT_CHANGE_EMAIL = '/account/change-email',
@@ -25,17 +25,17 @@ enum ACCOUNT_ROUTES {
25
25
  ANONYMOUS_TRACKING = '/anonymous-tracking'
26
26
  }
27
27
 
28
- enum ORDER_ROUTES {
28
+ export enum ORDER_ROUTES {
29
29
  CHECKOUT = '/orders/checkout',
30
30
  CHECKOUT_COMPLETED = '/orders/completed',
31
31
  PAYMENT_GATEWAY_HASO = '/payment-gateway/haso'
32
32
  }
33
33
 
34
- enum FLATPAGE_ROUTES {
34
+ export enum FLATPAGE_ROUTES {
35
35
  CONTACT_US = '/contact-us'
36
36
  }
37
37
 
38
- enum PRODUCT_ROUTES {}
38
+ export enum PRODUCT_ROUTES {}
39
39
 
40
40
  export const ROUTES = {
41
41
  ...GENERAL_ROUTES,