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

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 (140) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/app-template/CHANGELOG.md +170 -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/codemods/migrate-auth-v5/index.js +339 -0
  66. package/codemods/migrate-auth-v5/transform.js +86 -0
  67. package/dist/commands/plugins.js +23 -2
  68. package/package.json +1 -1
  69. package/app-template/src/app/[commerce]/[locale]/[currency]/pages/[slug]/page.tsx +0 -15
  70. package/app-template/src/views/basket/basket-summary-context.tsx +0 -560
  71. package/app-template/src/views/basket/designer-context.tsx +0 -617
  72. package/app-template/src/views/breadcrumb/breadcrumb-client.tsx +0 -190
  73. package/app-template/src/views/breadcrumb/breadcrumb-registrar.tsx +0 -286
  74. package/app-template/src/views/breadcrumb/constants.ts +0 -15
  75. package/app-template/src/views/breadcrumb/index.tsx +0 -127
  76. package/app-template/src/views/category/native-widget-context.tsx +0 -257
  77. package/app-template/src/views/category/product-list-registrar.tsx +0 -665
  78. package/app-template/src/views/checkout/checkout-address-registrar.tsx +0 -254
  79. package/app-template/src/views/checkout/checkout-buttons-registrar.tsx +0 -183
  80. package/app-template/src/views/checkout/checkout-delivery-method-registrar.tsx +0 -259
  81. package/app-template/src/views/checkout/checkout-payment-options-registrar.tsx +0 -253
  82. package/app-template/src/views/checkout/checkout-summary-registrar.tsx +0 -183
  83. package/app-template/src/views/checkout/constants.ts +0 -5
  84. package/app-template/src/views/checkout/steps/payment/options/masterpass-rest.tsx +0 -15
  85. package/app-template/src/views/checkout/steps/payment/options/saved-card.tsx +0 -18
  86. package/app-template/src/views/footer/footer-app-banner-context.tsx +0 -326
  87. package/app-template/src/views/footer/footer-bottom-context.tsx +0 -215
  88. package/app-template/src/views/footer/footer-bottom-wrapper.tsx +0 -74
  89. package/app-template/src/views/footer/footer-layout-constants.ts +0 -35
  90. package/app-template/src/views/footer/footer-layout-registrar.tsx +0 -342
  91. package/app-template/src/views/footer/footer-layout-switcher.tsx +0 -110
  92. package/app-template/src/views/footer/footer-menu-context.tsx +0 -211
  93. package/app-template/src/views/footer/footer-native-widgets.tsx +0 -60
  94. package/app-template/src/views/footer/footer-social-context.tsx +0 -254
  95. package/app-template/src/views/footer/footer-subscription-context.tsx +0 -210
  96. package/app-template/src/views/footer/footer-utils.ts +0 -43
  97. package/app-template/src/views/footer/footer-value-props-context.tsx +0 -326
  98. package/app-template/src/views/footer/logo-settings.ts +0 -183
  99. package/app-template/src/views/footer/native-widget-config.ts +0 -262
  100. package/app-template/src/views/footer/subscription-settings.ts +0 -122
  101. package/app-template/src/views/footer/use-footer-logo.ts +0 -162
  102. package/app-template/src/views/header/designer-context.tsx +0 -261
  103. package/app-template/src/views/header/header-announcement-registrar.tsx +0 -267
  104. package/app-template/src/views/header/header-client-wrapper.tsx +0 -496
  105. package/app-template/src/views/header/header-content.tsx +0 -1026
  106. package/app-template/src/views/header/header-currency-registrar.tsx +0 -348
  107. package/app-template/src/views/header/header-icons-context.tsx +0 -262
  108. package/app-template/src/views/header/header-language-registrar.tsx +0 -348
  109. package/app-template/src/views/header/header-layout-context.tsx +0 -143
  110. package/app-template/src/views/header/header-layout-registrar.tsx +0 -658
  111. package/app-template/src/views/header/header-logo-context.tsx +0 -228
  112. package/app-template/src/views/header/header-logo.tsx +0 -118
  113. package/app-template/src/views/header/header-mini-basket-context.tsx +0 -524
  114. package/app-template/src/views/header/header-search-registrar.tsx +0 -511
  115. package/app-template/src/views/header/header-text-slider-registrar.tsx +0 -382
  116. package/app-template/src/views/header/inline-search.tsx +0 -262
  117. package/app-template/src/views/header/navbar-menu-context.tsx +0 -219
  118. package/app-template/src/views/header/search/search-input.tsx +0 -61
  119. package/app-template/src/views/header/server-settings-parser.ts +0 -1105
  120. package/app-template/src/views/header/use-header-icons.ts +0 -241
  121. package/app-template/src/views/header/use-header-logo.ts +0 -213
  122. package/app-template/src/views/header/use-navbar-menu.ts +0 -179
  123. package/app-template/src/views/product/accordion-section.tsx +0 -61
  124. package/app-template/src/views/product/custom-button-group.tsx +0 -69
  125. package/app-template/src/views/product/favorites-button-section.tsx +0 -69
  126. package/app-template/src/views/product/find-in-store-section.tsx +0 -60
  127. package/app-template/src/views/product/product-info-section.tsx +0 -140
  128. package/app-template/src/views/product/quantity-section.tsx +0 -73
  129. package/app-template/src/views/product/sale-tag.tsx +0 -10
  130. package/app-template/src/views/product/share-section.tsx +0 -357
  131. package/app-template/src/views/product/variants-section.tsx +0 -126
  132. package/app-template/src/views/product-detail/constants.ts +0 -272
  133. package/app-template/src/views/product-detail/index.ts +0 -10
  134. package/app-template/src/views/product-detail/product-detail-registrar.tsx +0 -616
  135. package/app-template/src/widgets/footer-app-banner.tsx +0 -444
  136. package/app-template/src/widgets/footer-bottom.tsx +0 -127
  137. package/app-template/src/widgets/footer-menu-compact.tsx +0 -238
  138. package/app-template/src/widgets/footer-menu-two.tsx +0 -298
  139. package/app-template/src/widgets/footer-social-client.tsx +0 -251
  140. 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')}