@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.
- package/dist/cta-video-background-hero.cjs +9 -0
- package/dist/cta-video-background-hero.js +9 -0
- package/dist/hero-conversion-video-play.cjs +9 -0
- package/dist/hero-conversion-video-play.js +9 -0
- package/dist/hero-creative-studio-stacked.cjs +9 -0
- package/dist/hero-creative-studio-stacked.js +9 -0
- package/dist/hero-floating-images.cjs +153 -5
- package/dist/hero-floating-images.d.cts +47 -22
- package/dist/hero-floating-images.d.ts +47 -22
- package/dist/hero-floating-images.js +153 -5
- package/dist/hero-mentorship-video-split.cjs +9 -0
- package/dist/hero-mentorship-video-split.js +9 -0
- package/dist/hero-software-growth-video-dialog.cjs +9 -0
- package/dist/hero-software-growth-video-dialog.js +9 -0
- package/dist/hero-video-dialog-gradient.cjs +9 -0
- package/dist/hero-video-dialog-gradient.js +9 -0
- package/dist/link-page-bento-layout.cjs +2 -2
- package/dist/link-page-bento-layout.js +2 -2
- package/dist/link-page-grid-cards.cjs +2 -2
- package/dist/link-page-grid-cards.js +2 -2
- package/dist/link-page-minimal-profile.cjs +2 -2
- package/dist/link-page-minimal-profile.js +2 -2
- package/dist/link-page-newsletter-social.cjs +2 -2
- package/dist/link-page-newsletter-social.js +2 -2
- package/dist/link-tree-block.cjs +2 -2
- package/dist/link-tree-block.js +2 -2
- package/dist/registry.cjs +118 -15
- package/dist/registry.js +118 -15
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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-
|
|
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
|
|
614
|
-
|
|
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.
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
122
|
-
*
|
|
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,
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
122
|
-
*
|
|
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,
|
|
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 };
|