@levo-so/blocks 0.3.13 → 0.3.15

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.
@@ -3,8 +3,7 @@ import type { IBlock } from "@levo-so/studio";
3
3
  const HERO_IMAGE = {
4
4
  id: "7453352427682930486",
5
5
  kind: "image",
6
- location:
7
- "https://images.pexels.com/photos/5686124/pexels-photo-5686124.jpeg",
6
+ location: "https://images.pexels.com/photos/5686124/pexels-photo-5686124.jpeg",
8
7
  mimetype: "image/jpeg",
9
8
  srcset: {
10
9
  "320w":
@@ -150,14 +149,14 @@ const DEFAULT_CONTENT = {
150
149
  },
151
150
  ],
152
151
 
152
+ // Sidebar Embed
153
+ sidebar_embed:
154
+ '<div class="sidebar-video-container"><iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ" title="YouTube Video 1" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe><iframe src="https://www.youtube.com/embed/L_LUpnjgPso" title="YouTube Video 2" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe><iframe src="https://www.youtube.com/embed/3JZ_D3ELwOQ" title="YouTube Video 3" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div><style>.sidebar-video-container { display: flex; flex-direction: column; gap: 16px; width: 100%; max-width: 100%; box-sizing: border-box; overflow: hidden; } .sidebar-video-container iframe { width: 100% !important; max-width: 100% !important; aspect-ratio: 16 / 9; border: 0; border-radius: 12px; box-sizing: border-box; display: block; }</style>',
155
+
153
156
  // Social section
154
157
  social_section: null,
155
158
  social_title: "Share this role",
156
- social_icons: [
157
- { icon: ICON_LINKEDIN },
158
- { icon: ICON_TWITTER },
159
- { icon: ICON_FACEBOOK },
160
- ],
159
+ social_icons: [{ icon: ICON_LINKEDIN }, { icon: ICON_TWITTER }, { icon: ICON_FACEBOOK }],
161
160
 
162
161
  // Job content
163
162
  job_content: null,
@@ -331,8 +330,7 @@ export const Jobs1: IBlock = {
331
330
  label: "Hero Image (Mobile)",
332
331
  field_interface: "MediaWidget",
333
332
  hint: {
334
- prompt_description:
335
- "Optimized version of the hero image for mobile screens.",
333
+ prompt_description: "Optimized version of the hero image for mobile screens.",
336
334
  orientation: "portrait",
337
335
  size: "medium",
338
336
  usecase: "hero",
@@ -363,8 +361,7 @@ export const Jobs1: IBlock = {
363
361
  label: "Details Content Wrapper",
364
362
  field_interface: "BoxWidget",
365
363
  hint: {
366
- prompt_description:
367
- "Main wrapper for the two-column layout of job details.",
364
+ prompt_description: "Main wrapper for the two-column layout of job details.",
368
365
  },
369
366
  },
370
367
 
@@ -374,8 +371,7 @@ export const Jobs1: IBlock = {
374
371
  label: "Sidebar",
375
372
  field_interface: "BoxWidget",
376
373
  hint: {
377
- prompt_description:
378
- "Left sidebar container for job info cards and social sharing.",
374
+ prompt_description: "Left sidebar container for job info cards and social sharing.",
379
375
  },
380
376
  },
381
377
  {
@@ -410,8 +406,7 @@ export const Jobs1: IBlock = {
410
406
  field_interface: "BoxWidget",
411
407
  kind: "group",
412
408
  hint: {
413
- prompt_description:
414
- "Repeatable label-value pairs for job information.",
409
+ prompt_description: "Repeatable label-value pairs for job information.",
415
410
  },
416
411
  fields: [
417
412
  {
@@ -436,8 +431,7 @@ export const Jobs1: IBlock = {
436
431
  label: "Value",
437
432
  field_interface: "TypographyWidget",
438
433
  hint: {
439
- prompt_description:
440
- "Value for the job attribute (e.g., Full-time, 3-5 years).",
434
+ prompt_description: "Value for the job attribute (e.g., Full-time, 3-5 years).",
441
435
  usecase: "description",
442
436
  min_characters: 3,
443
437
  max_characters: 50,
@@ -450,8 +444,7 @@ export const Jobs1: IBlock = {
450
444
  label: "Card Button",
451
445
  field_interface: "ButtonWidget",
452
446
  hint: {
453
- prompt_description:
454
- "Call-to-action button for the card (e.g., Apply Now).",
447
+ prompt_description: "Call-to-action button for the card (e.g., Apply Now).",
455
448
  usecase: "button",
456
449
  min_characters: 5,
457
450
  max_characters: 20,
@@ -460,6 +453,17 @@ export const Jobs1: IBlock = {
460
453
  ],
461
454
  },
462
455
 
456
+ // Sidebar Embed
457
+ {
458
+ key: "sidebar_embed",
459
+ label: "Sidebar Video Embed",
460
+ field_interface: "IframeWidget",
461
+ hint: {
462
+ prompt_description:
463
+ "Embedded video or custom HTML widget displayed in the left sidebar below job overview card.",
464
+ },
465
+ },
466
+
463
467
  // Social section
464
468
  {
465
469
  key: "social_section",
@@ -486,8 +490,7 @@ export const Jobs1: IBlock = {
486
490
  field_interface: "BoxWidget",
487
491
  kind: "group",
488
492
  hint: {
489
- prompt_description:
490
- "Social media platform icons for sharing the job listing.",
493
+ prompt_description: "Social media platform icons for sharing the job listing.",
491
494
  },
492
495
  fields: [
493
496
  {
@@ -510,8 +513,7 @@ export const Jobs1: IBlock = {
510
513
  label: "Job Content Area",
511
514
  field_interface: "BoxWidget",
512
515
  hint: {
513
- prompt_description:
514
- "Main job content area containing meta info and description.",
516
+ prompt_description: "Main job content area containing meta info and description.",
515
517
  },
516
518
  },
517
519
 
@@ -521,8 +523,7 @@ export const Jobs1: IBlock = {
521
523
  label: "Job Meta Information",
522
524
  field_interface: "BoxWidget",
523
525
  hint: {
524
- prompt_description:
525
- "Container for job metadata like department, location, and dates.",
526
+ prompt_description: "Container for job metadata like department, location, and dates.",
526
527
  },
527
528
  },
528
529
  {
@@ -570,8 +571,7 @@ export const Jobs1: IBlock = {
570
571
  label: "Meta Details",
571
572
  field_interface: "BoxWidget",
572
573
  hint: {
573
- prompt_description:
574
- "Container for posting date and application deadline.",
574
+ prompt_description: "Container for posting date and application deadline.",
575
575
  },
576
576
  },
577
577
  {
@@ -784,6 +784,7 @@ export const Jobs1: IBlock = {
784
784
  width: "100%",
785
785
  },
786
786
  "max-width": "256px",
787
+ "min-width": "0",
787
788
  },
788
789
  info_cards_levoGroup: {
789
790
  display: "flex",
@@ -839,6 +840,13 @@ export const Jobs1: IBlock = {
839
840
  items: [{}, {}, {}, {}],
840
841
  },
841
842
  ],
843
+ sidebar_embed: {
844
+ width: "100%",
845
+ "max-width": "100%",
846
+ "overflow-x": "hidden",
847
+ "overflow-y": "hidden",
848
+ height: "fit-content",
849
+ },
842
850
  social_section: {
843
851
  "padding-top": "xl",
844
852
  "border-top": "1px solid",
@@ -7,6 +7,7 @@ import {
7
7
  Form,
8
8
  Heading,
9
9
  Icon,
10
+ Iframe,
10
11
  Image,
11
12
  Section,
12
13
  Typography,
@@ -84,6 +85,8 @@ const Jobs1: React.FC<ILevoBlockBaseProps<IJobs1Content>> = ({ content }) => (
84
85
  </Box>
85
86
  ))}
86
87
  </Box>
88
+ {/* Sidebar Embed Widget */}
89
+ <Iframe elementKey="sidebar_embed" />
87
90
  {/* Social Media Icons */}
88
91
  <Box elementKey="social_section">
89
92
  <Heading elementKey="social_title" />
@@ -52,6 +52,7 @@ const Service2: React.FC<ILevoBlockBaseProps<IService2Content>> = ({ content, co
52
52
  </Box>
53
53
  <Box elementKey="search_input_wrapper">
54
54
  <input
55
+ aria-label="Search"
55
56
  value={zipcode}
56
57
  onChange={(e) => setZipcode(e.target.value)}
57
58
  name="search"
@@ -79,7 +79,10 @@ const Tab1: React.FC<ILevoBlockBaseProps<ITab1Content>> = ({ content }) => {
79
79
  >
80
80
  <AccordionTrigger elementKey={`tabs.${index}.faqs.${faqIndex}.trigger`}>
81
81
  <Box elementKey={`tabs.${index}.faqs.${faqIndex}.iconQuestionWrapper`}>
82
- <Icon elementKey={`tabs.${index}.faqs.${faqIndex}.triggerIcon`} />
82
+ <Icon
83
+ aria-label="FAQ icon"
84
+ elementKey={`tabs.${index}.faqs.${faqIndex}.triggerIcon`}
85
+ />
83
86
  <Heading elementKey={`tabs.${index}.faqs.${faqIndex}.question`} />
84
87
  </Box>
85
88
  </AccordionTrigger>