@levo-so/blocks 0.1.52 → 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 +4 -4
  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,125 @@
1
+ import {
2
+ type ILevoBlockBaseProps,
3
+ Button,
4
+ Heading,
5
+ Image,
6
+ Typography,
7
+ Container,
8
+ Section,
9
+ Box,
10
+ } from "@levo-so/studio";
11
+
12
+ import type { IProductsListing3Content } from "./products-listing-3.schema";
13
+
14
+ const ProductsListing3: React.FC<
15
+ ILevoBlockBaseProps<IProductsListing3Content>
16
+ > = ({ content }) => (
17
+ <Section elementKey="layout">
18
+ <Container elementKey="container">
19
+ <Box elementKey="header_container">
20
+ <Heading elementKey="title" />
21
+ <Button elementKey="header_cta" />
22
+ </Box>
23
+ <Box data-levo_group elementKey="product_groups_levoGroup">
24
+ {(content?.product_groups ?? []).map((_, groupIndex) => (
25
+ <Box
26
+ key={groupIndex}
27
+ elementKey={`product_groups.${groupIndex}.groups_container`}
28
+ >
29
+ <Box
30
+ data-levo_group
31
+ elementKey={`product_groups.${groupIndex}.products_with_images_levoGroup`}
32
+ >
33
+ {(
34
+ content.product_groups?.[groupIndex]?.products_with_images ?? []
35
+ ).map((_, index) => (
36
+ <Box
37
+ data-levo_group_item
38
+ elementKey={`product_groups.${groupIndex}.products_with_images.${index}.card`}
39
+ key={index}
40
+ >
41
+ <Image
42
+ alt="product image"
43
+ elementKey={`product_groups.${groupIndex}.products_with_images.${index}.image`}
44
+ width={400}
45
+ height={400}
46
+ />
47
+ <Box
48
+ elementKey={`product_groups.${groupIndex}.products_with_images.${index}.content_wrapper`}
49
+ >
50
+ <Heading
51
+ elementKey={`product_groups.${groupIndex}.products_with_images.${index}.title`}
52
+ />
53
+ <Typography
54
+ elementKey={`product_groups.${groupIndex}.products_with_images.${index}.description`}
55
+ />
56
+ <Box
57
+ elementKey={`product_groups.${groupIndex}.products_with_images.${index}.price_container`}
58
+ >
59
+ <Typography
60
+ elementKey={`product_groups.${groupIndex}.products_with_images.${index}.actual_price`}
61
+ />
62
+ <Typography
63
+ elementKey={`product_groups.${groupIndex}.products_with_images.${index}.discount_price`}
64
+ />
65
+ <Typography
66
+ elementKey={`product_groups.${groupIndex}.products_with_images.${index}.off_percent`}
67
+ />
68
+ </Box>
69
+ <Button
70
+ elementKey={`product_groups.${groupIndex}.products_with_images.${index}.cta`}
71
+ />
72
+ </Box>
73
+ </Box>
74
+ ))}
75
+ </Box>
76
+ <Box
77
+ data-levo_group
78
+ elementKey={`product_groups.${groupIndex}.products_without_images_levoGroup`}
79
+ >
80
+ {(
81
+ content.product_groups?.[groupIndex]?.products_without_images ??
82
+ []
83
+ ).map((_, index) => (
84
+ <Box
85
+ data-levo_group_item
86
+ elementKey={`product_groups.${groupIndex}.products_without_images.${index}.card`}
87
+ key={index}
88
+ >
89
+ <Box
90
+ elementKey={`product_groups.${groupIndex}.products_without_images.${index}.content_wrapper`}
91
+ >
92
+ <Heading
93
+ elementKey={`product_groups.${groupIndex}.products_without_images.${index}.title`}
94
+ />
95
+ <Typography
96
+ elementKey={`product_groups.${groupIndex}.products_without_images.${index}.description`}
97
+ />
98
+ <Box
99
+ elementKey={`product_groups.${groupIndex}.products_without_images.${index}.price_container`}
100
+ >
101
+ <Typography
102
+ elementKey={`product_groups.${groupIndex}.products_without_images.${index}.actual_price`}
103
+ />
104
+ <Typography
105
+ elementKey={`product_groups.${groupIndex}.products_without_images.${index}.discount_price`}
106
+ />
107
+ <Typography
108
+ elementKey={`product_groups.${groupIndex}.products_without_images.${index}.off_percent`}
109
+ />
110
+ </Box>
111
+ <Button
112
+ elementKey={`product_groups.${groupIndex}.products_without_images.${index}.cta`}
113
+ />
114
+ </Box>
115
+ </Box>
116
+ ))}
117
+ </Box>
118
+ </Box>
119
+ ))}
120
+ </Box>
121
+ </Container>
122
+ </Section>
123
+ );
124
+
125
+ export default ProductsListing3;
@@ -0,0 +1,505 @@
1
+ import type { IBlock } from "@levo-so/studio";
2
+
3
+ const DEFAULT_IMAGE = {
4
+ id: "7141014160938075687",
5
+ location: "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH.png",
6
+ kind: "image",
7
+ mimetype: "image/png",
8
+ srcset: {
9
+ "1080w":
10
+ "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-1080w.webp",
11
+ "1200w":
12
+ "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-1200w.webp",
13
+ "1920w":
14
+ "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-1920w.webp",
15
+ "320w": "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-320w.webp",
16
+ "640w": "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-640w.webp",
17
+ "750w": "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-750w.webp",
18
+ "828w": "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-828w.webp",
19
+ path: "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-640w.webp 640w, https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-1080w.webp 1080w, https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-1200w.webp 1200w, https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-1920w.webp 1920w, https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-320w.webp 320w, https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-750w.webp 750w, https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-828w.webp 828w",
20
+ },
21
+ };
22
+
23
+ const DUMMY_ICON = {
24
+ kind: "icon",
25
+ data: {
26
+ id: "star",
27
+ label: "Star",
28
+ tags: ["custom", "directional", "star", "support-like-question"],
29
+ svgCode:
30
+ '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n<path d="M17.6601 22.6701C17.1301 22.6701 16.4501 22.5001 15.6001 22.0001L12.6101 20.2301C12.3001 20.0501 11.7001 20.0501 11.4001 20.2301L8.40012 22.0001C6.63012 23.0501 5.59012 22.6301 5.12012 22.2901C4.66012 21.9501 3.94012 21.0801 4.41012 19.0801L5.12012 16.0101C5.20012 15.6901 5.04012 15.1401 4.80012 14.9001L2.32012 12.4201C1.08012 11.1801 1.18012 10.1201 1.35012 9.60007C1.52012 9.08007 2.06012 8.16007 3.78012 7.87007L6.97012 7.34007C7.27012 7.29007 7.70012 6.97007 7.83012 6.70007L9.60012 3.17007C10.4001 1.56007 11.4501 1.32007 12.0001 1.32007C12.5501 1.32007 13.6001 1.56007 14.4001 3.17007L16.1601 6.69007C16.3001 6.96007 16.7301 7.28007 17.0301 7.33007L20.2201 7.86007C21.9501 8.15007 22.4901 9.07007 22.6501 9.59007C22.8101 10.1101 22.9101 11.1701 21.6801 12.4101L19.2001 14.9001C18.9601 15.1401 18.8101 15.6801 18.8801 16.0101L19.5901 19.0801C20.0501 21.0801 19.3401 21.9501 18.8801 22.2901C18.6301 22.4701 18.2301 22.6701 17.6601 22.6701ZM12.0001 18.5901C12.4901 18.5901 12.9801 18.7101 13.3701 18.9401L16.3601 20.7101C17.2301 21.2301 17.7801 21.2301 17.9901 21.0801C18.2001 20.9301 18.3501 20.4001 18.1301 19.4201L17.4201 16.3501C17.2301 15.5201 17.5401 14.4501 18.1401 13.8401L20.6201 11.3601C21.1101 10.8701 21.3301 10.3901 21.2301 10.0601C21.1201 9.73007 20.6601 9.46007 19.9801 9.35007L16.7901 8.82007C16.0201 8.69007 15.1801 8.07007 14.8301 7.37007L13.0701 3.85007C12.7501 3.21007 12.3501 2.83007 12.0001 2.83007C11.6501 2.83007 11.2501 3.21007 10.9401 3.85007L9.17012 7.37007C8.82012 8.07007 7.98012 8.69007 7.21012 8.82007L4.03012 9.35007C3.35012 9.46007 2.89012 9.73007 2.78012 10.0601C2.67012 10.3901 2.90012 10.8801 3.39012 11.3601L5.87012 13.8401C6.47012 14.4401 6.78012 15.5201 6.59012 16.3501L5.88012 19.4201C5.65012 20.4101 5.81012 20.9301 6.02012 21.0801C6.23012 21.2301 6.77012 21.2201 7.65012 20.7101L10.6401 18.9401C11.0201 18.7101 11.5101 18.5901 12.0001 18.5901Z" fill="var(--color-icon-primary)"/>\n</svg>',
31
+ },
32
+ };
33
+
34
+ const DEFAULT_CONTENT = {
35
+ layout: null,
36
+ container: null,
37
+ main_wrapper: null,
38
+ left_container: null,
39
+ profile_image: DEFAULT_IMAGE,
40
+ right_container: null,
41
+ content_wrapper: null,
42
+ title: "Well Women Health checkup",
43
+ stats: [
44
+ {
45
+ stat_wrapper: null,
46
+ icon: DUMMY_ICON,
47
+ label: "<p>4.5 (236 reviews on Google)</p>",
48
+ },
49
+ {
50
+ stat_wrapper: null,
51
+ icon: DUMMY_ICON,
52
+ label: "<p>4.5 (236 reviews on Google)</p>",
53
+ },
54
+ {
55
+ stat_wrapper: null,
56
+ icon: DUMMY_ICON,
57
+ label: "<p>4.5 (236 reviews on Google)</p>",
58
+ },
59
+ {
60
+ stat_wrapper: null,
61
+ icon: DUMMY_ICON,
62
+ label: "<p>4.5 (236 reviews on Google)</p>",
63
+ },
64
+ ],
65
+ price_container: null,
66
+ actual_price: "$499",
67
+ discount_price: "$999",
68
+ off_percent: "50% OFF",
69
+ breadcrumbs: [
70
+ {
71
+ label: "<p>Home</p>",
72
+ icon: {
73
+ kind: "icon",
74
+ data: {
75
+ id: "arrow-right-3",
76
+ label: "Arrow Right 3",
77
+ tags: ["arrow", "custom", "directional", "right"],
78
+ svgCode:
79
+ '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n<path d="M8.90961 20.67C8.71961 20.67 8.52961 20.6 8.37961 20.45C8.08961 20.16 8.08961 19.68 8.37961 19.39L14.8996 12.87C15.3796 12.39 15.3796 11.61 14.8996 11.13L8.37961 4.61002C8.08961 4.32002 8.08961 3.84002 8.37961 3.55002C8.66961 3.26002 9.14961 3.26002 9.43961 3.55002L15.9596 10.07C16.4696 10.58 16.7596 11.27 16.7596 12C16.7596 12.73 16.4796 13.42 15.9596 13.93L9.43961 20.45C9.28961 20.59 9.09961 20.67 8.90961 20.67Z" fill="var(--color-icon-primary)"/>\n</svg>',
80
+ },
81
+ },
82
+ },
83
+ {
84
+ label: "<p>Test</p>",
85
+ icon: {
86
+ kind: "icon",
87
+ data: {
88
+ id: "arrow-right-3",
89
+ label: "Arrow Right 3",
90
+ tags: ["arrow", "custom", "directional", "right"],
91
+ svgCode:
92
+ '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n<path d="M8.90961 20.67C8.71961 20.67 8.52961 20.6 8.37961 20.45C8.08961 20.16 8.08961 19.68 8.37961 19.39L14.8996 12.87C15.3796 12.39 15.3796 11.61 14.8996 11.13L8.37961 4.61002C8.08961 4.32002 8.08961 3.84002 8.37961 3.55002C8.66961 3.26002 9.14961 3.26002 9.43961 3.55002L15.9596 10.07C16.4696 10.58 16.7596 11.27 16.7596 12C16.7596 12.73 16.4796 13.42 15.9596 13.93L9.43961 20.45C9.28961 20.59 9.09961 20.67 8.90961 20.67Z" fill="var(--color-icon-primary)"/>\n</svg>',
93
+ },
94
+ },
95
+ },
96
+ {
97
+ label: "<p>Wellness</p>",
98
+ icon: null,
99
+ },
100
+ ],
101
+ };
102
+
103
+ export type IProfile2Content = typeof DEFAULT_CONTENT;
104
+
105
+ export const Profile2: IBlock = {
106
+ category_id: "profile",
107
+ title: "Profile 2",
108
+ key: "profile-2",
109
+ version: "v1",
110
+ prompt_description:
111
+ "Two-column profile layout with left side image and right side content including title, expertise badges with icons, and pricing information.",
112
+ content_schema: [
113
+ {
114
+ key: "layout",
115
+ label: "Layout",
116
+ field_interface: "LayoutWidget",
117
+ hint: {
118
+ prompt_description:
119
+ "Overall profile section layout controlling spacing, background, and structure for the two-column layout.",
120
+ },
121
+ },
122
+ {
123
+ key: "container",
124
+ label: "Container",
125
+ field_interface: "ContainerWidget",
126
+ hint: {
127
+ prompt_description:
128
+ "Main container for centering and constraining the profile section content width.",
129
+ },
130
+ },
131
+ {
132
+ key: "breadcrumbs",
133
+ label: "Breadcrumbs",
134
+ field_interface: "BoxWidget",
135
+ kind: "group",
136
+ fields: [
137
+ {
138
+ key: "wrapper",
139
+ label: " Wrapper",
140
+ field_interface: "BoxWidget",
141
+ hint: {
142
+ prompt_description:
143
+ "Individual badge container with proper alignment for icon and label.",
144
+ },
145
+ },
146
+ {
147
+ key: "label",
148
+ label: "Label",
149
+ field_interface: "TypographyWidget",
150
+ hint: {
151
+ prompt_description:
152
+ "Descriptive text explaining the expertise area or specialization (e.g., 'Strategic Planning Expert').",
153
+ min_characters: 10,
154
+ max_characters: 40,
155
+ },
156
+ },
157
+ {
158
+ key: "icon",
159
+ label: "Icon",
160
+ field_interface: "IconWidget",
161
+ },
162
+ ],
163
+ },
164
+ {
165
+ key: "main_wrapper",
166
+ label: "Main Wrapper",
167
+ field_interface: "BoxWidget",
168
+ hint: {
169
+ prompt_description:
170
+ "Primary wrapper containing both left image and right content sections in a flex row layout.",
171
+ },
172
+ },
173
+ {
174
+ key: "left_container",
175
+ label: "Left Container",
176
+ field_interface: "BoxWidget",
177
+ hint: {
178
+ prompt_description:
179
+ "Left side container holding the profile image with appropriate sizing and positioning.",
180
+ },
181
+ },
182
+ {
183
+ key: "profile_image",
184
+ label: "Profile Image",
185
+ field_interface: "ImageWidget",
186
+ hint: {
187
+ prompt_description:
188
+ "Professional profile or business image that represents the individual or service being showcased.",
189
+ },
190
+ },
191
+ {
192
+ key: "right_container",
193
+ label: "Right Container",
194
+ field_interface: "BoxWidget",
195
+ hint: {
196
+ prompt_description:
197
+ "Right side container holding the main content including title, expertise badges, and pricing information.",
198
+ },
199
+ },
200
+ {
201
+ key: "content_wrapper",
202
+ label: "Content Wrapper",
203
+ field_interface: "BoxWidget",
204
+ hint: {
205
+ prompt_description:
206
+ "Wrapper for the main content elements (title, stats, pricing) with proper vertical spacing.",
207
+ },
208
+ },
209
+ {
210
+ key: "title",
211
+ label: "Profile Title",
212
+ field_interface: "HeadingWidget",
213
+ hint: {
214
+ prompt_description:
215
+ "Main profile headline that communicates the primary service or expertise. Should be professional and clear.",
216
+ min_characters: 20,
217
+ max_characters: 60,
218
+ },
219
+ },
220
+ {
221
+ key: "stats",
222
+ label: "Expertise Badges",
223
+ field_interface: "BoxWidget",
224
+ kind: "group",
225
+ hint: {
226
+ prompt_description:
227
+ "Collection of expertise areas or specializations with icons that build credibility and showcase capabilities.",
228
+ min_items: 2,
229
+ max_items: 4,
230
+ },
231
+ fields: [
232
+ {
233
+ key: "stat_wrapper",
234
+ label: "Badge Wrapper",
235
+ field_interface: "BoxWidget",
236
+ hint: {
237
+ prompt_description:
238
+ "Individual badge container with proper alignment for icon and label.",
239
+ },
240
+ },
241
+ {
242
+ key: "icon",
243
+ label: "Icon",
244
+ field_interface: "IconWidget",
245
+ },
246
+ {
247
+ key: "label",
248
+ label: "Badge Label",
249
+ field_interface: "TypographyWidget",
250
+ hint: {
251
+ prompt_description:
252
+ "Descriptive text explaining the expertise area or specialization (e.g., 'Strategic Planning Expert').",
253
+ min_characters: 10,
254
+ max_characters: 40,
255
+ },
256
+ },
257
+ ],
258
+ },
259
+ {
260
+ key: "price_container",
261
+ label: "Price Container",
262
+ field_interface: "BoxWidget",
263
+ hint: {
264
+ prompt_description:
265
+ "Container for pricing information displaying actual price, discount price, and savings percentage.",
266
+ },
267
+ },
268
+ {
269
+ key: "actual_price",
270
+ label: "Actual Price",
271
+ field_interface: "TypographyWidget",
272
+ hint: {
273
+ prompt_description:
274
+ "Current promotional price that customers will pay (e.g., '$499').",
275
+ },
276
+ },
277
+ {
278
+ key: "discount_price",
279
+ label: "Discount Price",
280
+ field_interface: "TypographyWidget",
281
+ hint: {
282
+ prompt_description:
283
+ "Original price before discount to show value (e.g., '$999').",
284
+ },
285
+ },
286
+ {
287
+ key: "off_percent",
288
+ label: "Off Percent",
289
+ field_interface: "TypographyWidget",
290
+ hint: {
291
+ prompt_description:
292
+ "Discount percentage highlighting the savings (e.g., '50% OFF').",
293
+ },
294
+ },
295
+ ],
296
+ layouts: [
297
+ {
298
+ title: "Default",
299
+ key: "default",
300
+ styles: {
301
+ layout: {
302
+ "padding-top": "5xl",
303
+ "padding-bottom": "5xl",
304
+ "padding-left": "xl",
305
+ "padding-right": "xl",
306
+ tablet: {
307
+ "padding-top": "4xl",
308
+ "padding-bottom": "4xl",
309
+ "padding-left": "lg",
310
+ "padding-right": "lg",
311
+ },
312
+ mobile: {
313
+ "padding-top": "3xl",
314
+ "padding-bottom": "3xl",
315
+ "padding-left": "base",
316
+ "padding-right": "base",
317
+ },
318
+ "background-color": "oklch(0.9413 0.0138 46.228)",
319
+ },
320
+ container: {
321
+ "max-width": "1280px",
322
+ "margin-left": "auto",
323
+ "margin-right": "auto",
324
+ },
325
+ main_wrapper: {
326
+ display: "flex",
327
+ "align-items": "center",
328
+ "column-gap": "4xl",
329
+ tablet: {
330
+ "column-gap": "3xl",
331
+ },
332
+ mobile: {
333
+ "flex-direction": "column",
334
+ "row-gap": "3xl",
335
+ },
336
+ },
337
+ left_container: {
338
+ flex: "1",
339
+ "max-width": "250px",
340
+ },
341
+ profile_image: {
342
+ "aspect-ratio": "1/1",
343
+ "object-fit": "cover",
344
+ "border-radius": "base",
345
+ },
346
+ right_container: {
347
+ flex: "1",
348
+ display: "flex",
349
+ "flex-direction": "column",
350
+ "justify-content": "center",
351
+ },
352
+ content_wrapper: {
353
+ display: "flex",
354
+ "flex-direction": "column",
355
+ "row-gap": "lg",
356
+ },
357
+ title: {
358
+ "margin-bottom": "lg",
359
+ "font-size": "4xl",
360
+ tablet: {
361
+ "font-size": "2xl",
362
+ },
363
+ },
364
+ stats_levoGroup: {
365
+ display: "grid",
366
+ "flex-direction": "column",
367
+ "row-gap": "2xs",
368
+ "margin-bottom": "lg",
369
+ "grid-template-columns": "repeat(2, minmax(0, 1fr))",
370
+ "column-gap": "none",
371
+ width: "60%",
372
+ tablet: {
373
+ width: "100%",
374
+ },
375
+ },
376
+ price_container: {
377
+ display: "flex",
378
+ "flex-direction": "row",
379
+ "align-items": "center",
380
+ "row-gap": "2xs",
381
+ "column-gap": "base",
382
+ },
383
+ actual_price: {
384
+ "font-size": "xl",
385
+ "font-weight": "700",
386
+ color: "text-1",
387
+ },
388
+ discount_price: {
389
+ "font-size": "sm",
390
+ color: "text-3",
391
+ "text-decoration": "line-through",
392
+ },
393
+ off_percent: {
394
+ "font-size": "sm",
395
+ "font-weight": "600",
396
+ color: "success",
397
+ },
398
+ stats: [
399
+ {
400
+ stat_wrapper: {
401
+ display: "flex",
402
+ "align-items": "center",
403
+ "column-gap": "sm",
404
+ },
405
+ label: {
406
+ color: "text-2",
407
+ },
408
+ },
409
+ {
410
+ stat_wrapper: {
411
+ display: "flex",
412
+ "align-items": "center",
413
+ "column-gap": "sm",
414
+ },
415
+ label: {
416
+ color: "text-2",
417
+ },
418
+ },
419
+ {
420
+ stat_wrapper: {
421
+ display: "flex",
422
+ "align-items": "center",
423
+ "column-gap": "sm",
424
+ },
425
+ label: {
426
+ color: "text-2",
427
+ },
428
+ },
429
+ {
430
+ stat_wrapper: {
431
+ display: "flex",
432
+ "align-items": "center",
433
+ "column-gap": "sm",
434
+ },
435
+ label: {
436
+ color: "text-2",
437
+ },
438
+ },
439
+ {
440
+ stat_wrapper: {
441
+ display: "flex",
442
+ "align-items": "center",
443
+ "column-gap": "sm",
444
+ },
445
+ label: {
446
+ color: "text-2",
447
+ },
448
+ },
449
+ {
450
+ stat_wrapper: {
451
+ display: "flex",
452
+ "align-items": "center",
453
+ "column-gap": "sm",
454
+ },
455
+ label: {
456
+ color: "text-2",
457
+ },
458
+ },
459
+ ],
460
+ breadcrumbs: [
461
+ {
462
+ wrapper: {
463
+ display: "flex",
464
+ "justify-content": "start",
465
+ "align-items": "center",
466
+ "column-gap": "5xs",
467
+ },
468
+ },
469
+ {
470
+ wrapper: {
471
+ display: "flex",
472
+ "justify-content": "start",
473
+ "align-items": "center",
474
+ "column-gap": "5xs",
475
+ },
476
+ },
477
+ {
478
+ wrapper: {
479
+ display: "flex",
480
+ "justify-content": "start",
481
+ "align-items": "center",
482
+ "column-gap": "5xs",
483
+ },
484
+ },
485
+ ],
486
+ breadcrumbs_levoGroup: {
487
+ display: "flex",
488
+ "column-gap": "xs",
489
+ "margin-bottom": "base",
490
+ },
491
+ },
492
+ content: DEFAULT_CONTENT,
493
+ config: {
494
+ title: {
495
+ heading: {
496
+ level: 2,
497
+ },
498
+ selectedVariants: {
499
+ Heading_Level: "H2",
500
+ },
501
+ },
502
+ },
503
+ },
504
+ ],
505
+ };
@@ -0,0 +1,64 @@
1
+ import {
2
+ Box,
3
+ Button,
4
+ Container,
5
+ Heading,
6
+ Image,
7
+ type ILevoBlockBaseProps,
8
+ Section,
9
+ Typography,
10
+ Icon,
11
+ } from "@levo-so/studio";
12
+ import React from "react";
13
+
14
+ import type { IProfile2Content } from "./profile-2.schema";
15
+
16
+ const Profile2: React.FC<ILevoBlockBaseProps<IProfile2Content>> = ({
17
+ content,
18
+ }) => (
19
+ <Section elementKey="layout">
20
+ <Container elementKey="container">
21
+ <Box elementKey="breadcrumbs_levoGroup" data-levo_group>
22
+ {(content?.breadcrumbs ?? []).map((_: any, index: number) => (
23
+ <Box
24
+ key={`stat-${index}`}
25
+ data-levo_group_item
26
+ elementKey={`breadcrumbs.${index}.wrapper`}
27
+ >
28
+ <Typography elementKey={`breadcrumbs.${index}.label`} />
29
+ <Icon elementKey={`breadcrumbs.${index}.icon`} />
30
+ </Box>
31
+ ))}
32
+ </Box>
33
+ <Box elementKey="main_wrapper">
34
+ <Box elementKey="left_container">
35
+ <Image elementKey="profile_image" alt="Profile image" />
36
+ </Box>
37
+ <Box elementKey="right_container">
38
+ <Box elementKey="content_wrapper">
39
+ <Heading elementKey="title" />
40
+ <Box elementKey="stats_levoGroup" data-levo_group>
41
+ {(content?.stats ?? []).map((_, index: number) => (
42
+ <Box
43
+ key={`stat-${index}`}
44
+ data-levo_group_item
45
+ elementKey={`stats.${index}.stat_wrapper`}
46
+ >
47
+ <Icon elementKey={`stats.${index}.icon`} />
48
+ <Typography elementKey={`stats.${index}.label`} />
49
+ </Box>
50
+ ))}
51
+ </Box>
52
+ <Box elementKey="price_container">
53
+ <Typography elementKey="actual_price" />
54
+ <Typography elementKey="discount_price" />
55
+ <Typography elementKey="off_percent" />
56
+ </Box>
57
+ </Box>
58
+ </Box>
59
+ </Box>
60
+ </Container>
61
+ </Section>
62
+ );
63
+
64
+ export default Profile2;