@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
@@ -11,32 +11,6 @@ const DUMMY_ICON = {
11
11
  },
12
12
  };
13
13
 
14
- const MEDIA = {
15
- placeholder: {
16
- id: "7141014160938075687",
17
- location: "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH.png",
18
- kind: "image",
19
- mimetype: "image/png",
20
- srcset: {
21
- "1080w":
22
- "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-1080w.webp",
23
- "1200w":
24
- "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-1200w.webp",
25
- "1920w":
26
- "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-1920w.webp",
27
- "320w":
28
- "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-320w.webp",
29
- "640w":
30
- "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-640w.webp",
31
- "750w":
32
- "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-750w.webp",
33
- "828w":
34
- "https://space.levo.so/WLZ1TXTD/defaultblue-tryFJ012mgyH-828w.webp",
35
- 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",
36
- },
37
- },
38
- };
39
-
40
14
  const DEFAULT_CONTENT = {
41
15
  layout: null,
42
16
  container: null,
@@ -131,6 +105,74 @@ const DEFAULT_CONTENT = {
131
105
  "Corporate law governs the formation, operation, and dissolution of corporations. Understanding these fundamentals is crucial for business leaders, entrepreneurs, and legal professionals. This comprehensive guide explores the key principles, regulatory frameworks, and practical applications that shape modern corporate governance.",
132
106
  };
133
107
 
108
+ const DEFAULT_CONTENT_V1 = {
109
+ layout: null,
110
+ container: null,
111
+ "main-content": null,
112
+ sidebar: null,
113
+ "sidebar-cards": [
114
+ {
115
+ card: null,
116
+ heading: "",
117
+ content: [
118
+ {
119
+ title: "Job Type",
120
+ description: "<p>Full-time</p>",
121
+ },
122
+ {
123
+ title: "<p>Experience</p>",
124
+ description: "<p>20+ years</p>",
125
+ },
126
+ {
127
+ title: "<p>Mode of Work</p>",
128
+ description:
129
+ "<p>Flexible (On-site/Remote/Hybrid with travel capability)</p>",
130
+ },
131
+ {
132
+ title: "<p>Schedule</p>",
133
+ description: "<p>9 am to 6.30 pm PHT</p>",
134
+ },
135
+ ],
136
+ button: "",
137
+ },
138
+ ],
139
+ "social-section": null,
140
+ "social-title": "",
141
+ "social-icons": [],
142
+ "blog-content": null,
143
+ "content-meta": null,
144
+ "content-icons": [],
145
+ "meta-info": null,
146
+ "date-wrapper": null,
147
+ "calendar-icon": {
148
+ kind: "icon",
149
+ data: {
150
+ id: "archive-minus",
151
+ label: "Archive Minus",
152
+ tags: ["archive", "custom", "directional", "minus"],
153
+ svgCode:
154
+ '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n<path d="M14.5 11.4H9.5C9.09 11.4 8.75 11.06 8.75 10.65C8.75 10.24 9.09 9.90002 9.5 9.90002H14.5C14.91 9.90002 15.25 10.24 15.25 10.65C15.25 11.06 14.91 11.4 14.5 11.4Z" fill="var(--color-icon-primary)"/>\n<path d="M4.92957 22.75C4.50957 22.75 4.11957 22.65 3.76957 22.45C2.99957 22 2.55957 21.09 2.55957 19.96V5.86C2.55957 3.32 4.62957 1.25 7.16957 1.25H16.8196C19.3596 1.25 21.4296 3.32 21.4296 5.86V19.95C21.4296 21.08 20.9896 21.99 20.2196 22.44C19.4496 22.89 18.4396 22.84 17.4496 22.29L12.5696 19.58C12.2796 19.42 11.7096 19.42 11.4196 19.58L6.53957 22.29C5.99957 22.59 5.44957 22.75 4.92957 22.75ZM7.17957 2.75C5.46957 2.75 4.06957 4.15 4.06957 5.86V19.95C4.06957 20.54 4.23957 20.98 4.53957 21.15C4.83957 21.33 5.30957 21.27 5.81957 20.98L10.6996 18.27C11.4396 17.86 12.5596 17.86 13.2996 18.27L18.1796 20.98C18.6896 21.27 19.1596 21.33 19.4596 21.15C19.7596 20.97 19.9296 20.53 19.9296 19.95V5.86C19.9296 4.15 18.5296 2.75 16.8196 2.75H7.17957Z" fill="var(--color-icon-primary)"/>\n</svg>',
155
+ },
156
+ },
157
+ "publish-date": "2025-01-16T10:23:31.297Z",
158
+ "time-wrapper": null,
159
+ "time-icon": {
160
+ kind: "icon",
161
+ data: {
162
+ id: "archive-minus",
163
+ label: "Archive Minus",
164
+ tags: ["archive", "custom", "directional", "minus"],
165
+ svgCode:
166
+ '<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">\n<path d="M14.5 11.4H9.5C9.09 11.4 8.75 11.06 8.75 10.65C8.75 10.24 9.09 9.90002 9.5 9.90002H14.5C14.91 9.90002 15.25 10.24 15.25 10.65C15.25 11.06 14.91 11.4 14.5 11.4Z" fill="var(--color-icon-primary)"/>\n<path d="M4.92957 22.75C4.50957 22.75 4.11957 22.65 3.76957 22.45C2.99957 22 2.55957 21.09 2.55957 19.96V5.86C2.55957 3.32 4.62957 1.25 7.16957 1.25H16.8196C19.3596 1.25 21.4296 3.32 21.4296 5.86V19.95C21.4296 21.08 20.9896 21.99 20.2196 22.44C19.4496 22.89 18.4396 22.84 17.4496 22.29L12.5696 19.58C12.2796 19.42 11.7096 19.42 11.4196 19.58L6.53957 22.29C5.99957 22.59 5.44957 22.75 4.92957 22.75ZM7.17957 2.75C5.46957 2.75 4.06957 4.15 4.06957 5.86V19.95C4.06957 20.54 4.23957 20.98 4.53957 21.15C4.83957 21.33 5.30957 21.27 5.81957 20.98L10.6996 18.27C11.4396 17.86 12.5596 17.86 13.2996 18.27L18.1796 20.98C18.6896 21.27 19.1596 21.33 19.4596 21.15C19.7596 20.97 19.9296 20.53 19.9296 19.95V5.86C19.9296 4.15 18.5296 2.75 16.8196 2.75H7.17957Z" fill="var(--color-icon-primary)"/>\n</svg>',
167
+ },
168
+ },
169
+ "reading-time": "12 Minutes",
170
+ "content-section": null,
171
+ content:
172
+ '<p>Career services teams in e-learning companies encounter numerous hurdles that hinder their learners\' placement rates. Despite providing excellent training, many learners struggle to secure positions. This dilemma not only affects learner satisfaction but also impacts referrals and increases customer acquisition costs, which now consume 30% of their revenue. This situation poses a significant threat to the company\'s growth and sustainability, making it imperative to find a solution.</p><p><strong>How do you get your learners placed?</strong></p><p>After conversing with over 400 e-learning founders and placement managers, we\'ve realized a significant reason why their learners struggle to secure placements: they simply aren\'t applying to a sufficient number of job opportunities. On average, learners are only applying to about 20 positions, whereas they should ideally target 200 or more applications.</p><p>We understand that aiming for over 200 applications might seem daunting, but in today\'s job market, with a surplus of applicants and a scarcity of job openings, it\'s a necessity for increasing their chances of success.</p><p><strong>Why is it important to apply to so many jobs?( 200+)</strong></p><p>Applying to over 200 jobs is crucial because the job market is highly competitive. Each major job board receives over 1000 applicants for every fresh job opening. Typically, recruiters only screen around 50 candidates and hire just one. Even in cases of bulk hiring, the ratio of applicants to hire remains low, between 2 and 5%. Simply put, securing a job is a numbers game. The more positions you apply for, the higher your chances of success.</p><p>For instance, if a learner applies to 200 jobs, they\'re likely to be screened for around 30% of them, or approximately 60 jobs. From these, they may receive interview calls for about 30 jobs. Although initial rejections are common due to nerves and a lack of interview experience, candidates improve with practice. After around 10 interviews, they become more comfortable and perform better, eventually receiving job offers from at least 2 of them. Therefore, applying to over 200 jobs significantly increases the probability of receiving interview calls and job offers.</p><p><strong>How can learners apply to 200+ jobs?</strong></p><p>Learners can apply to over 200 jobs through two primary methods:</p><ol><li><p>Outreach by the Placement Team: This involves the placement team sourcing job opportunities and recommending them to learners.</p></li></ol><ol start="2"><li><p>Independent Applications for Market Jobs: Learners can directly apply to job openings available in the market without relying solely on the placement team.</p></li></ol><p>However, it\'s notable that many Indian Ed-tech Placement teams predominantly focus on the jobs sourced by the company. This is often because learners insist on it, given they\'ve invested in the training. However, this approach is counterproductive for learners as it limits their job prospects.</p><p>This trend is unique to India and needs to change. Learners must be encouraged to explore and apply to a broader range of job opportunities independently to enhance their chances of securing employment.</p><p><strong>Global Sights</strong></p><p>Based on insights gathered from conversations with over 120 international e-learning founders and placement managers and 400+ in India, a significant contrast in the approach to job seeking among learners is apparent:</p><p>Globally, Approximately 80% of learners in the e-learning sector secure jobs independently, while only 20% find employment through employers or jobs sourced by e-learning companies. This indicates a strong reliance on individual efforts in the global context.</p><p>India: The trend is reversed, with approximately 80% of placements facilitated by e-learning companies and only 20% through independent learner’s applications. This disproportionate reliance on e-learning efforts in India is not sustainable and calls for a shift towards a more balanced approach.</p><p><strong>Why is over-reliance on e-learning-sourced jobs not a good idea?</strong></p><p>Relying heavily on e-learning-sourced jobs, averaging around 150 per month, is not ideal. However, during the same period, there could be 5000–10,000+ jobs available in the open market. By solely depending on e-learning-sourced opportunities, learners miss out on approximately 90% of the job openings, limiting their prospects significantly.</p><p>Ed-tech companies often struggle to secure enough job opportunities due to manual job sourcing methods. Placement teams spend extensive time screening hundreds of jobs across various job boards, investing 5 to 6 hours daily in this process. Despite their efforts, the response rate from recruiters remains low, with only around 5% responding to outreach attempts. At such low response rate, they will need an army of placement officers to source 500+ jobs for 100 learners every batch. (How to increase response rate from employers in our next article)</p><p>Additionally, the manual approach leads to a narrow focus on just 5 to 7 mainstream job portals, neglecting approximately 40 other potential platforms. As a result, they miss out on roughly 90% of available job opportunities</p><p><strong>So how do e-learning companies enable their learners to apply to 200 + jobs?</strong></p><p>To enable their learners to apply to over 200 jobs, E-learning companies can implement the following solutions:</p><ol><li><p>Encourage Applying to Market Jobs: Counsel learners on the importance of applying to industry jobs independently. Set this expectation at enrollment to ensure they understand the benefits.</p></li></ol><ol start="2"><li><p>Provide Job Application Training: Offer comprehensive training on job application techniques, including customizing resumes, highlighting strengths, and navigating Applicant Tracking Systems (ATS) biases.</p></li></ol><ol start="3"><li><p>Offer Tools: Equip learners with tools to streamline their job search, such as Chrome extensions for auto-filling application forms, AI-powered resume and LinkedIn reviewers, and an automated job tracker. To boast makes it easier for them to apply for and track jobs.</p></li></ol><ol start="4"><li><p>Adopt Automated Job Sourcing Tools: Implement automated tools like AI Job Importer bots to broaden job opportunities beyond mainstream portals. This saves significant time, reducing the daily 6-hour job sourcing task to just 20–25 minutes, resulting in a 95% time- savings.</p></li></ol><ol start="5"><li><p>Gamify application: Gamify job applications with streaks, leaderboards, and challenges. Reward learners with extra credits for tasks like updating resumes and networking. Use virtual rewards and progress tracking to keep them engaged and motivated.</p></li></ol><p><strong>Conclusion:</strong></p><p>By automating repetitive tasks and leveraging smart job sourcing techniques, placement teams can focus on higher-impact activities, such as providing personalized support to candidates and building stronger employer relationships, ultimately leading to better placement outcomes.</p>',
173
+ content_title: "<p>Job Description</p>",
174
+ };
175
+
134
176
  export type IBlogPost2Content = typeof DEFAULT_CONTENT;
135
177
 
136
178
  export const BlogPost2: IBlock = {
@@ -201,6 +243,7 @@ export const BlogPost2: IBlock = {
201
243
  hint: {
202
244
  prompt_description:
203
245
  "Main heading for the card section. Should be descriptive and concise.",
246
+ usecase: "title",
204
247
  min_characters: 8,
205
248
  max_characters: 40,
206
249
  },
@@ -223,10 +266,11 @@ export const BlogPost2: IBlock = {
223
266
  {
224
267
  key: "title",
225
268
  label: "Title",
226
- field_interface: "HeadingWidget",
269
+ field_interface: "TypographyWidget",
227
270
  hint: {
228
271
  prompt_description:
229
272
  "Content title describing the service or feature. Keep it concise and impactful.",
273
+ usecase: "title",
230
274
  min_characters: 10,
231
275
  max_characters: 40,
232
276
  },
@@ -238,6 +282,7 @@ export const BlogPost2: IBlock = {
238
282
  hint: {
239
283
  prompt_description:
240
284
  "Brief description explaining the service or feature benefits.",
285
+ usecase: "description",
241
286
  min_characters: 40,
242
287
  max_characters: 120,
243
288
  },
@@ -251,6 +296,7 @@ export const BlogPost2: IBlock = {
251
296
  hint: {
252
297
  prompt_description:
253
298
  "Call-to-action button for the card. Use action-oriented text.",
299
+ usecase: "button",
254
300
  min_characters: 5,
255
301
  max_characters: 20,
256
302
  },
@@ -271,10 +317,11 @@ export const BlogPost2: IBlock = {
271
317
  {
272
318
  key: "social-title",
273
319
  label: "Social Title",
274
- field_interface: "HeadingWidget",
320
+ field_interface: "TypographyWidget",
275
321
  hint: {
276
322
  prompt_description:
277
323
  "Title for the social media section. Keep it short and engaging.",
324
+ usecase: "title",
278
325
  min_characters: 5,
279
326
  max_characters: 20,
280
327
  },
@@ -358,6 +405,7 @@ export const BlogPost2: IBlock = {
358
405
  hint: {
359
406
  prompt_description:
360
407
  "Brief description of the content feature or highlight.",
408
+ usecase: "label",
361
409
  min_characters: 8,
362
410
  max_characters: 30,
363
411
  },
@@ -395,6 +443,7 @@ export const BlogPost2: IBlock = {
395
443
  field_interface: "TypographyWidget",
396
444
  hint: {
397
445
  prompt_description: "Publication date of the blog post.",
446
+ usecase: "date",
398
447
  min_characters: 8,
399
448
  max_characters: 20,
400
449
  },
@@ -421,6 +470,7 @@ export const BlogPost2: IBlock = {
421
470
  field_interface: "TypographyWidget",
422
471
  hint: {
423
472
  prompt_description: "Estimated reading time for the blog post.",
473
+ usecase: "reading_time",
424
474
  min_characters: 5,
425
475
  max_characters: 15,
426
476
  },
@@ -435,6 +485,11 @@ export const BlogPost2: IBlock = {
435
485
  prompt_description: "Main blog content container. No content needed.",
436
486
  },
437
487
  },
488
+ {
489
+ key: "content_title",
490
+ label: "Content title",
491
+ field_interface: "TypographyWidget",
492
+ },
438
493
  {
439
494
  key: "content",
440
495
  label: "Content",
@@ -442,10 +497,16 @@ export const BlogPost2: IBlock = {
442
497
  hint: {
443
498
  prompt_description:
444
499
  "Full blog article content. Should be comprehensive and informative.",
500
+ usecase: "description",
445
501
  min_characters: 200,
446
502
  max_characters: 8000,
447
503
  },
448
504
  },
505
+ {
506
+ key: "contact_form",
507
+ label: "Contact Form",
508
+ field_interface: "FormWidget",
509
+ },
449
510
  ],
450
511
  layouts: [
451
512
  {
@@ -787,5 +848,380 @@ export const BlogPost2: IBlock = {
787
848
  },
788
849
  },
789
850
  },
851
+ {
852
+ key: "variant-1",
853
+ title: "Variant 1",
854
+ styles: {
855
+ layout: {
856
+ width: "100%",
857
+ "padding-top": "8xl",
858
+ "padding-bottom": "8xl",
859
+ "padding-left": "6xl",
860
+ "padding-right": "6xl",
861
+ mobile: {
862
+ "padding-top": "5xl",
863
+ "padding-bottom": "5xl",
864
+ "padding-left": "2xl",
865
+ "padding-right": "2xl",
866
+ },
867
+ },
868
+ container: {
869
+ width: "100%",
870
+ "max-width": "1280px",
871
+ "margin-left": "auto",
872
+ "margin-right": "auto",
873
+ },
874
+ "main-content": {
875
+ display: "flex",
876
+ "column-gap": "4xl",
877
+ "row-gap": "4xl",
878
+ mobile: {
879
+ "flex-direction": "column",
880
+ },
881
+ },
882
+ sidebar: {
883
+ width: "20%",
884
+ "flex-shrink": "0",
885
+ display: "flex",
886
+ "flex-direction": "column",
887
+ "row-gap": "3xl",
888
+ mobile: {
889
+ width: "100%",
890
+ },
891
+ "border-right": "1px solid",
892
+ "border-color": "text-3",
893
+ },
894
+ "sidebar-cards_levoGroup": {
895
+ display: "flex",
896
+ "flex-direction": "column",
897
+ "row-gap": "2xl",
898
+ },
899
+ "sidebar-cards": [
900
+ {
901
+ card: {},
902
+ heading: {
903
+ color: "var(--color-text-1)",
904
+ "margin-bottom": "base",
905
+ display: "none",
906
+ },
907
+ content_levoGroup: {
908
+ display: "flex",
909
+ "flex-direction": "column",
910
+ "border-style": "none",
911
+ "border-width": "0px",
912
+ },
913
+ content: [
914
+ {
915
+ "content-item": {
916
+ "margin-bottom": "sm",
917
+ },
918
+ title: {
919
+ "margin-bottom": "xs",
920
+ color: "var(--color-text-1)",
921
+ "font-weight": 700,
922
+ },
923
+ description: {
924
+ "font-size": "sm",
925
+ color: "var(--color-text-2)",
926
+ "line-height": "1.5",
927
+ },
928
+ },
929
+ {
930
+ "content-item": {
931
+ "margin-bottom": "sm",
932
+ },
933
+ title: {
934
+ "margin-bottom": "xs",
935
+ color: "var(--color-text-1)",
936
+ "font-weight": 700,
937
+ },
938
+ description: {
939
+ "font-size": "sm",
940
+ color: "var(--color-text-2)",
941
+ "line-height": "1.5",
942
+ },
943
+ },
944
+ {
945
+ "content-item": {
946
+ "margin-bottom": "sm",
947
+ },
948
+ title: {
949
+ "margin-bottom": "xs",
950
+ color: "var(--color-text-1)",
951
+ "font-weight": 700,
952
+ },
953
+ description: {
954
+ "font-size": "sm",
955
+ color: "var(--color-text-2)",
956
+ "line-height": "1.5",
957
+ },
958
+ },
959
+ {
960
+ "content-item": {
961
+ "margin-bottom": "sm",
962
+ },
963
+ title: {
964
+ "margin-bottom": "xs",
965
+ color: "var(--color-text-1)",
966
+ "font-weight": 700,
967
+ },
968
+ description: {
969
+ "font-size": "sm",
970
+ color: "var(--color-text-2)",
971
+ "line-height": "1.5",
972
+ },
973
+ },
974
+ {
975
+ "content-item": {
976
+ "margin-bottom": "sm",
977
+ },
978
+ title: {
979
+ "margin-bottom": "xs",
980
+ color: "var(--color-text-1)",
981
+ },
982
+ description: {
983
+ "font-size": "sm",
984
+ color: "var(--color-text-2)",
985
+ "line-height": "1.5",
986
+ },
987
+ },
988
+ ],
989
+ },
990
+ {
991
+ card: {
992
+ "padding-top": "xl",
993
+ "padding-bottom": "xl",
994
+ "padding-left": "lg",
995
+ "padding-right": "lg",
996
+ "border-radius": "lg",
997
+ border: "1px solid",
998
+ "border-color": "var(--color-border)",
999
+ display: "none",
1000
+ "flex-direction": "column",
1001
+ "row-gap": "base",
1002
+ },
1003
+ image: {
1004
+ width: "48px",
1005
+ height: "48px",
1006
+ "border-radius": "base",
1007
+ },
1008
+ content_levoGroup: {
1009
+ display: "flex",
1010
+ "flex-direction": "column",
1011
+ "row-gap": "base",
1012
+ },
1013
+ content: [
1014
+ {
1015
+ "content-item": {
1016
+ "margin-bottom": "sm",
1017
+ },
1018
+ title: {
1019
+ "margin-bottom": "xs",
1020
+ color: "var(--color-text-1)",
1021
+ },
1022
+ description: {
1023
+ "font-size": "sm",
1024
+ color: "var(--color-text-2)",
1025
+ "line-height": "1.5",
1026
+ },
1027
+ },
1028
+ ],
1029
+ },
1030
+ {
1031
+ card: {
1032
+ "padding-top": "xl",
1033
+ "padding-bottom": "xl",
1034
+ "padding-left": "lg",
1035
+ "padding-right": "lg",
1036
+ "border-radius": "lg",
1037
+ border: "1px solid",
1038
+ "border-color": "var(--color-border)",
1039
+ display: "none",
1040
+ "flex-direction": "column",
1041
+ "row-gap": "base",
1042
+ },
1043
+ image: {
1044
+ width: "48px",
1045
+ height: "48px",
1046
+ "border-radius": "base",
1047
+ },
1048
+ content_levoGroup: {
1049
+ display: "flex",
1050
+ "flex-direction": "column",
1051
+ "row-gap": "base",
1052
+ },
1053
+ content: [
1054
+ {
1055
+ "content-item": {
1056
+ "margin-bottom": "sm",
1057
+ },
1058
+ title: {
1059
+ "margin-bottom": "xs",
1060
+ color: "var(--color-text-1)",
1061
+ },
1062
+ description: {
1063
+ "font-size": "sm",
1064
+ color: "var(--color-text-2)",
1065
+ "line-height": "1.5",
1066
+ },
1067
+ },
1068
+ ],
1069
+ },
1070
+ ],
1071
+ "social-section": {
1072
+ display: "none",
1073
+ },
1074
+ "social-title": {
1075
+ "font-size": "lg",
1076
+ "font-weight": "semibold",
1077
+ "margin-bottom": "lg",
1078
+ color: "var(--color-text-1)",
1079
+ },
1080
+ "social-icons_levoGroup": {
1081
+ display: "flex",
1082
+ "column-gap": "base",
1083
+ },
1084
+ "social-icons": [
1085
+ {
1086
+ icon: {
1087
+ width: "32px",
1088
+ height: "32px",
1089
+ },
1090
+ },
1091
+ {
1092
+ icon: {
1093
+ width: "32px",
1094
+ height: "32px",
1095
+ },
1096
+ },
1097
+ {
1098
+ icon: {
1099
+ width: "32px",
1100
+ height: "32px",
1101
+ },
1102
+ },
1103
+ ],
1104
+ "blog-content": {
1105
+ "flex-grow": "1",
1106
+ display: "block",
1107
+ "flex-direction": "column",
1108
+ "row-gap": "3xl",
1109
+ width: "50%",
1110
+ },
1111
+ "content-meta": {
1112
+ display: "none",
1113
+ "flex-direction": "column",
1114
+ "row-gap": "lg",
1115
+ "padding-top": "xl",
1116
+ "padding-bottom": "xl",
1117
+ "border-top": "1px solid",
1118
+ "border-bottom": "1px solid",
1119
+ "border-color": "var(--color-border)",
1120
+ },
1121
+ "content-icons_levoGroup": {
1122
+ display: "flex",
1123
+ "column-gap": "2xl",
1124
+ "row-gap": "lg",
1125
+ "flex-wrap": "wrap",
1126
+ },
1127
+ "content-icons": [
1128
+ {
1129
+ "icon-wrapper": {
1130
+ display: "flex",
1131
+ "align-items": "center",
1132
+ "column-gap": "xs",
1133
+ },
1134
+ icon: {
1135
+ width: "24px",
1136
+ height: "24px",
1137
+ },
1138
+ description: {
1139
+ "font-size": "sm",
1140
+ "font-weight": "medium",
1141
+ color: "var(--color-text-1)",
1142
+ },
1143
+ },
1144
+ {
1145
+ "icon-wrapper": {
1146
+ display: "flex",
1147
+ "align-items": "center",
1148
+ "column-gap": "xs",
1149
+ },
1150
+ icon: {
1151
+ width: "24px",
1152
+ height: "24px",
1153
+ },
1154
+ description: {
1155
+ "font-size": "sm",
1156
+ "font-weight": "medium",
1157
+ color: "var(--color-text-1)",
1158
+ },
1159
+ },
1160
+ ],
1161
+ "meta-info": {
1162
+ display: "flex",
1163
+ "column-gap": "2xl",
1164
+ "row-gap": "lg",
1165
+ "flex-wrap": "wrap",
1166
+ },
1167
+ "date-wrapper": {
1168
+ display: "flex",
1169
+ "align-items": "center",
1170
+ "column-gap": "xs",
1171
+ },
1172
+ "calendar-icon": {
1173
+ width: "20px",
1174
+ height: "20px",
1175
+ },
1176
+ "publish-date": {
1177
+ "font-size": "sm",
1178
+ color: "var(--color-text-2)",
1179
+ },
1180
+ "time-wrapper": {
1181
+ display: "flex",
1182
+ "align-items": "center",
1183
+ "column-gap": "xs",
1184
+ },
1185
+ "time-icon": {
1186
+ width: "20px",
1187
+ height: "20px",
1188
+ },
1189
+ "reading-time": {
1190
+ "font-size": "sm",
1191
+ color: "var(--color-text-2)",
1192
+ },
1193
+ "content-section": {
1194
+ display: "flex",
1195
+ "flex-direction": "column",
1196
+ },
1197
+ content: {
1198
+ "font-size": "base",
1199
+ "line-height": "1.7",
1200
+ color: "var(--color-text-1)",
1201
+ },
1202
+ content_title: {
1203
+ color: "text-1",
1204
+ "font-size": "3xl",
1205
+ "font-weight": 700,
1206
+ "margin-bottom": "5xl",
1207
+ },
1208
+ contact_form: {
1209
+ width: "30%",
1210
+ "background-color": "background-3",
1211
+ height: "fit-content",
1212
+ },
1213
+ },
1214
+ content: DEFAULT_CONTENT_V1,
1215
+ config: {
1216
+ title: {
1217
+ heading: {
1218
+ level: 2,
1219
+ },
1220
+ selectedVariants: {
1221
+ Heading_Level: "H2",
1222
+ },
1223
+ },
1224
+ },
1225
+ },
790
1226
  ],
791
1227
  };
@@ -3,17 +3,15 @@ import {
3
3
  Box,
4
4
  Button,
5
5
  Container,
6
+ Form,
6
7
  Heading,
7
8
  Icon,
8
- Image,
9
9
  Section,
10
10
  Typography,
11
11
  } from "@levo-so/studio";
12
12
  import dayjs from "dayjs";
13
13
  import type React from "react";
14
-
15
14
  import type { IBlogPost2Content } from "./blog-post-2.schema";
16
-
17
15
  const BlogPost2: React.FC<ILevoBlockBaseProps<IBlogPost2Content>> = ({
18
16
  content,
19
17
  }) => (
@@ -32,7 +30,6 @@ const BlogPost2: React.FC<ILevoBlockBaseProps<IBlogPost2Content>> = ({
32
30
  elementKey={`sidebar-cards.${index}.card`}
33
31
  >
34
32
  <Heading elementKey={`sidebar-cards.${index}.heading`} />
35
-
36
33
  {/* Repeatable Titles and Descriptions */}
37
34
  <Box
38
35
  elementKey={`sidebar-cards.${index}.content_levoGroup`}
@@ -46,7 +43,7 @@ const BlogPost2: React.FC<ILevoBlockBaseProps<IBlogPost2Content>> = ({
46
43
  data-levo_group_item
47
44
  elementKey={`sidebar-cards.${index}.content.${contentIndex}.content-item`}
48
45
  >
49
- <Heading
46
+ <Typography
50
47
  elementKey={`sidebar-cards.${index}.content.${contentIndex}.title`}
51
48
  />
52
49
  <Typography
@@ -55,16 +52,14 @@ const BlogPost2: React.FC<ILevoBlockBaseProps<IBlogPost2Content>> = ({
55
52
  </Box>
56
53
  ))}
57
54
  </Box>
58
-
59
55
  <Button elementKey={`sidebar-cards.${index}.button`} />
60
56
  </Box>
61
57
  ),
62
58
  )}
63
59
  </Box>
64
-
65
60
  {/* Social Media Icons */}
66
61
  <Box elementKey="social-section">
67
- <Heading elementKey="social-title" />
62
+ <Typography elementKey="social-title" />
68
63
  <Box elementKey="social-icons_levoGroup" data-levo_group>
69
64
  {(content?.["social-icons"] ?? []).map(
70
65
  (_: unknown, index: number) => (
@@ -78,7 +73,6 @@ const BlogPost2: React.FC<ILevoBlockBaseProps<IBlogPost2Content>> = ({
78
73
  </Box>
79
74
  </Box>
80
75
  </Box>
81
-
82
76
  {/* Main Blog Content */}
83
77
  <Box elementKey="blog-content">
84
78
  {/* Top Content Icons */}
@@ -99,7 +93,6 @@ const BlogPost2: React.FC<ILevoBlockBaseProps<IBlogPost2Content>> = ({
99
93
  ),
100
94
  )}
101
95
  </Box>
102
-
103
96
  {/* Calendar and Time (fixed icons) */}
104
97
  <Box elementKey="meta-info">
105
98
  <Box elementKey="date-wrapper">
@@ -117,15 +110,15 @@ const BlogPost2: React.FC<ILevoBlockBaseProps<IBlogPost2Content>> = ({
117
110
  </Box>
118
111
  </Box>
119
112
  </Box>
120
-
121
113
  {/* Blog Content */}
122
114
  <Box elementKey="content-section">
123
- <Typography elementKey="content" />
115
+ <Typography elementKey="content_title" />
116
+ <Typography elementKey="content" className="LevoProseMirror" />
124
117
  </Box>
125
118
  </Box>
119
+ <Form elementKey="contact_form" />
126
120
  </Box>
127
121
  </Container>
128
122
  </Section>
129
123
  );
130
-
131
124
  export default BlogPost2;