@levo-so/blocks 0.1.2 → 0.1.52

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 (115) hide show
  1. package/package.json +2 -2
  2. package/src/blocks/about-us/about-us-1.schema.ts +26 -12
  3. package/src/blocks/about-us/about-us-2.schema.ts +269 -0
  4. package/src/blocks/about-us/about-us-2.tsx +47 -0
  5. package/src/blocks/blogs/blog-listing-1.schema.ts +64 -10
  6. package/src/blocks/blogs/blog-listing-1.tsx +79 -56
  7. package/src/blocks/blogs/blog-listing-2.schema.ts +3141 -31
  8. package/src/blocks/blogs/blog-listing-2.tsx +16 -11
  9. package/src/blocks/blogs/blog-listing-3.schema.ts +2476 -0
  10. package/src/blocks/blogs/blog-listing-3.tsx +84 -0
  11. package/src/blocks/blogs/blog-post-1.schema.ts +17 -9
  12. package/src/blocks/blogs/blog-post-2.schema.ts +13 -56
  13. package/src/blocks/blogs/blog-post-3.schema.ts +284 -0
  14. package/src/blocks/blogs/blog-post-3.tsx +58 -0
  15. package/src/blocks/cards/cards-10.schema.ts +579 -0
  16. package/src/blocks/cards/cards-10.tsx +2 -0
  17. package/src/blocks/cards/cards-11.schema.ts +514 -36
  18. package/src/blocks/cards/cards-13.schema.ts +615 -0
  19. package/src/blocks/cards/cards-13.tsx +67 -0
  20. package/src/blocks/cards/cards-2.schema.ts +14 -17
  21. package/src/blocks/cards/cards-3.schema.ts +15 -25
  22. package/src/blocks/cards/cards-4.schema.ts +22 -44
  23. package/src/blocks/cards/cards-4.tsx +39 -39
  24. package/src/blocks/cards/cards-5.schema.ts +15 -34
  25. package/src/blocks/cards/cards-6.schema.ts +1500 -0
  26. package/src/blocks/cards/cards-6.tsx +11 -7
  27. package/src/blocks/cards/cards-7.schema.ts +1772 -27
  28. package/src/blocks/cards/cards-7.tsx +32 -0
  29. package/src/blocks/cards/cards-8.schema.ts +9 -9
  30. package/src/blocks/contact-us/contact-us-1.schema.ts +13 -6
  31. package/src/blocks/contact-us/contact-us-2.schema.ts +43 -43
  32. package/src/blocks/content/content-1.schema.ts +45 -67
  33. package/src/blocks/content/content-2.schema.ts +14 -11
  34. package/src/blocks/content/content-3.schema.ts +17 -115
  35. package/src/blocks/content/content-3.tsx +1 -0
  36. package/src/blocks/content/content-5.tsx +1 -0
  37. package/src/blocks/content/content-6.tsx +1 -0
  38. package/src/blocks/content/content-7.schema.ts +723 -0
  39. package/src/blocks/content/content-7.tsx +53 -0
  40. package/src/blocks/cta/cta-1.schema.ts +18 -26
  41. package/src/blocks/cta/cta-3.schema.ts +60 -0
  42. package/src/blocks/event/event-details.schema.ts +30 -35
  43. package/src/blocks/event/event-details.tsx +74 -79
  44. package/src/blocks/event/event-listing-2.schema.ts +85 -26
  45. package/src/blocks/event/event-listing-2.tsx +76 -52
  46. package/src/blocks/event/event-listing-3.schema.ts +58 -42
  47. package/src/blocks/event/event-listing-3.tsx +4 -9
  48. package/src/blocks/event/event-listing-4.schema.ts +3528 -0
  49. package/src/blocks/event/event-listing-4.tsx +97 -0
  50. package/src/blocks/event/event-listing.schema.ts +81 -86
  51. package/src/blocks/event/event-listing.tsx +1 -3
  52. package/src/blocks/faq/faq-1.schema.ts +13 -10
  53. package/src/blocks/faq/faq-2.schema.ts +12 -10
  54. package/src/blocks/features/features-1/variants/default.ts +12 -3
  55. package/src/blocks/features/features-2.schema.ts +192 -59
  56. package/src/blocks/features/features-3.schema.ts +11 -25
  57. package/src/blocks/features/features-4.schema.ts +20 -35
  58. package/src/blocks/features/features-5.schema.ts +18 -37
  59. package/src/blocks/footer/footer-1.schema.ts +28 -5
  60. package/src/blocks/footer/footer-2.schema.ts +18 -3
  61. package/src/blocks/footer/footer-3.schema.ts +85 -160
  62. package/src/blocks/footer/footer-3.tsx +1 -2
  63. package/src/blocks/footer/footer-4.schema.ts +10 -5
  64. package/src/blocks/footer/footer-4.tsx +1 -1
  65. package/src/blocks/footer/footer-5.schema.ts +10 -0
  66. package/src/blocks/footer/footer-5.tsx +11 -3
  67. package/src/blocks/footer/footer-6.schema.ts +730 -0
  68. package/src/blocks/footer/footer-6.tsx +100 -0
  69. package/src/blocks/hero/hero-1.schema.ts +165 -185
  70. package/src/blocks/hero/hero-10.schema.ts +175 -0
  71. package/src/blocks/hero/hero-10.tsx +35 -0
  72. package/src/blocks/hero/hero-2.schema.ts +60 -104
  73. package/src/blocks/hero/hero-2.tsx +11 -3
  74. package/src/blocks/hero/hero-3.schema.ts +68 -64
  75. package/src/blocks/hero/hero-4.schema.ts +148 -48
  76. package/src/blocks/hero/hero-5.schema.ts +29 -23
  77. package/src/blocks/hero/hero-6.schema.ts +28 -66
  78. package/src/blocks/hero/hero-7.schema.ts +34 -37
  79. package/src/blocks/hero/hero-8.schema.ts +5 -1
  80. package/src/blocks/index.ts +11 -0
  81. package/src/blocks/logos/logos-1.schema.ts +10 -4
  82. package/src/blocks/navbar/navbar-1.schema.ts +3 -5
  83. package/src/blocks/navbar/navbar-1.tsx +5 -19
  84. package/src/blocks/navbar/navbar-2.schema.ts +2 -4
  85. package/src/blocks/navbar/navbar-2.tsx +4 -18
  86. package/src/blocks/navbar/navbar-3.schema.ts +6834 -0
  87. package/src/blocks/navbar/navbar-3.tsx +551 -0
  88. package/src/blocks/pricing/pricing-1.schema.ts +23 -37
  89. package/src/blocks/products/products-listing-1.schema.ts +73 -76
  90. package/src/blocks/profile/profile-1.schema.ts +399 -0
  91. package/src/blocks/profile/profile-1.tsx +64 -0
  92. package/src/blocks/stats/stats-1.schema.ts +34 -3
  93. package/src/blocks/stats/variants/default.ts +0 -1
  94. package/src/blocks/stats/variants/hero.ts +2 -13
  95. package/src/blocks/team/team-1.schema.ts +50 -22
  96. package/src/blocks/team/team-1.tsx +9 -3
  97. package/src/blocks/team/team-2.schema.ts +96 -167
  98. package/src/blocks/team/team-3.schema.ts +32 -49
  99. package/src/blocks/team/team-4.schema.ts +551 -0
  100. package/src/blocks/team/team-4.tsx +59 -0
  101. package/src/blocks/termsAndPrivacy/terms-and-conditions-1.schema.ts +10 -20
  102. package/src/blocks/testimonial/testimonial-1.schema.ts +14 -8
  103. package/src/blocks/testimonial/testimonial-2.schema.ts +2 -2
  104. package/src/blocks/testimonial/testimonial-3.schema.ts +12 -18
  105. package/src/blocks/testimonial/testimonial-4.schema.ts +131 -126
  106. package/src/blocks/testimonial/testimonial-5/variants/default.ts +510 -0
  107. package/src/blocks/testimonial/testimonial-5/variants/index.ts +4 -0
  108. package/src/blocks/testimonial/testimonial-5/variants/testimonialWithLogo.ts +887 -0
  109. package/src/blocks/testimonial/testimonial-5/variants/testimonialWithRatings.ts +923 -0
  110. package/src/blocks/testimonial/testimonial-5.schema.ts +62 -246
  111. package/src/blocks/testimonial/testimonial-5.tsx +32 -8
  112. package/src/blocks/testimonial/testimonial-6.schema.ts +986 -23
  113. package/src/blocks/testimonial/testimonial-6.tsx +107 -57
  114. package/src/schemas/blocks.ts +22 -0
  115. package/src/schemas/categories.ts +6 -0
@@ -0,0 +1,551 @@
1
+ "use client";
2
+ // Test libraries-only change
3
+
4
+ import React, { useEffect, useState } from "react";
5
+ import { cn } from "@levo-so/react";
6
+ import type { ILevoBlockBaseProps } from "@levo-so/studio";
7
+ import {
8
+ Box,
9
+ Button,
10
+ Heading,
11
+ Image,
12
+ PopoverRoot,
13
+ PopoverContent,
14
+ PopoverTrigger,
15
+ Typography,
16
+ Section,
17
+ Container,
18
+ Icon,
19
+ UserMenu,
20
+ } from "@levo-so/studio";
21
+ import { ChevronDown, Menu, X, ChevronRight } from "lucide-react";
22
+
23
+ import type { INavbar3Content } from "./navbar-3.schema";
24
+
25
+ const NestedDropdownItem: React.FC<{
26
+ subItem: any;
27
+ parentIndex: number;
28
+ subIndex: number;
29
+ }> = ({ subItem, parentIndex, subIndex }) => {
30
+ const [isNestedDropdownOpen, setIsNestedDropdownOpen] =
31
+ useState<boolean>(false);
32
+ const nestedSubItems = subItem?.["sub-sub-items"] as Array<any>;
33
+
34
+ return (
35
+ <Box
36
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.nested-dropdown-container`}
37
+ >
38
+ <Box
39
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.nested-dropdown-trigger`}
40
+ onMouseEnter={() => setIsNestedDropdownOpen(true)}
41
+ onMouseLeave={() => setIsNestedDropdownOpen(false)}
42
+ data-levo_group_item
43
+ className="group relative"
44
+ >
45
+ <Box
46
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-item-link`}
47
+ data-levo_group_item
48
+ className="flex items-center justify-between"
49
+ >
50
+ <div className="flex items-center gap-3">
51
+ {subItem?.["sub-item-icon"] && (
52
+ <Box
53
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-item-icon-container`}
54
+ className=""
55
+ >
56
+ <Icon
57
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-item-icon`}
58
+ />
59
+ </Box>
60
+ )}
61
+ <Box
62
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-item-text-container`}
63
+ className=""
64
+ >
65
+ <Heading
66
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-item-title`}
67
+ />
68
+ <Typography
69
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-item-description`}
70
+ />
71
+ </Box>
72
+ </div>
73
+ {nestedSubItems &&
74
+ Array.isArray(nestedSubItems) &&
75
+ nestedSubItems.length > 0 && (
76
+ <div className="group-hover:text-text-1 text-white">
77
+ <ChevronRight
78
+ aria-hidden="true"
79
+ className="h-[14px] w-[14px] transition-colors"
80
+ />
81
+ </div>
82
+ )}
83
+ </Box>
84
+
85
+ {/* Nested dropdown content inside same container */}
86
+ {isNestedDropdownOpen &&
87
+ nestedSubItems &&
88
+ Array.isArray(nestedSubItems) &&
89
+ nestedSubItems.length > 0 && (
90
+ <Box
91
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-sub-items_levoGroup`}
92
+ data-levo_group
93
+ className="absolute top-0 left-full z-50 ml-1 w-48 rounded-md border border-gray-200 bg-white shadow-lg"
94
+ onMouseEnter={() => setIsNestedDropdownOpen(true)}
95
+ onMouseLeave={() => setIsNestedDropdownOpen(false)}
96
+ >
97
+ {nestedSubItems?.map((_: any, nestedIdx: number) => (
98
+ <Box
99
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-sub-items.${nestedIdx}.nested-sub-item-container`}
100
+ key={`nestedSubItem_${parentIndex}_${subIndex}_${nestedIdx}`}
101
+ data-levo_group_item
102
+ className="px-5 py-3"
103
+ >
104
+ <Heading
105
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-sub-items.${nestedIdx}.nested-sub-item-title`}
106
+ />
107
+ <Typography
108
+ elementKey={`desktop-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-sub-items.${nestedIdx}.nested-sub-item-description`}
109
+ />
110
+ </Box>
111
+ ))}
112
+ </Box>
113
+ )}
114
+ </Box>
115
+ </Box>
116
+ );
117
+ };
118
+
119
+ const DropdownNavigationItem: React.FC<{
120
+ navItem: any;
121
+ index: number;
122
+ }> = ({ navItem, index }) => {
123
+ const [isDropdownPopoverOpen, setIsDropdownPopoverOpen] =
124
+ useState<boolean>(false);
125
+
126
+ const subItems = navItem?.["sub-items"] as Array<any>;
127
+
128
+ return (
129
+ <PopoverRoot
130
+ open={isDropdownPopoverOpen}
131
+ onOpenChange={(open) => setIsDropdownPopoverOpen(open)}
132
+ defaultOpen
133
+ >
134
+ <PopoverTrigger
135
+ elementKey={`desktop-nav-menu.${index}.nav-item-dropdown-trigger`}
136
+ onMouseEnter={() => setIsDropdownPopoverOpen(true)}
137
+ data-levo_group_item
138
+ >
139
+ <Heading
140
+ elementKey={`desktop-nav-menu.${index}.nav-item-dropdown-trigger-title`}
141
+ />
142
+ <ChevronDown
143
+ aria-hidden="true"
144
+ style={{
145
+ position: "relative",
146
+ top: "1px",
147
+ height: "14px",
148
+ width: "14px",
149
+ transitionProperty:
150
+ "color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter",
151
+ transitionTimingFunction: "cubic-bezier(0.4, 0, 0.2, 1)",
152
+ transitionDuration: "300ms",
153
+ rotate: isDropdownPopoverOpen ? "180deg" : "0deg",
154
+ color: "var(--color-text-1)",
155
+ }}
156
+ />
157
+ </PopoverTrigger>
158
+ <PopoverContent
159
+ elementKey={`desktop-nav-menu.${index}.sub-items_levoGroup`}
160
+ data-levo_group
161
+ onMouseLeave={() => setIsDropdownPopoverOpen(false)}
162
+ inPortal={false}
163
+ >
164
+ {subItems && Array?.isArray(subItems)
165
+ ? subItems?.map((subItem: any, idx: number) => (
166
+ <NestedDropdownItem
167
+ key={`subItem_${index}_${idx}`}
168
+ subItem={subItem}
169
+ parentIndex={index}
170
+ subIndex={idx}
171
+ />
172
+ ))
173
+ : null}
174
+ </PopoverContent>
175
+ </PopoverRoot>
176
+ );
177
+ };
178
+
179
+ const DesktopNavItem: React.FC<{
180
+ navItem: any;
181
+ index: number;
182
+ }> = ({ index, navItem }) => {
183
+ const navSubItems = navItem?.["sub-items"] ?? [];
184
+ const isNavItemDropdown =
185
+ navSubItems && Array.isArray(navSubItems) && navSubItems?.length > 0;
186
+
187
+ return (
188
+ <>
189
+ {isNavItemDropdown && (
190
+ <DropdownNavigationItem navItem={navItem} index={index} />
191
+ )}
192
+ {!isNavItemDropdown && (
193
+ <Heading
194
+ data-levo_group_item
195
+ elementKey={`desktop-nav-menu.${index}.nav-item-title`}
196
+ />
197
+ )}
198
+ </>
199
+ );
200
+ };
201
+
202
+ const DesktopNavigationMenu: React.FC<{
203
+ navItems: any;
204
+ }> = ({ navItems }) => {
205
+ return (
206
+ <Box elementKey="desktop-nav-menu_levoGroup" data-levo_group>
207
+ {navItems?.map((item: any, index: number) => {
208
+ return (
209
+ <DesktopNavItem
210
+ navItem={item}
211
+ index={index}
212
+ key={`desktop-nav-menu.${index}`}
213
+ />
214
+ );
215
+ })}
216
+ </Box>
217
+ );
218
+ };
219
+
220
+ const NestedDropdownItemMobile: React.FC<any> = ({
221
+ subItem,
222
+ parentIndex,
223
+ subIndex,
224
+ }) => {
225
+ const [isNestedDropdownOpen, setIsNestedDropdownOpen] =
226
+ useState<boolean>(false);
227
+
228
+ const nestedSubItems = subItem?.["sub-sub-items"] as Array<any>;
229
+
230
+ return (
231
+ <>
232
+ <Box
233
+ elementKey={`mobile-nav-menu.${parentIndex}.sub-items.${subIndex}.nested-dropdown-trigger`}
234
+ onClick={() => setIsNestedDropdownOpen((prev) => !prev)}
235
+ className="flex w-full items-center"
236
+ >
237
+ <Box
238
+ elementKey={`mobile-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-item-text-container`}
239
+ >
240
+ <Heading
241
+ elementKey={`mobile-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-item-title`}
242
+ >
243
+ {subItem?.title}
244
+ </Heading>
245
+ <Typography
246
+ elementKey={`mobile-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-item-description`}
247
+ >
248
+ {subItem?.description}
249
+ </Typography>
250
+ </Box>
251
+
252
+ <ChevronDown
253
+ aria-hidden="true"
254
+ className="flex-shrink-0"
255
+ style={{
256
+ height: "16px",
257
+ width: "16px",
258
+ transition: "transform 300ms cubic-bezier(0.4, 0, 0.2, 1)",
259
+ transform: isNestedDropdownOpen ? "rotate(180deg)" : "rotate(0deg)",
260
+ color: "black",
261
+ }}
262
+ />
263
+ </Box>
264
+
265
+ {isNestedDropdownOpen && Array.isArray(nestedSubItems) && (
266
+ <Box
267
+ elementKey={`mobile-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-sub-items_levoGroup`}
268
+ data-levo_group
269
+ className="ml-4"
270
+ >
271
+ {nestedSubItems.map((nestedSubItem, nestedIdx) => (
272
+ <Box
273
+ key={`nestedSubItem_${parentIndex}_${subIndex}_${nestedIdx}`}
274
+ elementKey={`mobile-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-sub-items.${nestedIdx}.nested-sub-item-link`}
275
+ className={cn("")}
276
+ data-levo_group_item
277
+ >
278
+ <Box
279
+ elementKey={`mobile-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-sub-items.${nestedIdx}.nested-sub-item-text-container`}
280
+ >
281
+ <Heading
282
+ elementKey={`mobile-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-sub-items.${nestedIdx}.nested-sub-item-title`}
283
+ >
284
+ {nestedSubItem?.title}
285
+ </Heading>
286
+ <Typography
287
+ elementKey={`mobile-nav-menu.${parentIndex}.sub-items.${subIndex}.sub-sub-items.${nestedIdx}.nested-sub-item-description`}
288
+ >
289
+ {nestedSubItem?.description}
290
+ </Typography>
291
+ </Box>
292
+ </Box>
293
+ ))}
294
+ </Box>
295
+ )}
296
+ </>
297
+ );
298
+ };
299
+
300
+ const DropdownNavigationItemMobile: React.FC<{
301
+ navItem: any;
302
+ index: number;
303
+ setIsOpen: (value: boolean) => void;
304
+ }> = ({ navItem, index, setIsOpen }) => {
305
+ const [isDropdownOpen, setIsDropdownOpen] = useState<boolean>(false);
306
+
307
+ const subItems = navItem?.["sub-items"] as Array<any>;
308
+ const hasSubItems =
309
+ subItems && Array.isArray(subItems) && subItems.length > 0;
310
+ const hasSubSubItems = hasSubItems;
311
+
312
+ return (
313
+ <Box elementKey={`mobile-nav-menu.${index}.nav-item-dropdown-container`}>
314
+ <Box
315
+ elementKey={`mobile-nav-menu.${index}.nav-item-dropdown-trigger`}
316
+ onClick={() => setIsDropdownOpen((prev) => !prev)}
317
+ className="flex items-center justify-between"
318
+ >
319
+ <Heading
320
+ elementKey={`mobile-nav-menu.${index}.nav-item-dropdown-trigger-title`}
321
+ />
322
+ {hasSubSubItems && (
323
+ <ChevronDown
324
+ aria-hidden="true"
325
+ style={{
326
+ position: "relative",
327
+ top: "2px",
328
+ height: "16px",
329
+ width: "16px",
330
+ transitionProperty:
331
+ "color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter",
332
+ transitionTimingFunction: "cubic-bezier(0.4, 0, 0.2, 1)",
333
+ transitionDuration: "300ms",
334
+ rotate: isDropdownOpen ? "180deg" : "0deg",
335
+ color: "var(--color-text-1)",
336
+ }}
337
+ />
338
+ )}
339
+ </Box>
340
+ {isDropdownOpen && hasSubItems && (
341
+ <Box
342
+ elementKey={`mobile-nav-menu.${index}.sub-items_levoGroup`}
343
+ data-levo_group
344
+ >
345
+ {subItems?.map((subItem: any, idx: number) => {
346
+ const nestedSubItems = subItem?.["sub-sub-items"] as Array<any>;
347
+ const hasNestedItems =
348
+ nestedSubItems &&
349
+ Array.isArray(nestedSubItems) &&
350
+ nestedSubItems.length > 0;
351
+
352
+ return (
353
+ <Box
354
+ key={`subItem_${index}_${idx}`}
355
+ elementKey={`mobile-nav-menu.${index}.sub-items.${idx}.sub-item-link`}
356
+ data-levo_group_item
357
+ className={cn("")}
358
+ >
359
+ {hasNestedItems ? (
360
+ <NestedDropdownItemMobile
361
+ subItem={subItem}
362
+ parentIndex={index}
363
+ subIndex={idx}
364
+ setIsOpen={setIsOpen}
365
+ />
366
+ ) : (
367
+ <Box
368
+ elementKey={`mobile-nav-menu.${index}.sub-items.${idx}.sub-item-text-container`}
369
+ >
370
+ <Heading
371
+ elementKey={`mobile-nav-menu.${index}.sub-items.${idx}.sub-item-title`}
372
+ />
373
+ <Typography
374
+ elementKey={`mobile-nav-menu.${index}.sub-items.${idx}.sub-item-description`}
375
+ />
376
+ </Box>
377
+ )}
378
+ </Box>
379
+ );
380
+ })}
381
+ </Box>
382
+ )}
383
+ </Box>
384
+ );
385
+ };
386
+
387
+ const MobileNavItem: React.FC<{
388
+ navItem: any;
389
+ index: number;
390
+ setIsOpen: (value: boolean) => void;
391
+ }> = ({ navItem, index, setIsOpen }) => {
392
+ const navSubItems = navItem?.["sub-items"] ?? [];
393
+ const isNavItemDropdown =
394
+ navSubItems && Array.isArray(navSubItems) && navSubItems?.length > 0;
395
+
396
+ return (
397
+ <React.Fragment>
398
+ {isNavItemDropdown && (
399
+ <DropdownNavigationItemMobile
400
+ navItem={navItem}
401
+ setIsOpen={setIsOpen}
402
+ index={index}
403
+ />
404
+ )}
405
+ {!isNavItemDropdown && (
406
+ <Box
407
+ data-levo_group_item
408
+ elementKey={`mobile-nav-menu.${index}.nav-item-title-container`}
409
+ onClick={() => setIsOpen(false)}
410
+ >
411
+ <Heading elementKey={`mobile-nav-menu.${index}.nav-item-title`} />
412
+ </Box>
413
+ )}
414
+ </React.Fragment>
415
+ );
416
+ };
417
+
418
+ const MobileNavigationSheet: React.FC<{
419
+ navItems: any;
420
+ content: any;
421
+ isOpen: boolean;
422
+ setIsOpen: (value: boolean) => void;
423
+ }> = ({ navItems, content, isOpen, setIsOpen }) => {
424
+ return (
425
+ <React.Fragment>
426
+ <Button
427
+ elementKey="mobile-nav-menu-button"
428
+ aria-label="Open navigation"
429
+ onClick={() => setIsOpen(!isOpen)}
430
+ >
431
+ {isOpen ? <X size={24} /> : <Menu size={24} />}
432
+ </Button>
433
+ {isOpen && (
434
+ <Box elementKey="mobile-nav-menu-wrapper">
435
+ <Box elementKey="mobile-nav-menu_levoGroup" data-levo_group>
436
+ {Array.isArray(navItems)
437
+ ? navItems?.map((item, index) => {
438
+ return (
439
+ <MobileNavItem
440
+ navItem={item}
441
+ key={`${item?.["nav-item-title"]}_${index}`}
442
+ setIsOpen={setIsOpen}
443
+ index={index}
444
+ />
445
+ );
446
+ })
447
+ : null}
448
+ </Box>
449
+ {content?.["mobile-cta-group"]?.length > 0 && (
450
+ <Box elementKey="mobile-cta-group_levoGroup" data-levo_group>
451
+ {content?.["mobile-cta-group"]?.map((_: any, index: number) => (
452
+ <Button
453
+ key={`mobile-cta-group.${index}.cta`}
454
+ elementKey={`mobile-cta-group.${index}.cta`}
455
+ data-levo_group_item
456
+ className="mb-2 w-full"
457
+ >
458
+ {content?.["mobile-cta-group"]?.[index]?.cta}
459
+ </Button>
460
+ ))}
461
+ </Box>
462
+ )}
463
+ <Box elementKey="icon_links_levoGroup" data-levo_group>
464
+ {((content as any)?.icon_links ?? [])?.map(
465
+ (_: any, index: number) => (
466
+ <Icon
467
+ key={`footer-1-icon-${index}`}
468
+ data-levo_group_item
469
+ elementKey={`icon_links.${index}.icon`}
470
+ />
471
+ ),
472
+ )}
473
+ </Box>
474
+ </Box>
475
+ )}
476
+ </React.Fragment>
477
+ );
478
+ };
479
+
480
+ const Navbar3: React.FC<ILevoBlockBaseProps<INavbar3Content>> = ({
481
+ content,
482
+ }) => {
483
+ const [isScrolled, setIsScrolled] = useState(false);
484
+ const [isOpen, setIsOpen] = useState(false);
485
+
486
+ useEffect(() => {
487
+ const handleScroll = () => {
488
+ if (window.scrollY === 0 && isScrolled) {
489
+ setIsScrolled(false);
490
+ } else if (window.scrollY >= 40 && !isScrolled) {
491
+ setIsScrolled(true);
492
+ }
493
+ };
494
+
495
+ document.addEventListener("scroll", handleScroll);
496
+
497
+ return () => {
498
+ document.removeEventListener("scroll", handleScroll);
499
+ };
500
+ }, [isScrolled]);
501
+
502
+ const desktopNavLinks = content?.["desktop-nav-menu"];
503
+ const mobileNavLinks = content?.["mobile-nav-menu"];
504
+
505
+ return (
506
+ <>
507
+ {isOpen && (
508
+ <Box
509
+ elementKey="mobile-background-overlay"
510
+ onClick={() => setIsOpen(false)}
511
+ className="fixed top-0 right-0 bottom-0 left-0 z-20 bg-black/20"
512
+ />
513
+ )}
514
+ <Section
515
+ elementKey="layout"
516
+ className={cn(isScrolled ? "top-2" : "top-8")}
517
+ >
518
+ <Container elementKey="nav-container">
519
+ <Image elementKey="nav-logo" alt="Logo" />
520
+ {desktopNavLinks &&
521
+ Array?.isArray(desktopNavLinks) &&
522
+ desktopNavLinks?.length > 0 && (
523
+ <DesktopNavigationMenu navItems={desktopNavLinks} />
524
+ )}
525
+ <MobileNavigationSheet
526
+ navItems={mobileNavLinks || []}
527
+ content={content}
528
+ isOpen={isOpen}
529
+ setIsOpen={setIsOpen}
530
+ />
531
+
532
+ <Box elementKey="desktop-cta-group_levoGroup" data-levo_group>
533
+ {content?.["desktop-cta-group"]?.length > 0 &&
534
+ content?.["desktop-cta-group"]?.map((_: any, index: number) => (
535
+ <Button
536
+ key={`desktop-cta-group.${index}.cta`}
537
+ elementKey={`desktop-cta-group.${index}.cta`}
538
+ data-levo_group_item
539
+ >
540
+ {content?.["desktop-cta-group"]?.[index]?.cta}
541
+ </Button>
542
+ ))}
543
+ <UserMenu elementKey="usermenu" />
544
+ </Box>
545
+ </Container>
546
+ </Section>
547
+ </>
548
+ );
549
+ };
550
+
551
+ export default Navbar3;