{"success":true,"data":{"block":{"id":"hero-ad-campaign-expert","name":"Ad Campaign Expert Hero","title":"Hero Ad Campaign Expert","category":"Hero","categorySlug":"hero","description":"A hero designed for advertising and marketing services. Features campaign metrics and expert positioning.","thumbnail":{"desktop":"https://cdn.ing/assets/i/r/293123/afk7snzbx99mmbhuury69o4movw8/cleanshot-2026-03-04-at-01-35-47.png","mobile":"https://cdn.ing/assets/i/r/293122/9b5nmu8ov4hcai28ll9bdc3wso7b/cleanshot-2026-03-04-at-01-36-02.png"},"componentPath":"blocks/hero/hero-ad-campaign-expert.tsx","code":"import { HeroAdCampaignExpert } from \"@opensite/ui/blocks/hero/hero-ad-campaign-expert\";\nimport { DynamicIcon } from \"@opensite/ui/components/dynamic-icon\";\n\nexport default function Demo() {\n  return (\n    <HeroAdCampaignExpert\n      heading=\"Your ad campaigns excel with AI-powered insights\"\n      description=\"Optimize your advertising performance with real-time analytics and automated campaign management. Deliver exceptional results across all platforms.\"\n      actions={[\n        {\n          label: \"Start Free Trial\",\n          href: \"#\",\n          variant: \"default\",\n          iconAfter: <DynamicIcon name=\"lucide/arrow-right\" size={16} />,\n        },\n      ]}\n      mediaItem={{\n        video: {\n          src: \"https://toastability-production.s3.amazonaws.com/c654ma8l6buzf82lngt5yq2fxoao\",\n          autoPlay: true,\n          loop: true,\n          muted: true,\n          playsInline: true,\n        },\n      }}\n      directionConfig={{ desktop: \"mediaLeft\", mobile: \"mediaTop\" }}\n      mediaAspectRatios={{ desktop: \"vertical\", mobile: \"vertical\" }}\n      pattern=\"diagonalCrossFadeTop\"\n      patternOpacity={1}\n      background=\"gray\"\n    />\n  );\n}","propsSchema":{"heading":{"type":"object","description":"Main heading content","typeLabel":"React.ReactNode","required":false},"description":{"type":"object","description":"Description text below heading","typeLabel":"React.ReactNode","required":false},"actions":{"type":"array","description":"Array of action configurations for CTA buttons","items":{"type":"object","description":"","fields":{"variant":{"type":"string","description":"","typeLabel":"\"default\" | \"destructive\" | \"outline\" | \"secondary\" | \"ghost\" | \"link\"","required":false},"size":{"type":"string","description":"","typeLabel":"\"default\" | \"sm\" | \"md\" | \"lg\" | \"icon\" | \"icon-sm\" | \"icon-lg\"","required":false},"label":{"type":"object","description":"Button/link label text or ReactNode","typeLabel":"ReactNode","required":false},"icon":{"type":"object","description":"Icon to display (typically before label)","typeLabel":"ReactNode","required":false},"iconAfter":{"type":"object","description":"Icon to display after the label","typeLabel":"ReactNode","required":false},"href":{"type":"string","description":"URL for link behavior","required":false},"onClick":{"type":"object","description":"Click handler for button behavior","typeLabel":"MouseEventHandler","required":false},"className":{"type":"string","description":"Additional CSS classes for the action","required":false},"children":{"type":"object","description":"Custom children (overrides label + icon rendering)","typeLabel":"ReactNode","required":false},"aria-label":{"type":"string","description":"ARIA label for accessibility","required":false},"asButton":{"type":"boolean","description":"Render as a button element instead of an anchor/link","required":false}},"typeLabel":"ActionConfig"},"typeLabel":"ActionConfig[]","required":false},"actionsSlot":{"type":"object","description":"Custom slot for rendering actions (overrides actions array)","typeLabel":"React.ReactNode","required":false},"actionsClassName":{"type":"string","description":"Additional CSS classes for the actions container","required":false},"mediaItem":{"type":"object","description":"Media item configuration for image and/or video rendering.\nReplaces individual imageSrc/imageAlt/imageClassName props.","fields":{"image":{"type":"object","description":"Image configuration using standard React img attributes.\nWhen both image and video are provided, image may serve as a poster/fallback.","typeLabel":"React.ComponentPropsWithoutRef","required":false},"video":{"type":"object","description":"Video configuration using","typeLabel":"React.ComponentPropsWithoutRef<\"video\"> & { /** * Direct HLS master playlist URL (skips transform call) */ masterPlaylistUrl?: string; /** * Fallback progressive MP4 URL if HLS fails */ fallbackSrc?: string; /** * OptixFlow API key for poster optimization */ optixFlowApiKey?: string; /** * Skin classes for custom controls (from @page-speed/skins) */ skinClasses?: { container?: string; video?: string; controlsBar?: string; playButton?: string; timeline?: string; timelineProgress?: string; timelineBuffered?: string; timeText?: string; volumeControl?: string; fullscreenButton?: string; settingsButton?: string; loadingSpinner?: string; playOverlay?: string; playOverlayButton?: string; }; /** * CSS custom properties from skin tokens */ skinStyle?: Record<string, string>; /** * Enable debug logging */ debug?: boolean; }","required":false},"containerClassName":{"type":"string","description":"Additional CSS classes for the media container element.","required":false}},"typeLabel":"MediaItem","required":false},"background":{"type":"string","description":"Background style for the section","typeLabel":"SectionBackground","required":false},"spacing":{"type":"object","description":"Vertical spacing for the section","fields":{},"typeLabel":"SectionSpacing","required":false},"pattern":{"type":"object","description":"Optional background pattern name","fields":{},"typeLabel":"PatternName","required":false},"patternOpacity":{"type":"number","description":"Pattern overlay opacity (0-1)","required":false},"className":{"type":"string","description":"Additional CSS classes for the section","required":false},"containerClassName":{"type":"string","description":"Additional CSS classes for the container","required":false},"contentClassName":{"type":"string","description":"Additional CSS classes for the content column","required":false},"headingClassName":{"type":"string","description":"Additional CSS classes for the heading","required":false},"descriptionClassName":{"type":"string","description":"Additional CSS classes for the description","required":false},"optixFlowConfig":{"type":"object","description":"OptixFlow image optimization configuration","fields":{"apiKey":{"type":"string","description":"API key for OptixFlow service","required":true},"compression":{"type":"number","description":"Compression level (0-100)","required":false}},"typeLabel":"OptixFlowConfig","required":false},"mediaAspectRatios":{"type":"object","description":"Media aspect ratios for desktop and mobile breakpoints","fields":{"desktop":{"type":"object","description":"","fields":{},"typeLabel":"MediaAspectRatioVariant","required":false},"mobile":{"type":"object","description":"","fields":{},"typeLabel":"MediaAspectRatioVariant","required":false}},"typeLabel":"ResponsiveMediaAspectRatioProps","required":false},"directionConfig":{"type":"object","description":"Direction configuration for desktop and mobile layouts","fields":{"desktop":{"type":"string","description":"","typeLabel":"\"mediaRight\" | \"mediaLeft\"","required":true},"mobile":{"type":"string","description":"","typeLabel":"\"mediaTop\" | \"mediaBottom\"","required":true}},"typeLabel":"DirectionConfig","required":false},"sectionId":{"type":"string","description":"Optional Section ID","required":false}},"defaultProps":{},"dependencies":["@opensite/ui"],"tags":["hero","ad","campaign","marketing","advertising","expert","metrics","agency"],"performance":{},"importantUsageNotes":"This block can take render an image or video dynamically based on the 'mediaItem' prop, check the prop schema carefully. Do not exceed 40 characters for the 'heading' prop. Do not exceed 130 characters for the 'description' prop. If you supply multiple 'actions', ensure to use a variant of 'default' for the first action, and 'outline' for the second action to ensure proper visual distinction between the two CTAs. Follow the example props closely for this block."}},"timestamp":"2026-05-13T10:43:04.331Z"}