@levo-so/blocks 0.1.54 → 0.1.58

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 (117) hide show
  1. package/package.json +2 -2
  2. package/src/blocks/about-us/about-us-1.schema.ts +14 -0
  3. package/src/blocks/about-us/about-us-1.tsx +4 -2
  4. package/src/blocks/about-us/about-us-2.schema.ts +48 -0
  5. package/src/blocks/about-us/about-us-2.tsx +6 -0
  6. package/src/blocks/blogs/blog-listing-1.schema.ts +10 -0
  7. package/src/blocks/blogs/blog-listing-2.schema.ts +42 -162
  8. package/src/blocks/blogs/blog-listing-2.tsx +7 -0
  9. package/src/blocks/blogs/blog-listing-3.schema.ts +9 -0
  10. package/src/blocks/blogs/blog-post-1.schema.ts +7 -1
  11. package/src/blocks/blogs/blog-post-1.tsx +1 -1
  12. package/src/blocks/blogs/blog-post-2.schema.ts +464 -28
  13. package/src/blocks/blogs/blog-post-2.tsx +6 -13
  14. package/src/blocks/blogs/blog-post-3.schema.ts +42 -0
  15. package/src/blocks/blogs/blog-post-3.tsx +4 -1
  16. package/src/blocks/calendar/calendar-1.schema.ts +537 -0
  17. package/src/blocks/calendar/calendar-1.tsx +145 -0
  18. package/src/blocks/cards/cards-10.schema.ts +52 -4
  19. package/src/blocks/cards/cards-10.tsx +13 -1
  20. package/src/blocks/cards/cards-14.schema.ts +532 -0
  21. package/src/blocks/cards/cards-14.tsx +54 -0
  22. package/src/blocks/cards/cards-15.schema.ts +277 -0
  23. package/src/blocks/cards/cards-15.tsx +40 -0
  24. package/src/blocks/cards/cards-6.schema.ts +46 -0
  25. package/src/blocks/cards/cards-6.tsx +27 -1
  26. package/src/blocks/cards/cards-7.tsx +2 -0
  27. package/src/blocks/carousel/carousel-2.schema.ts +1128 -0
  28. package/src/blocks/carousel/carousel-2.tsx +159 -0
  29. package/src/blocks/content/content-5.schema.ts +112 -6
  30. package/src/blocks/content/content-5.tsx +19 -3
  31. package/src/blocks/content/content-6.schema.ts +16 -3
  32. package/src/blocks/content/content-6.tsx +1 -0
  33. package/src/blocks/content/content-8.schema.ts +125 -0
  34. package/src/blocks/content/content-8.tsx +27 -0
  35. package/src/blocks/content/content-9.schema.ts +2729 -0
  36. package/src/blocks/content/content-9.tsx +91 -0
  37. package/src/blocks/cta/cta-2.schema.ts +46 -4
  38. package/src/blocks/cta/cta-2.tsx +9 -1
  39. package/src/blocks/embed/embed-1.schema.ts +100 -0
  40. package/src/blocks/event/ClientOnly.tsx +27 -0
  41. package/src/blocks/event/event-details.tsx +10 -3
  42. package/src/blocks/event/event-listing-3.tsx +9 -2
  43. package/src/blocks/event/event-listing-4.tsx +11 -2
  44. package/src/blocks/event/event-listing.tsx +11 -4
  45. package/src/blocks/faq/faq-1.schema.ts +58 -1
  46. package/src/blocks/faq/faq-1.tsx +18 -1
  47. package/src/blocks/faq/faq-2.tsx +2 -1
  48. package/src/blocks/faq/faq-3.schema.ts +6 -1
  49. package/src/blocks/faq/faq-3.tsx +1 -0
  50. package/src/blocks/features/features-1/features-1.schema.ts +2 -0
  51. package/src/blocks/features/features-1/variants/index.ts +2 -0
  52. package/src/blocks/features/features-1/variants/stylized-cards-v3.ts +451 -0
  53. package/src/blocks/features/features-4.schema.ts +358 -20
  54. package/src/blocks/features/features-4.tsx +3 -1
  55. package/src/blocks/features/features-6.tsx +2 -0
  56. package/src/blocks/filter-listing/filter-listing-1.schema.ts +614 -0
  57. package/src/blocks/filter-listing/filter-listing-1.tsx +128 -0
  58. package/src/blocks/footer/footer-6.schema.ts +2 -2
  59. package/src/blocks/hero/hero-11.schema.ts +849 -0
  60. package/src/blocks/hero/hero-11.tsx +59 -0
  61. package/src/blocks/hero/hero-12.schema.ts +712 -0
  62. package/src/blocks/hero/hero-12.tsx +76 -0
  63. package/src/blocks/hero/hero-13.schema.ts +238 -0
  64. package/src/blocks/hero/hero-13.tsx +31 -0
  65. package/src/blocks/hero/hero-4.tsx +2 -0
  66. package/src/blocks/hero/hero-5.tsx +2 -0
  67. package/src/blocks/hero/hero-7.tsx +2 -1
  68. package/src/blocks/hero/hero-8.tsx +2 -0
  69. package/src/blocks/hero/hero-9.schema.ts +5 -0
  70. package/src/blocks/hero/hero-9.tsx +2 -0
  71. package/src/blocks/index.ts +27 -0
  72. package/src/blocks/navbar/navbar-1.schema.ts +6 -6
  73. package/src/blocks/navbar/navbar-1.tsx +6 -7
  74. package/src/blocks/navbar/navbar-2.schema.ts +9 -9
  75. package/src/blocks/navbar/navbar-2.tsx +7 -8
  76. package/src/blocks/navbar/navbar-3.schema.ts +9 -9
  77. package/src/blocks/navbar/navbar-3.tsx +139 -114
  78. package/src/blocks/polling/polling-1.schema.ts +134 -0
  79. package/src/blocks/polling/polling-1.tsx +466 -0
  80. package/src/blocks/products/products-listing-2.schema.ts +596 -0
  81. package/src/blocks/products/products-listing-2.tsx +56 -0
  82. package/src/blocks/products/products-listing-3.schema.ts +818 -0
  83. package/src/blocks/products/products-listing-3.tsx +125 -0
  84. package/src/blocks/profile/profile-2.schema.ts +505 -0
  85. package/src/blocks/profile/profile-2.tsx +64 -0
  86. package/src/blocks/profile/profile-3.schema.ts +867 -0
  87. package/src/blocks/profile/profile-3.tsx +98 -0
  88. package/src/blocks/services/service-1.schema.ts +1743 -0
  89. package/src/blocks/services/service-1.tsx +139 -0
  90. package/src/blocks/services/service-2.schema.ts +433 -0
  91. package/src/blocks/services/service-2.tsx +98 -0
  92. package/src/blocks/services/service-3.schema.ts +631 -0
  93. package/src/blocks/services/service-3.tsx +135 -0
  94. package/src/blocks/tabs/tab-1.schema.ts +831 -0
  95. package/src/blocks/tabs/tab-1.tsx +126 -0
  96. package/src/blocks/tabs/tab-2.schema.ts +767 -0
  97. package/src/blocks/tabs/tab-2.tsx +60 -0
  98. package/src/blocks/team/team-3.schema.ts +5 -1
  99. package/src/blocks/team/team-3.tsx +7 -0
  100. package/src/blocks/team/team-4.schema.ts +17 -13
  101. package/src/blocks/team/team-4.tsx +4 -1
  102. package/src/blocks/team/team-5.schema.ts +369 -0
  103. package/src/blocks/team/team-5.tsx +38 -0
  104. package/src/blocks/testimonial/testimonial-1.tsx +0 -1
  105. package/src/blocks/testimonial/testimonial-2.tsx +2 -1
  106. package/src/blocks/testimonial/testimonial-3.tsx +2 -0
  107. package/src/blocks/testimonial/testimonial-4.tsx +2 -1
  108. package/src/blocks/testimonial/testimonial-5.tsx +2 -0
  109. package/src/blocks/testimonial/testimonial-6.tsx +2 -1
  110. package/src/blocks/testimonial/testimonial-7.schema.ts +438 -0
  111. package/src/blocks/testimonial/testimonial-7.tsx +125 -0
  112. package/src/blocks/timeline/timeline-1.schema.ts +741 -0
  113. package/src/blocks/timeline/timeline-1.tsx +52 -0
  114. package/src/blocks/users/edit-profile.schema.ts +294 -0
  115. package/src/blocks/users/edit-profile.tsx +184 -0
  116. package/src/schemas/blocks.ts +64 -12
  117. package/src/schemas/categories.ts +36 -0
@@ -0,0 +1,159 @@
1
+ "use client";
2
+
3
+ import type { CarouselApi } from "@levo-so/studio";
4
+ import {
5
+ type ILevoBlockBaseProps,
6
+ Heading,
7
+ Typography,
8
+ Container,
9
+ Section,
10
+ Carousel,
11
+ CarouselContent,
12
+ CarouselItem,
13
+ Box,
14
+ Icon,
15
+ Button,
16
+ Media,
17
+ } from "@levo-so/studio";
18
+ import { useEffect, useState } from "react";
19
+
20
+ import type { ICarousel2Content } from "./carousel-2.schema";
21
+
22
+ const Carousel2: React.FC<ILevoBlockBaseProps<ICarousel2Content>> = ({
23
+ content,
24
+ }) => {
25
+ const [api, setApi] = useState<CarouselApi>();
26
+ const [current, setCurrent] = useState(0);
27
+ const [count, setCount] = useState(0);
28
+
29
+ useEffect(() => {
30
+ if (!api) {
31
+ return;
32
+ }
33
+
34
+ setCount(api.scrollSnapList().length);
35
+ setCurrent(api.selectedScrollSnap() + 1);
36
+
37
+ api.on("select", () => {
38
+ setCurrent(api.selectedScrollSnap() + 1);
39
+ });
40
+ }, [api]);
41
+
42
+ // Add disabled state logic
43
+ const isFirstSlide = current === 1; // current is 1-based index from logic above
44
+ const isLastSlide = current === count;
45
+
46
+ const handlePrevious = () => {
47
+ if (api && !isFirstSlide) {
48
+ api.scrollPrev();
49
+ }
50
+ };
51
+
52
+ const handleNext = () => {
53
+ if (api && !isLastSlide) {
54
+ api.scrollNext();
55
+ }
56
+ };
57
+
58
+ return (
59
+ <Section elementKey="layout">
60
+ <Container elementKey="container">
61
+ <Box elementKey="header">
62
+ <Box elementKey="header-content">
63
+ <Heading elementKey="title" />
64
+ <Typography elementKey="description" />
65
+ </Box>
66
+ {count > 0 && (
67
+ <Box elementKey="carousel-navigation-top-container">
68
+ <Button
69
+ elementKey="carousel-navigation-arrow-left"
70
+ onClick={handlePrevious}
71
+ disabled={isFirstSlide}
72
+ style={{
73
+ opacity: isFirstSlide ? 0.5 : 1,
74
+ cursor: isFirstSlide ? "not-allowed" : "pointer",
75
+ }}
76
+ />
77
+
78
+ <Button
79
+ elementKey="carousel-navigation-arrow-right"
80
+ onClick={handleNext}
81
+ disabled={isLastSlide}
82
+ style={{
83
+ opacity: isLastSlide ? 0.5 : 1,
84
+ cursor: isLastSlide ? "not-allowed" : "pointer",
85
+ }}
86
+ />
87
+ </Box>
88
+ )}
89
+ </Box>
90
+ <Carousel elementKey="team_levoGroup" setApi={setApi} data-levo_group>
91
+ <CarouselContent>
92
+ {(content?.team ?? [])?.map((_: any, index: number) => (
93
+ <CarouselItem key={index} data-levo_group_item>
94
+ <Box elementKey={`team.${index}.card`}>
95
+ <Media
96
+ elementKey={`team.${index}.img`}
97
+ alt="Team member photo"
98
+ />
99
+ <Box elementKey={`team.${index}.info`}>
100
+ <Box elementKey={`team.${index}.name-position-wrapper`}>
101
+ <Typography elementKey={`team.${index}.name`} />
102
+ <Typography elementKey={`team.${index}.description`} />
103
+ </Box>
104
+ <Box
105
+ elementKey={`team.${index}.social_levoGroup`}
106
+ data-levo_group
107
+ >
108
+ {(content?.team?.[index]?.social ?? [])?.map(
109
+ (_: any, socialIndex: number) => (
110
+ <Icon
111
+ key={socialIndex}
112
+ data-levo_group_item
113
+ elementKey={`team.${index}.social.${socialIndex}.icon`}
114
+ />
115
+ ),
116
+ )}
117
+ </Box>
118
+ </Box>
119
+ </Box>
120
+ </CarouselItem>
121
+ ))}
122
+ </CarouselContent>
123
+ </Carousel>
124
+ {count > 0 && (
125
+ <Box elementKey="carousel-navigation-container">
126
+ <Box elementKey="carousel-navigation">
127
+ {Array(count)
128
+ ?.fill(0)
129
+ ?.map((_, index) => (
130
+ <Box
131
+ key={index}
132
+ elementKey="carousel-navigation-pill"
133
+ style={
134
+ index + 1 === current
135
+ ? {
136
+ backgroundColor: "var(--color-brand)",
137
+ width: "24px",
138
+ }
139
+ : {}
140
+ }
141
+ onClick={() => {
142
+ if (api) {
143
+ api?.scrollTo(index);
144
+ }
145
+ }}
146
+ />
147
+ ))}
148
+ </Box>
149
+ </Box>
150
+ )}
151
+ <Box elementKey="cta_wrapper">
152
+ <Button elementKey="cta" />
153
+ </Box>
154
+ </Container>
155
+ </Section>
156
+ );
157
+ };
158
+
159
+ export default Carousel2;
@@ -107,6 +107,9 @@ const DEFAULT_CONTENT = {
107
107
  },
108
108
  },
109
109
  ],
110
+ bottom_description:
111
+ "<p>You can also send your application on email here<br>Email id - &nbsp;jobs@xyz.com.</p>",
112
+ label: "CurrentJob Openings",
110
113
  };
111
114
 
112
115
  export type IContent5Content = typeof DEFAULT_CONTENT;
@@ -135,6 +138,27 @@ export const Content5: IBlock = {
135
138
  label: "Header Wrapper",
136
139
  field_interface: "BoxWidget",
137
140
  },
141
+ {
142
+ key: "label_container",
143
+ label: "Label Container",
144
+ field_interface: "BoxWidget",
145
+ },
146
+ {
147
+ key: "label_left_divider",
148
+ label: "Label Left Divider",
149
+ field_interface: "BoxWidget",
150
+ },
151
+ {
152
+ key: "label_right_divider",
153
+ label: "Label Right Divider",
154
+ field_interface: "BoxWidget",
155
+ },
156
+
157
+ {
158
+ key: "label",
159
+ label: "Label",
160
+ field_interface: "TypographyWidget",
161
+ },
138
162
  {
139
163
  key: "title",
140
164
  label: "Title",
@@ -155,6 +179,11 @@ export const Content5: IBlock = {
155
179
  label: "Bottom CTA",
156
180
  field_interface: "ButtonWidget",
157
181
  },
182
+ {
183
+ key: "bottom_description",
184
+ label: "Bottom Description",
185
+ field_interface: "TypographyWidget",
186
+ },
158
187
  {
159
188
  key: "jobs",
160
189
  label: "Jobs",
@@ -171,6 +200,16 @@ export const Content5: IBlock = {
171
200
  label: "Designation Wrapper",
172
201
  field_interface: "BoxWidget",
173
202
  },
203
+ {
204
+ key: "designation_header_wrapper",
205
+ label: "Designation Header Wrapper",
206
+ field_interface: "BoxWidget",
207
+ },
208
+ {
209
+ key: "designation_icon",
210
+ label: "Designation Icon",
211
+ field_interface: "IconWidget",
212
+ },
174
213
  {
175
214
  key: "designation_header",
176
215
  label: "Designation Header",
@@ -186,6 +225,16 @@ export const Content5: IBlock = {
186
225
  label: "Work Wrapper",
187
226
  field_interface: "BoxWidget",
188
227
  },
228
+ {
229
+ key: "work_header_wrapper",
230
+ label: "Work Header Wrapper",
231
+ field_interface: "BoxWidget",
232
+ },
233
+ {
234
+ key: "work_icon",
235
+ label: "Work Icon",
236
+ field_interface: "IconWidget",
237
+ },
189
238
  {
190
239
  key: "work_header",
191
240
  label: "Work Header",
@@ -201,6 +250,16 @@ export const Content5: IBlock = {
201
250
  label: "Location Wrapper",
202
251
  field_interface: "BoxWidget",
203
252
  },
253
+ {
254
+ key: "location_header_wrapper",
255
+ label: "Location Header Wrapper",
256
+ field_interface: "BoxWidget",
257
+ },
258
+ {
259
+ key: "location_icon",
260
+ label: "Location Icon",
261
+ field_interface: "IconWidget",
262
+ },
204
263
  {
205
264
  key: "location_header",
206
265
  label: "Location Header",
@@ -247,10 +306,12 @@ export const Content5: IBlock = {
247
306
  },
248
307
  title: {
249
308
  "margin-bottom": "base",
309
+ "text-align": "center",
250
310
  },
251
311
  description: {
252
312
  color: "text-2",
253
- "max-width": "600px",
313
+ display: "block",
314
+ "text-align": "center",
254
315
  },
255
316
  jobs_levoGroup: {
256
317
  display: "flex",
@@ -259,10 +320,6 @@ export const Content5: IBlock = {
259
320
  "margin-bottom": "2xl",
260
321
  },
261
322
  bottom_cta: {
262
- "padding-left": "none",
263
- "padding-top": "none",
264
- "padding-bottom": "none",
265
- "padding-right": "none",
266
323
  "margin-left": "auto",
267
324
  "margin-right": "auto",
268
325
  },
@@ -297,6 +354,15 @@ export const Content5: IBlock = {
297
354
  "flex-direction": "column",
298
355
  "row-gap": "xs",
299
356
  },
357
+ designation_header_wrapper: {
358
+ display: "flex",
359
+ "align-items": "center",
360
+ "column-gap": "2xs",
361
+ },
362
+ designation_icon: {
363
+ width: "16px",
364
+ height: "16px",
365
+ },
300
366
  designation_header: {
301
367
  color: "text-2",
302
368
  "font-size": "sm",
@@ -318,6 +384,15 @@ export const Content5: IBlock = {
318
384
  "align-items": "center",
319
385
  },
320
386
  },
387
+ work_header_wrapper: {
388
+ display: "flex",
389
+ "align-items": "center",
390
+ "column-gap": "2xs",
391
+ },
392
+ work_icon: {
393
+ width: "16px",
394
+ height: "16px",
395
+ },
321
396
  work_header: {
322
397
  color: "text-2",
323
398
  "font-size": "sm",
@@ -343,6 +418,15 @@ export const Content5: IBlock = {
343
418
  "align-items": "start",
344
419
  },
345
420
  },
421
+ location_header_wrapper: {
422
+ display: "flex",
423
+ "align-items": "center",
424
+ "column-gap": "2xs",
425
+ },
426
+ location_icon: {
427
+ width: "16px",
428
+ height: "16px",
429
+ },
346
430
  location_header: {
347
431
  color: "text-2",
348
432
  "font-size": "sm",
@@ -433,11 +517,11 @@ export const Content5: IBlock = {
433
517
  },
434
518
  },
435
519
  work_header: {
436
- color: "text-2",
437
520
  "font-size": "sm",
438
521
  "font-weight": "500",
439
522
  "text-transform": "uppercase",
440
523
  "letter-spacing": "0.05em",
524
+ color: "brand",
441
525
  },
442
526
  work_value: {
443
527
  color: "text-1",
@@ -930,6 +1014,28 @@ export const Content5: IBlock = {
930
1014
  },
931
1015
  },
932
1016
  ],
1017
+ bottom_description: {
1018
+ "margin-left": "auto",
1019
+ "margin-right": "auto",
1020
+ "text-align": "center",
1021
+ "margin-top": "base",
1022
+ },
1023
+ label_left_divider: {
1024
+ height: "2px",
1025
+ width: "30px",
1026
+ "background-color": "brand",
1027
+ },
1028
+ label_right_divider: {
1029
+ height: "2px",
1030
+ width: "30px",
1031
+ "background-color": "brand",
1032
+ },
1033
+ label_container: {
1034
+ display: "flex",
1035
+ "align-items": "center",
1036
+ "column-gap": "3xs",
1037
+ "justify-content": "center",
1038
+ },
933
1039
  },
934
1040
  content: DEFAULT_CONTENT,
935
1041
  config: {
@@ -3,6 +3,7 @@ import {
3
3
  Button,
4
4
  Container,
5
5
  Heading,
6
+ Icon,
6
7
  Section,
7
8
  Typography,
8
9
  type ILevoBlockBaseProps,
@@ -17,6 +18,11 @@ const Content5: React.FC<ILevoBlockBaseProps<IContent5Content>> = ({
17
18
  <Section elementKey="layout">
18
19
  <Container elementKey="container">
19
20
  <Box elementKey="header_wrapper">
21
+ <Box elementKey="label_container">
22
+ <Box elementKey="label_left_divider" />
23
+ <Typography elementKey="label" />
24
+ <Box elementKey="label_right_divider" />
25
+ </Box>
20
26
  <Heading elementKey="title" />
21
27
  <Typography elementKey="description" />
22
28
  </Box>
@@ -29,15 +35,24 @@ const Content5: React.FC<ILevoBlockBaseProps<IContent5Content>> = ({
29
35
  elementKey={`jobs.${index}.job_item`}
30
36
  >
31
37
  <Box elementKey={`jobs.${index}.designation_wrapper`}>
32
- <Typography elementKey={`jobs.${index}.designation_header`} />
38
+ <Box elementKey={`jobs.${index}.designation_header_wrapper`}>
39
+ <Icon elementKey={`jobs.${index}.designation_icon`} />
40
+ <Typography elementKey={`jobs.${index}.designation_header`} />
41
+ </Box>
33
42
  <Typography elementKey={`jobs.${index}.designation_value`} />
34
43
  </Box>
35
44
  <Box elementKey={`jobs.${index}.work_wrapper`}>
36
- <Typography elementKey={`jobs.${index}.work_header`} />
45
+ <Box elementKey={`jobs.${index}.work_header_wrapper`}>
46
+ <Icon elementKey={`jobs.${index}.work_icon`} />
47
+ <Typography elementKey={`jobs.${index}.work_header`} />
48
+ </Box>
37
49
  <Typography elementKey={`jobs.${index}.work_value`} />
38
50
  </Box>
39
51
  <Box elementKey={`jobs.${index}.location_wrapper`}>
40
- <Typography elementKey={`jobs.${index}.location_header`} />
52
+ <Box elementKey={`jobs.${index}.location_header_wrapper`}>
53
+ <Icon elementKey={`jobs.${index}.location_icon`} />
54
+ <Typography elementKey={`jobs.${index}.location_header`} />
55
+ </Box>
41
56
  <Typography elementKey={`jobs.${index}.location_value`} />
42
57
  </Box>
43
58
  <Button elementKey={`jobs.${index}.cta`} />
@@ -52,6 +67,7 @@ const Content5: React.FC<ILevoBlockBaseProps<IContent5Content>> = ({
52
67
  ))}
53
68
  </Box>
54
69
  <Button elementKey="bottom_cta" />
70
+ <Typography elementKey="bottom_description" />
55
71
  </Container>
56
72
  </Section>
57
73
  );
@@ -32,7 +32,9 @@ const DEFAULT_CONTENT = {
32
32
  companies: [
33
33
  {
34
34
  company_item: null,
35
+ image_wrapper: null,
35
36
  company_image: DEFAULT_IMAGE,
37
+ company_name: null,
36
38
  work_wrapper: null,
37
39
  work_header: "Stage",
38
40
  work_value: "Seed",
@@ -44,7 +46,9 @@ const DEFAULT_CONTENT = {
44
46
  },
45
47
  {
46
48
  company_item: null,
49
+ image_wrapper: null,
47
50
  company_image: DEFAULT_IMAGE,
51
+ company_name: null,
48
52
  work_wrapper: null,
49
53
  work_header: "Stage",
50
54
  work_value: "Growth",
@@ -56,8 +60,9 @@ const DEFAULT_CONTENT = {
56
60
  },
57
61
  {
58
62
  company_item: null,
63
+ image_wrapper: null,
59
64
  company_image: DEFAULT_IMAGE,
60
-
65
+ company_name: null,
61
66
  work_wrapper: null,
62
67
  work_header: "Stage",
63
68
  work_value: "Series A",
@@ -106,7 +111,6 @@ export const Content6: IBlock = {
106
111
  label: "Description",
107
112
  field_interface: "TypographyWidget",
108
113
  },
109
-
110
114
  {
111
115
  key: "companies",
112
116
  label: "Companies",
@@ -118,12 +122,21 @@ export const Content6: IBlock = {
118
122
  label: "Company Item",
119
123
  field_interface: "BoxWidget",
120
124
  },
125
+ {
126
+ key: "image_wrapper",
127
+ label: "Image Wrapper",
128
+ field_interface: "BoxWidget",
129
+ },
121
130
  {
122
131
  key: "company_image",
123
132
  label: "Company Image",
124
133
  field_interface: "ImageWidget",
125
134
  },
126
-
135
+ {
136
+ key: "company_name",
137
+ label: "Company Name",
138
+ field_interface: "TypographyWidget",
139
+ },
127
140
  {
128
141
  key: "work_wrapper",
129
142
  label: "Work Wrapper",
@@ -34,6 +34,7 @@ const Content6: React.FC<ILevoBlockBaseProps<IContent6Content>> = ({
34
34
  elementKey={`companies.${index}.company_image`}
35
35
  alt="Company logo"
36
36
  />
37
+ <Typography elementKey={`companies.${index}.company_name`} />
37
38
  </Box>
38
39
 
39
40
  <Box elementKey={`companies.${index}.work_wrapper`}>
@@ -0,0 +1,125 @@
1
+ import type { IBlock } from "@levo-so/studio";
2
+
3
+ const DEFAULT_CONTENT = {
4
+ layout: null,
5
+ container: null,
6
+ inner_container: null,
7
+ icon_wrapper: null,
8
+ description:
9
+ "Transform your business with our comprehensive platform designed for modern enterprises seeking growth and efficiency.",
10
+ cta: "Get Started",
11
+ icon: {
12
+ kind: "icon",
13
+ data: {
14
+ id: "simcard-2",
15
+ label: "Simcard 2",
16
+ tags: [
17
+ "computers-devices-electronics",
18
+ "custom",
19
+ "directional",
20
+ "simcard",
21
+ ],
22
+ svgCode:
23
+ '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n<path d="M12.11 22.72H5.89C3.16 22.72 1.25 20.81 1.25 18.08V10.31C1.25 7.58004 3.16 5.67004 5.89 5.67004H9.72C10.94 5.67004 12.14 6.17004 13 7.03004L15.39 9.41004C16.26 10.28 16.75 11.47 16.75 12.69V18.08C16.75 20.81 14.84 22.72 12.11 22.72ZM5.89 7.17004C3.98 7.17004 2.75 8.40004 2.75 10.31V18.08C2.75 19.99 3.98 21.22 5.89 21.22H12.11C14.02 21.22 15.25 19.99 15.25 18.08V12.69C15.25 11.86 14.91 11.06 14.33 10.47L11.94 8.09004C11.35 7.50004 10.54 7.17004 9.72 7.17004H5.89Z" fill="var(--color-icon-primary)"/>\n<path d="M18.11 18.28H16C15.59 18.28 15.25 17.94 15.25 17.53V12.69C15.25 11.86 14.91 11.06 14.33 10.47L11.94 8.08997C11.35 7.49997 10.54 7.16997 9.72 7.16997H8C7.59 7.16997 7.25 6.82997 7.25 6.41997V5.85997C7.25 3.12997 9.16 1.21997 11.89 1.21997H15.72C16.94 1.21997 18.14 1.71997 19 2.57997L21.39 4.96997C22.27 5.84997 22.75 7.00997 22.75 8.24997V13.64C22.75 16.37 20.84 18.28 18.11 18.28ZM16.75 16.78H18.11C20.02 16.78 21.25 15.55 21.25 13.64V8.24997C21.25 7.40997 20.92 6.61997 20.33 6.02997L17.94 3.63997C17.36 3.05997 16.55 2.71997 15.72 2.71997H11.89C10.05 2.71997 8.83 3.86997 8.75 5.66997H9.72C10.94 5.66997 12.14 6.16997 13 7.02997L15.39 9.40997C16.26 10.28 16.75 11.47 16.75 12.69V16.78Z" fill="var(--color-icon-primary)"/>\n</svg>',
24
+ },
25
+ },
26
+ };
27
+
28
+ export type IContent8Content = typeof DEFAULT_CONTENT;
29
+
30
+ export const Content8: IBlock = {
31
+ category_id: "content",
32
+ title: "Content 8",
33
+ key: "content-8",
34
+ version: "v1",
35
+ prompt_description:
36
+ "Simple feature block with icon, description text, and call-to-action button in a clean centered layout.",
37
+
38
+ content_schema: [
39
+ {
40
+ key: "layout",
41
+ label: "Layout",
42
+ field_interface: "LayoutWidget",
43
+ },
44
+ {
45
+ key: "container",
46
+ label: "Container",
47
+ field_interface: "ContainerWidget",
48
+ },
49
+ {
50
+ key: "inner_container",
51
+ label: "Inner Container",
52
+ field_interface: "BoxWidget",
53
+ },
54
+ {
55
+ key: "icon",
56
+ label: "Icon",
57
+ field_interface: "IconWidget",
58
+ },
59
+ {
60
+ key: "description",
61
+ label: "Description",
62
+ field_interface: "TypographyWidget",
63
+ },
64
+ {
65
+ key: "cta",
66
+ label: "CTA Button",
67
+ field_interface: "ButtonWidget",
68
+ },
69
+ ],
70
+ layouts: [
71
+ {
72
+ key: "default",
73
+ title: "Default",
74
+ styles: {
75
+ layout: {
76
+ "padding-top": "base",
77
+ "padding-bottom": "base",
78
+ "padding-left": "none",
79
+ "padding-right": "none",
80
+ "background-color": "background-2",
81
+ },
82
+ container: {
83
+ "margin-left": "auto",
84
+ "margin-right": "auto",
85
+ display: "flex",
86
+ "justify-content": "space-between",
87
+ "align-items": "center",
88
+ "padding-left": "none",
89
+ "padding-right": "none",
90
+ },
91
+ inner_container: {
92
+ display: "flex",
93
+ "flex-direction": "row",
94
+ "align-items": "center",
95
+ "row-gap": "lg",
96
+ "margin-bottom": "none",
97
+ "justify-content": "center",
98
+ "column-gap": "base",
99
+ },
100
+ icon_wrapper: {
101
+ display: "flex",
102
+ "align-items": "center",
103
+ "justify-content": "center",
104
+ "margin-bottom": "base",
105
+ },
106
+ icon: {
107
+ width: "48px",
108
+ height: "48px",
109
+ "object-fit": "contain",
110
+ },
111
+ description: {
112
+ color: "text-1",
113
+ "font-size": "lg",
114
+ "line-height": "1.6",
115
+ "max-width": "600px",
116
+ "margin-left": "auto",
117
+ "margin-right": "auto",
118
+ },
119
+ cta: {},
120
+ },
121
+ content: DEFAULT_CONTENT,
122
+ config: {},
123
+ },
124
+ ],
125
+ };
@@ -0,0 +1,27 @@
1
+ import {
2
+ Box,
3
+ Button,
4
+ Container,
5
+ Icon,
6
+ Section,
7
+ Typography,
8
+ type ILevoBlockBaseProps,
9
+ } from "@levo-so/studio";
10
+ import React from "react";
11
+
12
+ import { type IContent8Content } from "./content-8.schema";
13
+
14
+ const Content8: React.FC<ILevoBlockBaseProps<IContent8Content>> = ({}) => (
15
+ <Section elementKey="layout">
16
+ <Container elementKey="container">
17
+ <Box elementKey="inner_container">
18
+ <Icon elementKey="icon" />
19
+
20
+ <Typography elementKey="description" />
21
+ </Box>
22
+ <Button elementKey="cta" />
23
+ </Container>
24
+ </Section>
25
+ );
26
+
27
+ export default Content8;