@opensite/ui 3.3.6 → 3.3.8

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.
@@ -453,10 +453,19 @@ function CtaVideoBackgroundHero({
453
453
  const [skinClasses, setSkinClasses] = React.useState(null);
454
454
  const [skinStyle, setSkinStyle] = React.useState(null);
455
455
  React.useEffect(() => {
456
+ let isMounted = true;
456
457
  skins.loadSkinFromJsDelivr("0.1.2", "skins/video/base.json").then((skin) => {
458
+ if (!isMounted) return;
457
459
  setSkinClasses(skins.resolveVideoClasses(skin));
458
460
  setSkinStyle(skins.getSkinStyleObject(skin));
461
+ }).catch(() => {
462
+ if (!isMounted) return;
463
+ setSkinClasses(null);
464
+ setSkinStyle(null);
459
465
  });
466
+ return () => {
467
+ isMounted = false;
468
+ };
460
469
  }, []);
461
470
  const handleOpenModal = () => {
462
471
  setIsModalOpen(true);
@@ -432,10 +432,19 @@ function CtaVideoBackgroundHero({
432
432
  const [skinClasses, setSkinClasses] = useState(null);
433
433
  const [skinStyle, setSkinStyle] = useState(null);
434
434
  useEffect(() => {
435
+ let isMounted = true;
435
436
  loadSkinFromJsDelivr("0.1.2", "skins/video/base.json").then((skin) => {
437
+ if (!isMounted) return;
436
438
  setSkinClasses(resolveVideoClasses(skin));
437
439
  setSkinStyle(getSkinStyleObject(skin));
440
+ }).catch(() => {
441
+ if (!isMounted) return;
442
+ setSkinClasses(null);
443
+ setSkinStyle(null);
438
444
  });
445
+ return () => {
446
+ isMounted = false;
447
+ };
439
448
  }, []);
440
449
  const handleOpenModal = () => {
441
450
  setIsModalOpen(true);
@@ -684,10 +684,19 @@ function HeroConversionVideoPlay({
684
684
  const [skinClasses, setSkinClasses] = React2.useState(null);
685
685
  const [skinStyle, setSkinStyle] = React2.useState(null);
686
686
  React2.useEffect(() => {
687
+ let isMounted = true;
687
688
  skins.loadSkinFromJsDelivr("0.1.2", "skins/video/base.json").then((skin) => {
689
+ if (!isMounted) return;
688
690
  setSkinClasses(skins.resolveVideoClasses(skin));
689
691
  setSkinStyle(skins.getSkinStyleObject(skin));
692
+ }).catch(() => {
693
+ if (!isMounted) return;
694
+ setSkinClasses(null);
695
+ setSkinStyle(null);
690
696
  });
697
+ return () => {
698
+ isMounted = false;
699
+ };
691
700
  }, []);
692
701
  const renderActions = React2.useMemo(() => {
693
702
  if (actionsSlot) return actionsSlot;
@@ -657,10 +657,19 @@ function HeroConversionVideoPlay({
657
657
  const [skinClasses, setSkinClasses] = useState(null);
658
658
  const [skinStyle, setSkinStyle] = useState(null);
659
659
  useEffect(() => {
660
+ let isMounted = true;
660
661
  loadSkinFromJsDelivr("0.1.2", "skins/video/base.json").then((skin) => {
662
+ if (!isMounted) return;
661
663
  setSkinClasses(resolveVideoClasses(skin));
662
664
  setSkinStyle(getSkinStyleObject(skin));
665
+ }).catch(() => {
666
+ if (!isMounted) return;
667
+ setSkinClasses(null);
668
+ setSkinStyle(null);
663
669
  });
670
+ return () => {
671
+ isMounted = false;
672
+ };
664
673
  }, []);
665
674
  const renderActions = useMemo(() => {
666
675
  if (actionsSlot) return actionsSlot;
@@ -576,10 +576,19 @@ function HeroCreativeStudioStacked({
576
576
  const [skinClasses, setSkinClasses] = React.useState(null);
577
577
  const [skinStyle, setSkinStyle] = React.useState(null);
578
578
  React.useEffect(() => {
579
+ let isMounted = true;
579
580
  skins.loadSkinFromJsDelivr("0.1.2", "skins/video/base.json").then((skin) => {
581
+ if (!isMounted) return;
580
582
  setSkinClasses(skins.resolveVideoClasses(skin));
581
583
  setSkinStyle(skins.getSkinStyleObject(skin));
584
+ }).catch(() => {
585
+ if (!isMounted) return;
586
+ setSkinClasses(null);
587
+ setSkinStyle(null);
582
588
  });
589
+ return () => {
590
+ isMounted = false;
591
+ };
583
592
  }, []);
584
593
  const handleVideoClick = () => {
585
594
  if (onVideoClick) {
@@ -553,10 +553,19 @@ function HeroCreativeStudioStacked({
553
553
  const [skinClasses, setSkinClasses] = useState(null);
554
554
  const [skinStyle, setSkinStyle] = useState(null);
555
555
  useEffect(() => {
556
+ let isMounted = true;
556
557
  loadSkinFromJsDelivr("0.1.2", "skins/video/base.json").then((skin) => {
558
+ if (!isMounted) return;
557
559
  setSkinClasses(resolveVideoClasses(skin));
558
560
  setSkinStyle(getSkinStyleObject(skin));
561
+ }).catch(() => {
562
+ if (!isMounted) return;
563
+ setSkinClasses(null);
564
+ setSkinStyle(null);
559
565
  });
566
+ return () => {
567
+ isMounted = false;
568
+ };
560
569
  }, []);
561
570
  const handleVideoClick = () => {
562
571
  if (onVideoClick) {
@@ -8,6 +8,9 @@ var img = require('@page-speed/img');
8
8
  var lightbox = require('@page-speed/lightbox');
9
9
  var jsxRuntime = require('react/jsx-runtime');
10
10
  var icon = require('@page-speed/icon');
11
+ var reactSlot = require('@radix-ui/react-slot');
12
+ var classVarianceAuthority = require('class-variance-authority');
13
+ var pressable = require('@page-speed/pressable');
11
14
 
12
15
  function _interopNamespace(e) {
13
16
  if (e && e.__esModule) return e;
@@ -422,9 +425,110 @@ var DynamicIcon = React__namespace.memo(function DynamicIcon2({
422
425
  return /* @__PURE__ */ jsxRuntime.jsx(icon.Icon, { ...props, name, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
423
426
  });
424
427
  DynamicIcon.displayName = "DynamicIcon";
428
+ var badgeVariants = classVarianceAuthority.cva(
429
+ "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
430
+ {
431
+ variants: {
432
+ variant: {
433
+ default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
434
+ secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
435
+ destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
436
+ outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
437
+ }
438
+ },
439
+ defaultVariants: {
440
+ variant: "default"
441
+ }
442
+ }
443
+ );
444
+ function Badge({
445
+ className,
446
+ variant,
447
+ asChild = false,
448
+ ...props
449
+ }) {
450
+ const Comp = asChild ? reactSlot.Slot : "span";
451
+ return /* @__PURE__ */ jsxRuntime.jsx(
452
+ Comp,
453
+ {
454
+ "data-slot": "badge",
455
+ className: cn(badgeVariants({ variant }), className),
456
+ ...props
457
+ }
458
+ );
459
+ }
460
+ var MOBILE_CLASSES = {
461
+ "fit-left": "items-start md:items-center",
462
+ "fit-center": "items-center",
463
+ "fit-right": "items-end md:items-center",
464
+ "full-left": "items-stretch md:items-center",
465
+ "full-center": "items-stretch md:items-center",
466
+ "full-right": "items-stretch md:items-center"
467
+ };
468
+ function BlockActions({
469
+ mobileConfig,
470
+ actionsClassName,
471
+ verticalSpacing = "mt-4 md:mt-8",
472
+ actions,
473
+ actionsSlot
474
+ }) {
475
+ const width = mobileConfig?.width ?? "full";
476
+ const position = mobileConfig?.position ?? "center";
477
+ const mobileLayoutClass = MOBILE_CLASSES[`${width}-${position}`];
478
+ if (actionsSlot) {
479
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { children: actionsSlot });
480
+ } else if (actions && actions?.length > 0) {
481
+ return /* @__PURE__ */ jsxRuntime.jsx(
482
+ "div",
483
+ {
484
+ className: cn(
485
+ "flex flex-col md:flex-row flex-wrap gap-4",
486
+ mobileLayoutClass,
487
+ actionsClassName,
488
+ verticalSpacing
489
+ ),
490
+ children: actions.map((action, index) => /* @__PURE__ */ jsxRuntime.jsx(ActionComponent, { action }, index))
491
+ }
492
+ );
493
+ } else {
494
+ return null;
495
+ }
496
+ }
497
+ function ActionComponent({ action }) {
498
+ const {
499
+ label,
500
+ icon,
501
+ iconAfter,
502
+ children,
503
+ href,
504
+ onClick,
505
+ className: actionClassName,
506
+ ...pressableProps
507
+ } = action;
508
+ return /* @__PURE__ */ jsxRuntime.jsx(
509
+ pressable.Pressable,
510
+ {
511
+ href,
512
+ onClick,
513
+ asButton: action.asButton ?? true,
514
+ className: actionClassName,
515
+ ...pressableProps,
516
+ children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
517
+ icon,
518
+ label,
519
+ iconAfter
520
+ ] })
521
+ }
522
+ );
523
+ }
425
524
  function HeroFloatingImages({
426
525
  sectionId = "hero-floating-images",
427
- children,
526
+ badge,
527
+ badgeIcon,
528
+ heading,
529
+ description,
530
+ actions,
531
+ actionsSlot,
428
532
  images,
429
533
  imagesSlot,
430
534
  zoomIconName = "lucide/zoom-in",
@@ -435,6 +539,10 @@ function HeroFloatingImages({
435
539
  className,
436
540
  gridClassName,
437
541
  contentClassName,
542
+ badgeClassName,
543
+ headingClassName,
544
+ descriptionClassName,
545
+ actionsClassName,
438
546
  galleryClassName,
439
547
  featuredImageClassName,
440
548
  secondaryImageClassName,
@@ -492,7 +600,7 @@ function HeroFloatingImages({
492
600
  "absolute inset-0 flex items-center justify-center opacity-0 transition-opacity group-hover:opacity-100",
493
601
  zoomIndicatorClassName
494
602
  ),
495
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full bg-background/90 shadow-lg", children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: zoomIconName, size: 20 }) })
603
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-lg", children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: zoomIconName, size: 20 }) })
496
604
  }
497
605
  ),
498
606
  [zoomIconName, zoomIndicatorClassName]
@@ -610,8 +718,10 @@ function HeroFloatingImages({
610
718
  secondaryImagesContent
611
719
  ]);
612
720
  const hasContent = React.useMemo(() => {
613
- return children !== void 0 && children !== null;
614
- }, [children]);
721
+ return Boolean(
722
+ badge || badgeIcon || heading || description || actionsSlot || actions && actions.length > 0
723
+ );
724
+ }, [actions, actionsSlot, badge, badgeIcon, description, heading]);
615
725
  const hasGallery = React.useMemo(() => {
616
726
  return imagesSlot || images && images.length > 0;
617
727
  }, [imagesSlot, images]);
@@ -634,7 +744,45 @@ function HeroFloatingImages({
634
744
  gridClassName
635
745
  ),
636
746
  children: [
637
- hasContent ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col justify-center", contentClassName), children }) : null,
747
+ hasContent ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col justify-center", contentClassName), children: [
748
+ badge && /* @__PURE__ */ jsxRuntime.jsxs(
749
+ Badge,
750
+ {
751
+ variant: "secondary",
752
+ className: cn("mb-6 w-fit", badgeClassName),
753
+ children: [
754
+ badge,
755
+ badgeIcon
756
+ ]
757
+ }
758
+ ),
759
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
760
+ "h1",
761
+ {
762
+ className: cn(
763
+ "mb-6 text-4xl font-bold tracking-tight sm:text-5xl md:text-6xl",
764
+ headingClassName
765
+ ),
766
+ children: heading
767
+ }
768
+ ) : heading),
769
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
770
+ "p",
771
+ {
772
+ className: cn("mb-8 max-w-lg text-lg", descriptionClassName),
773
+ children: description
774
+ }
775
+ ) : description),
776
+ /* @__PURE__ */ jsxRuntime.jsx(
777
+ BlockActions,
778
+ {
779
+ actions,
780
+ actionsSlot,
781
+ actionsClassName,
782
+ verticalSpacing: description ? "mt-0" : void 0
783
+ }
784
+ )
785
+ ] }) : null,
638
786
  hasGallery ? galleryContent : null
639
787
  ]
640
788
  }
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { S as SectionBackground, s as SectionSpacing, t as PatternName } from './community-initiatives-Cgd-IXlI.cjs';
3
- import { O as OptixFlowConfig } from './blocks-DyouPohq.cjs';
3
+ import { A as ActionConfig, O as OptixFlowConfig } from './blocks-DyouPohq.cjs';
4
4
  import 'react/jsx-runtime';
5
5
  import 'class-variance-authority';
6
6
  import '@page-speed/pressable';
@@ -30,11 +30,29 @@ interface HeroFloatingImagesImage {
30
30
  }
31
31
  interface HeroFloatingImagesProps {
32
32
  /**
33
- * Flexible content slot for the left side of the hero.
34
- * Renders any content the application/AI builder provides (badges, headings, descriptions, actions, etc.)
35
- * This allows maximum flexibility without prescribing specific content structure.
33
+ * Badge content displayed above the heading
36
34
  */
37
- children?: React.ReactNode;
35
+ badge?: React.ReactNode;
36
+ /**
37
+ * Badge icon
38
+ */
39
+ badgeIcon?: React.ReactNode;
40
+ /**
41
+ * Main heading content
42
+ */
43
+ heading?: React.ReactNode;
44
+ /**
45
+ * Description text below heading
46
+ */
47
+ description?: React.ReactNode;
48
+ /**
49
+ * Array of action configurations for CTA buttons
50
+ */
51
+ actions?: ActionConfig[];
52
+ /**
53
+ * Custom slot for rendering actions (overrides actions array)
54
+ */
55
+ actionsSlot?: React.ReactNode;
38
56
  /**
39
57
  * Array of images for the gallery section.
40
58
  * First image with `featured: true` (or first image if none marked) displays as the tall featured image.
@@ -88,6 +106,22 @@ interface HeroFloatingImagesProps {
88
106
  * Additional CSS classes for the content area (left side)
89
107
  */
90
108
  contentClassName?: string;
109
+ /**
110
+ * Additional CSS classes for the badge
111
+ */
112
+ badgeClassName?: string;
113
+ /**
114
+ * Additional CSS classes for the heading
115
+ */
116
+ headingClassName?: string;
117
+ /**
118
+ * Additional CSS classes for the description
119
+ */
120
+ descriptionClassName?: string;
121
+ /**
122
+ * Additional CSS classes for the actions container
123
+ */
124
+ actionsClassName?: string;
91
125
  /**
92
126
  * Additional CSS classes for the gallery container (right side)
93
127
  */
@@ -118,34 +152,25 @@ interface HeroFloatingImagesProps {
118
152
  /**
119
153
  * HeroFloatingImages - A split-layout hero with flexible content and an interactive image gallery.
120
154
  *
121
- * Features a two-column layout: content on the left (fully customizable via children prop)
122
- * and a gallery on the right with a featured tall image and stacked secondary images.
155
+ * Features a two-column layout: named hero content on the left and a gallery on the right
156
+ * with a featured tall image and stacked secondary images.
123
157
  * Each image has a hover effect with zoom indicator and opens in a lightbox when clicked.
124
158
  *
125
- * The component uses the children prop pattern for maximum flexibility - the application
126
- * or AI builder can render any content structure without being constrained to specific
127
- * heading/description/badge props.
128
- *
129
159
  * @example
130
160
  * ```tsx
131
161
  * <HeroFloatingImages
162
+ * badge="Featured Work"
163
+ * heading="Your Headline Here"
164
+ * description="Your description..."
165
+ * actions={[{ label: "View Portfolio", href: "/portfolio", variant: "default" }]}
132
166
  * images={[
133
167
  * { src: "/featured.jpg", alt: "Featured work", featured: true },
134
168
  * { src: "/work-1.jpg", alt: "Project 1" },
135
169
  * { src: "/work-2.jpg", alt: "Project 2" },
136
170
  * ]}
137
- * >
138
- * <Badge className="mb-6 w-fit" variant="secondary">Featured Work</Badge>
139
- * <h1 className="mb-6 text-4xl font-bold">Your Headline Here</h1>
140
- * <p className="mb-8 text-lg text-muted-foreground">Your description...</p>
141
- * <div className="flex gap-4">
142
- * <Pressable href="/portfolio" variant="default" size="lg" asButton>
143
- * View Portfolio
144
- * </Pressable>
145
- * </div>
146
- * </HeroFloatingImages>
171
+ * />
147
172
  * ```
148
173
  */
149
- declare function HeroFloatingImages({ sectionId, children, images, imagesSlot, zoomIconName, enableLightbox, background, pattern, patternOpacity, className, gridClassName, contentClassName, galleryClassName, featuredImageClassName, secondaryImageClassName, imageClassName, zoomIndicatorClassName, optixFlowConfig, containerClassName, spacing, }: HeroFloatingImagesProps): React.JSX.Element;
174
+ declare function HeroFloatingImages({ sectionId, badge, badgeIcon, heading, description, actions, actionsSlot, images, imagesSlot, zoomIconName, enableLightbox, background, pattern, patternOpacity, className, gridClassName, contentClassName, badgeClassName, headingClassName, descriptionClassName, actionsClassName, galleryClassName, featuredImageClassName, secondaryImageClassName, imageClassName, zoomIndicatorClassName, optixFlowConfig, containerClassName, spacing, }: HeroFloatingImagesProps): React.JSX.Element;
150
175
 
151
176
  export { HeroFloatingImages, type HeroFloatingImagesProps };
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { S as SectionBackground, s as SectionSpacing, t as PatternName } from './community-initiatives-Dud0DKXB.js';
3
- import { O as OptixFlowConfig } from './blocks-DyouPohq.js';
3
+ import { A as ActionConfig, O as OptixFlowConfig } from './blocks-DyouPohq.js';
4
4
  import 'react/jsx-runtime';
5
5
  import 'class-variance-authority';
6
6
  import '@page-speed/pressable';
@@ -30,11 +30,29 @@ interface HeroFloatingImagesImage {
30
30
  }
31
31
  interface HeroFloatingImagesProps {
32
32
  /**
33
- * Flexible content slot for the left side of the hero.
34
- * Renders any content the application/AI builder provides (badges, headings, descriptions, actions, etc.)
35
- * This allows maximum flexibility without prescribing specific content structure.
33
+ * Badge content displayed above the heading
36
34
  */
37
- children?: React.ReactNode;
35
+ badge?: React.ReactNode;
36
+ /**
37
+ * Badge icon
38
+ */
39
+ badgeIcon?: React.ReactNode;
40
+ /**
41
+ * Main heading content
42
+ */
43
+ heading?: React.ReactNode;
44
+ /**
45
+ * Description text below heading
46
+ */
47
+ description?: React.ReactNode;
48
+ /**
49
+ * Array of action configurations for CTA buttons
50
+ */
51
+ actions?: ActionConfig[];
52
+ /**
53
+ * Custom slot for rendering actions (overrides actions array)
54
+ */
55
+ actionsSlot?: React.ReactNode;
38
56
  /**
39
57
  * Array of images for the gallery section.
40
58
  * First image with `featured: true` (or first image if none marked) displays as the tall featured image.
@@ -88,6 +106,22 @@ interface HeroFloatingImagesProps {
88
106
  * Additional CSS classes for the content area (left side)
89
107
  */
90
108
  contentClassName?: string;
109
+ /**
110
+ * Additional CSS classes for the badge
111
+ */
112
+ badgeClassName?: string;
113
+ /**
114
+ * Additional CSS classes for the heading
115
+ */
116
+ headingClassName?: string;
117
+ /**
118
+ * Additional CSS classes for the description
119
+ */
120
+ descriptionClassName?: string;
121
+ /**
122
+ * Additional CSS classes for the actions container
123
+ */
124
+ actionsClassName?: string;
91
125
  /**
92
126
  * Additional CSS classes for the gallery container (right side)
93
127
  */
@@ -118,34 +152,25 @@ interface HeroFloatingImagesProps {
118
152
  /**
119
153
  * HeroFloatingImages - A split-layout hero with flexible content and an interactive image gallery.
120
154
  *
121
- * Features a two-column layout: content on the left (fully customizable via children prop)
122
- * and a gallery on the right with a featured tall image and stacked secondary images.
155
+ * Features a two-column layout: named hero content on the left and a gallery on the right
156
+ * with a featured tall image and stacked secondary images.
123
157
  * Each image has a hover effect with zoom indicator and opens in a lightbox when clicked.
124
158
  *
125
- * The component uses the children prop pattern for maximum flexibility - the application
126
- * or AI builder can render any content structure without being constrained to specific
127
- * heading/description/badge props.
128
- *
129
159
  * @example
130
160
  * ```tsx
131
161
  * <HeroFloatingImages
162
+ * badge="Featured Work"
163
+ * heading="Your Headline Here"
164
+ * description="Your description..."
165
+ * actions={[{ label: "View Portfolio", href: "/portfolio", variant: "default" }]}
132
166
  * images={[
133
167
  * { src: "/featured.jpg", alt: "Featured work", featured: true },
134
168
  * { src: "/work-1.jpg", alt: "Project 1" },
135
169
  * { src: "/work-2.jpg", alt: "Project 2" },
136
170
  * ]}
137
- * >
138
- * <Badge className="mb-6 w-fit" variant="secondary">Featured Work</Badge>
139
- * <h1 className="mb-6 text-4xl font-bold">Your Headline Here</h1>
140
- * <p className="mb-8 text-lg text-muted-foreground">Your description...</p>
141
- * <div className="flex gap-4">
142
- * <Pressable href="/portfolio" variant="default" size="lg" asButton>
143
- * View Portfolio
144
- * </Pressable>
145
- * </div>
146
- * </HeroFloatingImages>
171
+ * />
147
172
  * ```
148
173
  */
149
- declare function HeroFloatingImages({ sectionId, children, images, imagesSlot, zoomIconName, enableLightbox, background, pattern, patternOpacity, className, gridClassName, contentClassName, galleryClassName, featuredImageClassName, secondaryImageClassName, imageClassName, zoomIndicatorClassName, optixFlowConfig, containerClassName, spacing, }: HeroFloatingImagesProps): React.JSX.Element;
174
+ declare function HeroFloatingImages({ sectionId, badge, badgeIcon, heading, description, actions, actionsSlot, images, imagesSlot, zoomIconName, enableLightbox, background, pattern, patternOpacity, className, gridClassName, contentClassName, badgeClassName, headingClassName, descriptionClassName, actionsClassName, galleryClassName, featuredImageClassName, secondaryImageClassName, imageClassName, zoomIndicatorClassName, optixFlowConfig, containerClassName, spacing, }: HeroFloatingImagesProps): React.JSX.Element;
150
175
 
151
176
  export { HeroFloatingImages, type HeroFloatingImagesProps };