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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/app-template/CHANGELOG.md +138 -0
  3. package/app-template/next.config.mjs +0 -1
  4. package/app-template/package.json +31 -30
  5. package/app-template/src/app/[pz]/[...prettyurl]/page.tsx +2 -2
  6. package/app-template/src/app/[pz]/account/layout.tsx +2 -1
  7. package/app-template/src/app/{[commerce]/[locale]/[currency] → [pz]}/blog/[slug]/page.tsx +4 -2
  8. package/app-template/src/app/[pz]/category/[pk]/page.tsx +11 -1
  9. package/app-template/src/app/[pz]/group-product/[pk]/page.tsx +2 -2
  10. package/app-template/src/app/[pz]/layout.tsx +3 -1
  11. package/app-template/src/app/[pz]/list/page.tsx +11 -1
  12. package/app-template/src/app/[pz]/page.tsx +13 -35
  13. package/app-template/src/app/[pz]/pages/[slug]/page.tsx +19 -0
  14. package/app-template/src/app/[pz]/product/[pk]/page.tsx +2 -2
  15. package/app-template/src/app/api/barcode-search/route.ts +1 -1
  16. package/app-template/src/app/api/cache/route.ts +1 -1
  17. package/app-template/src/app/api/image-proxy/route.ts +1 -1
  18. package/app-template/src/app/api/logout/route.ts +1 -1
  19. package/app-template/src/app/api/product-categories/route.ts +1 -1
  20. package/app-template/src/app/api/similar-product-list/route.ts +1 -1
  21. package/app-template/src/app/api/similar-products/route.ts +1 -1
  22. package/app-template/src/app/api/virtual-try-on/route.ts +1 -1
  23. package/app-template/src/app/api/web-vitals/route.ts +1 -1
  24. package/app-template/src/components/quantity-selector.tsx +16 -4
  25. package/app-template/src/components/widget-content.tsx +3 -3
  26. package/app-template/src/routes/index.ts +6 -6
  27. package/app-template/src/utils/__tests__/theme-page-context.test.ts +145 -0
  28. package/app-template/src/utils/theme-page-context.ts +309 -0
  29. package/app-template/src/views/basket/basket-item.tsx +107 -691
  30. package/app-template/src/views/basket/index.ts +0 -2
  31. package/app-template/src/views/basket/summary.tsx +75 -496
  32. package/app-template/src/views/breadcrumb.tsx +38 -13
  33. package/app-template/src/views/category/category-header.tsx +66 -289
  34. package/app-template/src/views/category/category-info.tsx +24 -173
  35. package/app-template/src/views/category/filters/index.tsx +48 -208
  36. package/app-template/src/views/category/layout.tsx +5 -7
  37. package/app-template/src/views/checkout/index.tsx +0 -5
  38. package/app-template/src/views/checkout/steps/payment/index.tsx +2 -5
  39. package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +1 -72
  40. package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +40 -171
  41. package/app-template/src/views/checkout/steps/shipping/address-box.tsx +12 -74
  42. package/app-template/src/views/checkout/steps/shipping/addresses.tsx +45 -128
  43. package/app-template/src/views/checkout/steps/shipping/shipping-options.tsx +27 -232
  44. package/app-template/src/views/checkout/summary.tsx +29 -303
  45. package/app-template/src/views/footer.tsx +13 -415
  46. package/app-template/src/views/guest-login/index.tsx +1 -1
  47. package/app-template/src/views/header/action-menu.tsx +45 -277
  48. package/app-template/src/views/header/band.tsx +21 -6
  49. package/app-template/src/views/header/index.tsx +47 -109
  50. package/app-template/src/views/header/mini-basket.tsx +45 -820
  51. package/app-template/src/views/header/navbar.tsx +111 -178
  52. package/app-template/src/views/header/search/index.tsx +32 -71
  53. package/app-template/src/views/header/search/results.tsx +65 -127
  54. package/app-template/src/views/product/accordion-wrapper.tsx +43 -135
  55. package/app-template/src/views/product/index.ts +1 -1
  56. package/app-template/src/views/product/layout.tsx +7 -2
  57. package/app-template/src/views/product/misc-buttons.tsx +25 -339
  58. package/app-template/src/views/product/product-actions.tsx +8 -137
  59. package/app-template/src/views/product/product-info.tsx +31 -69
  60. package/app-template/src/views/product/product-share.tsx +8 -11
  61. package/app-template/src/views/product/slider.tsx +79 -117
  62. package/app-template/src/views/product-item/index.tsx +46 -119
  63. package/app-template/src/widgets/footer-social.tsx +16 -47
  64. package/app-template/src/widgets/footer-subscription/index.tsx +17 -183
  65. package/dist/commands/plugins.js +23 -2
  66. package/package.json +1 -1
  67. package/app-template/src/app/[commerce]/[locale]/[currency]/pages/[slug]/page.tsx +0 -15
  68. package/app-template/src/views/basket/basket-summary-context.tsx +0 -560
  69. package/app-template/src/views/basket/designer-context.tsx +0 -617
  70. package/app-template/src/views/breadcrumb/breadcrumb-client.tsx +0 -190
  71. package/app-template/src/views/breadcrumb/breadcrumb-registrar.tsx +0 -286
  72. package/app-template/src/views/breadcrumb/constants.ts +0 -15
  73. package/app-template/src/views/breadcrumb/index.tsx +0 -127
  74. package/app-template/src/views/category/native-widget-context.tsx +0 -257
  75. package/app-template/src/views/category/product-list-registrar.tsx +0 -665
  76. package/app-template/src/views/checkout/checkout-address-registrar.tsx +0 -254
  77. package/app-template/src/views/checkout/checkout-buttons-registrar.tsx +0 -183
  78. package/app-template/src/views/checkout/checkout-delivery-method-registrar.tsx +0 -259
  79. package/app-template/src/views/checkout/checkout-payment-options-registrar.tsx +0 -253
  80. package/app-template/src/views/checkout/checkout-summary-registrar.tsx +0 -183
  81. package/app-template/src/views/checkout/constants.ts +0 -5
  82. package/app-template/src/views/checkout/steps/payment/options/masterpass-rest.tsx +0 -15
  83. package/app-template/src/views/checkout/steps/payment/options/saved-card.tsx +0 -18
  84. package/app-template/src/views/footer/footer-app-banner-context.tsx +0 -326
  85. package/app-template/src/views/footer/footer-bottom-context.tsx +0 -215
  86. package/app-template/src/views/footer/footer-bottom-wrapper.tsx +0 -74
  87. package/app-template/src/views/footer/footer-layout-constants.ts +0 -35
  88. package/app-template/src/views/footer/footer-layout-registrar.tsx +0 -342
  89. package/app-template/src/views/footer/footer-layout-switcher.tsx +0 -110
  90. package/app-template/src/views/footer/footer-menu-context.tsx +0 -211
  91. package/app-template/src/views/footer/footer-native-widgets.tsx +0 -60
  92. package/app-template/src/views/footer/footer-social-context.tsx +0 -254
  93. package/app-template/src/views/footer/footer-subscription-context.tsx +0 -210
  94. package/app-template/src/views/footer/footer-utils.ts +0 -43
  95. package/app-template/src/views/footer/footer-value-props-context.tsx +0 -326
  96. package/app-template/src/views/footer/logo-settings.ts +0 -183
  97. package/app-template/src/views/footer/native-widget-config.ts +0 -262
  98. package/app-template/src/views/footer/subscription-settings.ts +0 -122
  99. package/app-template/src/views/footer/use-footer-logo.ts +0 -162
  100. package/app-template/src/views/header/designer-context.tsx +0 -261
  101. package/app-template/src/views/header/header-announcement-registrar.tsx +0 -267
  102. package/app-template/src/views/header/header-client-wrapper.tsx +0 -496
  103. package/app-template/src/views/header/header-content.tsx +0 -1026
  104. package/app-template/src/views/header/header-currency-registrar.tsx +0 -348
  105. package/app-template/src/views/header/header-icons-context.tsx +0 -262
  106. package/app-template/src/views/header/header-language-registrar.tsx +0 -348
  107. package/app-template/src/views/header/header-layout-context.tsx +0 -143
  108. package/app-template/src/views/header/header-layout-registrar.tsx +0 -658
  109. package/app-template/src/views/header/header-logo-context.tsx +0 -228
  110. package/app-template/src/views/header/header-logo.tsx +0 -118
  111. package/app-template/src/views/header/header-mini-basket-context.tsx +0 -524
  112. package/app-template/src/views/header/header-search-registrar.tsx +0 -511
  113. package/app-template/src/views/header/header-text-slider-registrar.tsx +0 -382
  114. package/app-template/src/views/header/inline-search.tsx +0 -262
  115. package/app-template/src/views/header/navbar-menu-context.tsx +0 -219
  116. package/app-template/src/views/header/search/search-input.tsx +0 -61
  117. package/app-template/src/views/header/server-settings-parser.ts +0 -1105
  118. package/app-template/src/views/header/use-header-icons.ts +0 -241
  119. package/app-template/src/views/header/use-header-logo.ts +0 -213
  120. package/app-template/src/views/header/use-navbar-menu.ts +0 -179
  121. package/app-template/src/views/product/accordion-section.tsx +0 -61
  122. package/app-template/src/views/product/custom-button-group.tsx +0 -69
  123. package/app-template/src/views/product/favorites-button-section.tsx +0 -69
  124. package/app-template/src/views/product/find-in-store-section.tsx +0 -60
  125. package/app-template/src/views/product/product-info-section.tsx +0 -140
  126. package/app-template/src/views/product/quantity-section.tsx +0 -73
  127. package/app-template/src/views/product/sale-tag.tsx +0 -10
  128. package/app-template/src/views/product/share-section.tsx +0 -357
  129. package/app-template/src/views/product/variants-section.tsx +0 -126
  130. package/app-template/src/views/product-detail/constants.ts +0 -272
  131. package/app-template/src/views/product-detail/index.ts +0 -10
  132. package/app-template/src/views/product-detail/product-detail-registrar.tsx +0 -616
  133. package/app-template/src/widgets/footer-app-banner.tsx +0 -444
  134. package/app-template/src/widgets/footer-bottom.tsx +0 -127
  135. package/app-template/src/widgets/footer-menu-compact.tsx +0 -238
  136. package/app-template/src/widgets/footer-menu-two.tsx +0 -298
  137. package/app-template/src/widgets/footer-social-client.tsx +0 -251
  138. package/app-template/src/widgets/footer-value-props.tsx +0 -201
@@ -1,423 +1,21 @@
1
1
  import 'server-only';
2
2
 
3
- import FooterBottom from '@theme/widgets/footer-bottom';
3
+ import FooterCopyright from '@theme/widgets/footer-copyright';
4
+ import FooterInfo from '@theme/widgets/footer-info';
5
+ import FooterMenu from '@theme/widgets/footer-menu';
4
6
  import FooterSocial from '@theme/widgets/footer-social';
5
7
  import FooterSubscription from '@theme/widgets/footer-subscription';
6
- import FooterMenuTwo from '@theme/widgets/footer-menu-two';
7
- import FooterMenuCompact from '@theme/widgets/footer-menu-compact';
8
- import FooterAppBanner from '@theme/widgets/footer-app-banner';
9
- import FooterValueProps from '@theme/widgets/footer-value-props';
10
- import { getWidgetData } from '@akinon/next/data/server';
11
- import { getThemeSettings } from '@theme/data/server/theme';
12
- import FooterNativeWidgets from './footer/footer-native-widgets';
13
- import FooterLayoutSwitcher from './footer/footer-layout-switcher';
14
- import FooterLayoutRegistrar from './footer/footer-layout-registrar';
15
- import FooterBottomWrapper from './footer/footer-bottom-wrapper';
16
- import {
17
- FOOTER_NATIVE_SECTIONS,
18
- FOOTER_SUBSCRIPTION_SECTION_ID,
19
- FOOTER_MENU_SECTION_ID,
20
- FOOTER_SOCIAL_SECTION_ID,
21
- FOOTER_BOTTOM_SECTION_ID,
22
- FOOTER_APP_BANNER_SECTION_ID,
23
- FOOTER_VALUE_PROPS_SECTION_ID,
24
- FOOTER_SOCIAL_ICONS_BLOCK_ID,
25
- type FooterNativeWidgetSection,
26
- parseWidgetBlockAttributes
27
- } from './footer/native-widget-config';
28
- import { getFooterLogoInitialSettingsFromSections } from './footer/logo-settings';
29
- import { FooterSubscriptionProvider } from './footer/footer-subscription-context';
30
- import { FooterMenuProvider } from './footer/footer-menu-context';
31
- import { FooterSocialProvider, type SocialIconItem } from './footer/footer-social-context';
32
- import { FooterBottomProvider } from './footer/footer-bottom-context';
33
- import { FooterAppBannerProvider } from './footer/footer-app-banner-context';
34
- import { FooterValuePropsProvider } from './footer/footer-value-props-context';
35
- import {
36
- FOOTER_SUBSCRIPTION_DEFAULT_CONTENT,
37
- getFooterSubscriptionInitialBlocks,
38
- mergeFooterSubscriptionContent
39
- } from './footer/subscription-settings';
40
- import {
41
- FOOTER_LAYOUT_SECTION_ID,
42
- FOOTER_LAYOUT_WIDGET_SLUG,
43
- FOOTER_LAYOUT_BLOCK_IDS,
44
- type FooterLayoutType
45
- } from './footer/footer-layout-constants';
46
-
47
- // Block styles type for footer layout
48
- type FooterBlockStyles = Record<string, Record<string, unknown>>;
49
-
50
- /**
51
- * Parse footer layout settings from widget data (server-side)
52
- */
53
- function parseFooterLayoutSettings(
54
- widgetData: { attributes?: Record<string, unknown> } | null
55
- ): { layout: FooterLayoutType; blockStyles: FooterBlockStyles } {
56
- const defaultResult = { layout: 'default' as FooterLayoutType, blockStyles: {} };
57
-
58
- if (!widgetData?.attributes) return defaultResult;
59
-
60
- const result: { layout: FooterLayoutType; blockStyles: FooterBlockStyles } = {
61
- layout: 'default',
62
- blockStyles: {}
63
- };
64
-
65
- // Parse section-level properties (layout)
66
- const sectionData = widgetData.attributes[FOOTER_LAYOUT_SECTION_ID];
67
- if (sectionData) {
68
- try {
69
- const data =
70
- typeof sectionData === 'string'
71
- ? JSON.parse(sectionData)
72
- : typeof sectionData === 'object' && sectionData !== null && 'value' in sectionData
73
- ? JSON.parse((sectionData as { value: string }).value)
74
- : null;
75
-
76
- if (data?.properties?.layout) {
77
- const layout = data.properties.layout;
78
- result.layout = (typeof layout === 'object' ? layout.desktop : layout) as FooterLayoutType;
79
- }
80
- } catch {
81
- // Ignore parse errors
82
- }
83
- }
84
-
85
- // Parse block styles (MAIN_ROW, BOTTOM_ROW)
86
- Object.values(FOOTER_LAYOUT_BLOCK_IDS).forEach((blockId) => {
87
- const blockData = widgetData.attributes?.[blockId];
88
- if (!blockData) return;
89
-
90
- try {
91
- const data =
92
- typeof blockData === 'string'
93
- ? JSON.parse(blockData)
94
- : typeof blockData === 'object' && blockData !== null && 'value' in blockData
95
- ? JSON.parse((blockData as { value: string }).value)
96
- : null;
97
-
98
- if (data?.styles) {
99
- // Convert responsive styles to flat styles (desktop first)
100
- const flatStyles: Record<string, string> = {};
101
- Object.entries(data.styles).forEach(([key, value]) => {
102
- if (typeof value === 'object' && value !== null) {
103
- const responsiveValue = value as Record<string, string>;
104
- flatStyles[key] =
105
- responsiveValue.desktop ||
106
- responsiveValue.mobile ||
107
- Object.values(responsiveValue)[0] ||
108
- '';
109
- } else if (typeof value === 'string') {
110
- flatStyles[key] = value;
111
- }
112
- });
113
-
114
- if (Object.keys(flatStyles).length > 0) {
115
- result.blockStyles[blockId] = flatStyles;
116
- }
117
- }
118
- } catch {
119
- // Ignore parse errors
120
- }
121
- });
122
-
123
- return result;
124
- }
125
-
126
- function getFooterMenuInitialBlocks(
127
- sections: FooterNativeWidgetSection[]
128
- ): FooterNativeWidgetSection['blocks'] {
129
- const menuSection = sections.find(
130
- (s) => s.sectionId === FOOTER_MENU_SECTION_ID
131
- );
132
- return menuSection?.blocks ?? [];
133
- }
134
-
135
- function getFooterSocialInitialBlocks(
136
- sections: FooterNativeWidgetSection[],
137
- defaultIcons?: SocialIconItem[]
138
- ): FooterNativeWidgetSection['blocks'] {
139
- const socialSection = sections.find(
140
- (s) => s.sectionId === FOOTER_SOCIAL_SECTION_ID
141
- );
142
- const blocks = socialSection?.blocks ?? [];
143
-
144
- // If we have default icons, merge them into the footer-social-icons block
145
- if (defaultIcons?.length) {
146
- return blocks.map((block) => {
147
- if (block.id === FOOTER_SOCIAL_ICONS_BLOCK_ID) {
148
- const existingIcons = (block.properties as Record<string, unknown>)?.icons;
149
- // Only set default icons if no icons are already configured
150
- if (!existingIcons || (Array.isArray(existingIcons) && existingIcons.length === 0)) {
151
- return {
152
- ...block,
153
- properties: {
154
- ...block.properties,
155
- icons: defaultIcons
156
- }
157
- };
158
- }
159
- }
160
- return block;
161
- });
162
- }
163
-
164
- return blocks;
165
- }
166
-
167
- function getFooterBottomInitialBlocks(
168
- sections: FooterNativeWidgetSection[]
169
- ): FooterNativeWidgetSection['blocks'] {
170
- const bottomSection = sections.find(
171
- (s) => s.sectionId === FOOTER_BOTTOM_SECTION_ID
172
- );
173
- return bottomSection?.blocks ?? [];
174
- }
175
-
176
- function getFooterAppBannerInitialData(
177
- sections: FooterNativeWidgetSection[]
178
- ): {
179
- blocks: FooterNativeWidgetSection['blocks'];
180
- properties: Record<string, unknown>;
181
- styles: Record<string, unknown>;
182
- } {
183
- const section = sections.find(
184
- (s) => s.sectionId === FOOTER_APP_BANNER_SECTION_ID
185
- );
186
- return {
187
- blocks: section?.blocks ?? [],
188
- properties: section?.sectionProperties ?? {},
189
- styles: section?.sectionStyles ?? {}
190
- };
191
- }
192
-
193
- function getFooterValuePropsInitialData(
194
- sections: FooterNativeWidgetSection[]
195
- ): {
196
- blocks: FooterNativeWidgetSection['blocks'];
197
- properties: Record<string, unknown>;
198
- styles: Record<string, unknown>;
199
- } {
200
- const section = sections.find(
201
- (s) => s.sectionId === FOOTER_VALUE_PROPS_SECTION_ID
202
- );
203
- return {
204
- blocks: section?.blocks ?? [],
205
- properties: section?.sectionProperties ?? {},
206
- styles: section?.sectionStyles ?? {}
207
- };
208
- }
209
-
210
- async function getFooterNativeWidgetSections() {
211
- const sections = await Promise.all(
212
- FOOTER_NATIVE_SECTIONS.map(async section => {
213
- let widgetData: Awaited<ReturnType<typeof getWidgetData>> | null = null;
214
-
215
- try {
216
- widgetData = await getWidgetData({ slug: section.widgetSlug });
217
- } catch {
218
- widgetData = null;
219
- }
220
-
221
- const blocks = section.blocks.map(block => ({
222
- ...block,
223
- ...parseWidgetBlockAttributes(widgetData as { attributes?: Record<string, unknown> }, block.id)
224
- }));
225
-
226
- const sectionAttrs = parseWidgetBlockAttributes(
227
- widgetData as { attributes?: Record<string, unknown> },
228
- section.sectionId
229
- );
230
-
231
- return {
232
- ...section,
233
- blocks,
234
- sectionProperties: sectionAttrs.properties,
235
- sectionStyles: sectionAttrs.styles
236
- } satisfies FooterNativeWidgetSection;
237
- })
238
- );
239
-
240
- return sections;
241
- }
242
-
243
- export default async function Footer() {
244
- const [footerNativeSections, themeSettings, footerSubscriptionData, footerLayoutSettingsData] =
245
- await Promise.all([
246
- getFooterNativeWidgetSections(),
247
- getThemeSettings(),
248
- getWidgetData({ slug: 'footer-subscription' }),
249
- getWidgetData({ slug: FOOTER_LAYOUT_WIDGET_SLUG }).catch(() => null)
250
- ]);
251
- const { layout: initialFooterLayout, blockStyles: initialBlockStyles } = parseFooterLayoutSettings(footerLayoutSettingsData);
252
- const fallbackLogoSrc = themeSettings.logo || '/logo.svg';
253
- const initialFooterLogoSettings = getFooterLogoInitialSettingsFromSections(
254
- footerNativeSections,
255
- fallbackLogoSrc
256
- );
257
- const footerSubscriptionTitle =
258
- (footerSubscriptionData?.attributes as Record<string, { value?: string }> | undefined)?.title?.value || '';
259
- const footerSubscriptionDescription =
260
- (footerSubscriptionData?.attributes as Record<string, { value?: string }> | undefined)?.description?.value || '';
261
- const initialFooterSubscriptionBlocks = mergeFooterSubscriptionContent(
262
- getFooterSubscriptionInitialBlocks(footerNativeSections),
263
- {
264
- title:
265
- footerSubscriptionTitle ||
266
- FOOTER_SUBSCRIPTION_DEFAULT_CONTENT.title,
267
- description:
268
- footerSubscriptionDescription ||
269
- FOOTER_SUBSCRIPTION_DEFAULT_CONTENT.description
270
- }
271
- );
272
-
273
- // Convert theme-config socialNetworks to SocialIconItem format for editor
274
- // Must be calculated before getFooterSocialInitialBlocks to pass as default
275
- const defaultSocialIcons: SocialIconItem[] = Object.entries(themeSettings.socialNetworks || {})
276
- .filter(([, value]: [string, unknown]) => {
277
- const v = value as { icon?: string };
278
- return v.icon;
279
- })
280
- .map(([key, value]: [string, unknown]) => {
281
- const v = value as { url?: string };
282
- return {
283
- icon: key,
284
- link: v.url || '#',
285
- size: 24,
286
- color: undefined
287
- };
288
- });
289
-
290
- const initialFooterSocialBlocks = getFooterSocialInitialBlocks(
291
- footerNativeSections,
292
- defaultSocialIcons
293
- );
294
-
295
- const footerNativeSectionsWithContent = footerNativeSections.map(
296
- (section) => {
297
- if (section.sectionId === FOOTER_SUBSCRIPTION_SECTION_ID) {
298
- return { ...section, blocks: initialFooterSubscriptionBlocks };
299
- }
300
- if (section.sectionId === FOOTER_SOCIAL_SECTION_ID) {
301
- return { ...section, blocks: initialFooterSocialBlocks };
302
- }
303
- if (section.sectionId === FOOTER_APP_BANNER_SECTION_ID) {
304
- return section; // App Banner blocks come from FOOTER_NATIVE_SECTIONS
305
- }
306
- if (section.sectionId === FOOTER_VALUE_PROPS_SECTION_ID) {
307
- return section; // Value Props blocks come from FOOTER_NATIVE_SECTIONS
308
- }
309
- return section;
310
- }
311
- );
312
- const initialFooterMenuBlocks = getFooterMenuInitialBlocks(
313
- footerNativeSectionsWithContent
314
- );
315
- const initialFooterBottomBlocks = getFooterBottomInitialBlocks(
316
- footerNativeSectionsWithContent
317
- );
318
- const initialAppBannerData = getFooterAppBannerInitialData(
319
- footerNativeSectionsWithContent
320
- );
321
- const initialValuePropsData = getFooterValuePropsInitialData(
322
- footerNativeSectionsWithContent
323
- );
324
8
 
9
+ export default function Footer() {
325
10
  return (
326
- <footer className="px-4 pt-16 border-t border-[#d0d0d0] lg:px-0">
327
- <FooterNativeWidgets sections={footerNativeSectionsWithContent} />
328
-
329
- <FooterValuePropsProvider
330
- initialBlocks={initialValuePropsData.blocks}
331
- initialProperties={initialValuePropsData.properties}
332
- initialStyles={initialValuePropsData.styles}
333
- >
334
- <FooterValueProps renderPosition="footer-top" />
335
- </FooterValuePropsProvider>
336
-
337
- <FooterAppBannerProvider
338
- initialBlocks={initialAppBannerData.blocks}
339
- initialProperties={initialAppBannerData.properties}
340
- initialStyles={initialAppBannerData.styles}
341
- >
342
- <FooterAppBanner renderPosition="footer-top" />
343
- </FooterAppBannerProvider>
344
-
345
- <FooterLayoutRegistrar
346
- initialLayout={initialFooterLayout}
347
- initialBlockStyles={initialBlockStyles}
348
- >
349
- <FooterLayoutSwitcher
350
- defaultLayout={
351
- <>
352
- <FooterMenuProvider initialBlocks={initialFooterMenuBlocks}>
353
- <FooterMenuTwo
354
- fallbackLogoSrc={fallbackLogoSrc}
355
- initialLogoSettings={initialFooterLogoSettings}
356
- />
357
- </FooterMenuProvider>
358
- <div className="container flex flex-col py-16 gap-10 lg:items-center lg:justify-between lg:flex-row">
359
- <FooterSubscriptionProvider
360
- initialBlocks={initialFooterSubscriptionBlocks}
361
- >
362
- <FooterSubscription
363
- title={footerSubscriptionTitle}
364
- description={footerSubscriptionDescription}
365
- />
366
- </FooterSubscriptionProvider>
367
- <FooterSocialProvider initialBlocks={initialFooterSocialBlocks} defaultIcons={defaultSocialIcons}>
368
- <FooterSocial />
369
- </FooterSocialProvider>
370
- </div>
371
- </>
372
- }
373
- compactLayout={
374
- <div className="container flex flex-col lg:flex-row gap-10 lg:gap-16 py-8">
375
- {/* Menu on the left - takes more space */}
376
- <div className="flex-1 lg:flex-[2]">
377
- <FooterMenuProvider initialBlocks={initialFooterMenuBlocks}>
378
- <FooterMenuCompact />
379
- </FooterMenuProvider>
380
- </div>
381
-
382
- {/* Subscription + Social stacked on the right */}
383
- <div className="flex flex-col gap-8 lg:flex-1">
384
- <FooterSubscriptionProvider
385
- initialBlocks={initialFooterSubscriptionBlocks}
386
- >
387
- <FooterSubscription
388
- title={footerSubscriptionTitle}
389
- description={footerSubscriptionDescription}
390
- />
391
- </FooterSubscriptionProvider>
392
- <FooterSocialProvider initialBlocks={initialFooterSocialBlocks} defaultIcons={defaultSocialIcons}>
393
- <FooterSocial />
394
- </FooterSocialProvider>
395
- </div>
396
- </div>
397
- }
398
- />
399
- <FooterBottomWrapper>
400
- <FooterBottomProvider initialBlocks={initialFooterBottomBlocks}>
401
- <FooterBottom />
402
- </FooterBottomProvider>
403
- </FooterBottomWrapper>
404
- </FooterLayoutRegistrar>
405
-
406
- <FooterValuePropsProvider
407
- initialBlocks={initialValuePropsData.blocks}
408
- initialProperties={initialValuePropsData.properties}
409
- initialStyles={initialValuePropsData.styles}
410
- >
411
- <FooterValueProps renderPosition="footer-bottom" />
412
- </FooterValuePropsProvider>
413
-
414
- <FooterAppBannerProvider
415
- initialBlocks={initialAppBannerData.blocks}
416
- initialProperties={initialAppBannerData.properties}
417
- initialStyles={initialAppBannerData.styles}
418
- >
419
- <FooterAppBanner renderPosition="footer-bottom" />
420
- </FooterAppBannerProvider>
421
- </footer>
11
+ <div className="lg:pt-16 lg:border-t lg:border-gray">
12
+ <div className="container px-4 pb-0 mx-auto md:flex md:flex-wrap lg:pb-16 lg:px-0">
13
+ <FooterInfo />
14
+ <FooterMenu />
15
+ <FooterSubscription />
16
+ </div>
17
+ <FooterSocial />
18
+ <FooterCopyright />
19
+ </div>
422
20
  );
423
21
  }
@@ -84,7 +84,7 @@ const GuestLogin = () => {
84
84
  className="h-12"
85
85
  name="phone_number"
86
86
  type="tel"
87
- format={user_phone_format.replace(/\9/g, '#')}
87
+ format={user_phone_format.replace(/9/g, '#')}
88
88
  mask="_"
89
89
  control={control}
90
90
  {...register('phone_number')}