@opensite/ui 1.4.4 → 1.4.5
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/components.cjs +160 -54
- package/dist/components.js +160 -54
- package/dist/feature-bento-utilities.cjs +101 -87
- package/dist/feature-bento-utilities.js +101 -87
- package/dist/feature-checklist-three-column.cjs +75 -43
- package/dist/feature-checklist-three-column.js +75 -43
- package/dist/feature-image-overlay-badge.cjs +57 -10
- package/dist/feature-image-overlay-badge.js +57 -10
- package/dist/feature-integration-cards.cjs +105 -19
- package/dist/feature-integration-cards.js +105 -19
- package/dist/feature-utility-cards-grid.cjs +79 -9
- package/dist/feature-utility-cards-grid.js +79 -9
- package/dist/footer-animated-social.cjs +66 -10
- package/dist/footer-animated-social.d.cts +5 -1
- package/dist/footer-animated-social.d.ts +5 -1
- package/dist/footer-animated-social.js +66 -10
- package/dist/footer-contact-card.cjs +94 -44
- package/dist/footer-contact-card.d.cts +5 -1
- package/dist/footer-contact-card.d.ts +5 -1
- package/dist/footer-contact-card.js +94 -44
- package/dist/index.cjs +160 -54
- package/dist/index.js +160 -54
- package/dist/registry.cjs +486 -196
- package/dist/registry.js +486 -196
- package/package.json +1 -1
|
@@ -35,32 +35,6 @@ var SeparatorPrimitive__namespace = /*#__PURE__*/_interopNamespace(SeparatorPrim
|
|
|
35
35
|
function cn(...inputs) {
|
|
36
36
|
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
37
37
|
}
|
|
38
|
-
function getNestedCardBg(parentBg, variant = "muted", options) {
|
|
39
|
-
const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
|
|
40
|
-
if (isDark) {
|
|
41
|
-
switch (variant) {
|
|
42
|
-
case "muted":
|
|
43
|
-
return "bg-background";
|
|
44
|
-
case "card":
|
|
45
|
-
return "bg-card";
|
|
46
|
-
case "accent":
|
|
47
|
-
return "bg-accent";
|
|
48
|
-
case "subtle":
|
|
49
|
-
return "bg-background/50";
|
|
50
|
-
}
|
|
51
|
-
} else {
|
|
52
|
-
switch (variant) {
|
|
53
|
-
case "muted":
|
|
54
|
-
return "bg-muted";
|
|
55
|
-
case "card":
|
|
56
|
-
return "bg-card";
|
|
57
|
-
case "accent":
|
|
58
|
-
return "bg-accent";
|
|
59
|
-
case "subtle":
|
|
60
|
-
return "bg-muted/50";
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
38
|
function getTextColor(parentBg, variant = "default", options) {
|
|
65
39
|
const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
|
|
66
40
|
if (isDark) {
|
|
@@ -657,57 +631,63 @@ function FeatureBentoUtilities({
|
|
|
657
631
|
patternOpacity,
|
|
658
632
|
patternClassName
|
|
659
633
|
}) {
|
|
660
|
-
const renderCard = React__namespace.useCallback(
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
634
|
+
const renderCard = React__namespace.useCallback(
|
|
635
|
+
(card, index) => {
|
|
636
|
+
const hasImage = card.imageSrc || card.imageSlot;
|
|
637
|
+
const cardClasses = cn(
|
|
638
|
+
hasImage ? "overflow-hidden pt-0" : "p-6",
|
|
639
|
+
card.isDashed && "border-dashed bg-transparent shadow-none",
|
|
640
|
+
card.className
|
|
641
|
+
);
|
|
642
|
+
const renderImage = () => {
|
|
643
|
+
if (card.imageSlot) return card.imageSlot;
|
|
644
|
+
if (card.imageSrc) {
|
|
645
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
646
|
+
img.Img,
|
|
647
|
+
{
|
|
648
|
+
src: card.imageSrc,
|
|
649
|
+
alt: card.imageAlt || "",
|
|
650
|
+
className: "aspect-video w-full object-cover",
|
|
651
|
+
loading: "lazy",
|
|
652
|
+
optixFlowConfig
|
|
653
|
+
}
|
|
654
|
+
);
|
|
655
|
+
}
|
|
656
|
+
return null;
|
|
657
|
+
};
|
|
658
|
+
const renderTitle = () => {
|
|
659
|
+
if (!card.title) return null;
|
|
660
|
+
const titleContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
661
|
+
card.title,
|
|
662
|
+
card.showSparkle && /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/sparkles", size: 16 }),
|
|
663
|
+
card.badge && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "outline", children: card.badge })
|
|
664
|
+
] });
|
|
665
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-1 flex items-center gap-2 font-medium", children: titleContent });
|
|
666
|
+
};
|
|
667
|
+
if (hasImage) {
|
|
668
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: cardClasses, children: [
|
|
669
|
+
renderImage(),
|
|
670
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6", children: [
|
|
671
|
+
renderTitle(),
|
|
672
|
+
card.description && /* @__PURE__ */ jsxRuntime.jsx("p", { children: card.description })
|
|
673
|
+
] })
|
|
674
|
+
] }, index);
|
|
680
675
|
}
|
|
681
|
-
return null;
|
|
682
|
-
};
|
|
683
|
-
const renderTitle = () => {
|
|
684
|
-
if (!card.title) return null;
|
|
685
|
-
const titleContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
686
|
-
card.title,
|
|
687
|
-
card.showSparkle && /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/sparkles", size: 16 }),
|
|
688
|
-
card.badge && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "outline", children: card.badge })
|
|
689
|
-
] });
|
|
690
|
-
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-1 flex items-center gap-2 font-medium", children: titleContent });
|
|
691
|
-
};
|
|
692
|
-
if (hasImage) {
|
|
693
676
|
return /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: cardClasses, children: [
|
|
694
|
-
|
|
695
|
-
/* @__PURE__ */ jsxRuntime.
|
|
696
|
-
renderTitle(),
|
|
697
|
-
card.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: getTextColor(background, "muted"), children: card.description })
|
|
698
|
-
] })
|
|
677
|
+
renderTitle(),
|
|
678
|
+
card.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: getTextColor(background, "muted"), children: card.description })
|
|
699
679
|
] }, index);
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
680
|
+
},
|
|
681
|
+
[optixFlowConfig]
|
|
682
|
+
);
|
|
683
|
+
const renderColumn = React__namespace.useCallback(
|
|
684
|
+
(cards, slot) => {
|
|
685
|
+
if (slot) return slot;
|
|
686
|
+
if (!cards || cards.length === 0) return null;
|
|
687
|
+
return cards.map((card, index) => renderCard(card, index));
|
|
688
|
+
},
|
|
689
|
+
[renderCard]
|
|
690
|
+
);
|
|
711
691
|
const labelIconElement = React.useMemo(() => {
|
|
712
692
|
if (labelIcon) return labelIcon;
|
|
713
693
|
if (labelIconName) return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: labelIconName, size: 20 });
|
|
@@ -721,22 +701,56 @@ function FeatureBentoUtilities({
|
|
|
721
701
|
pattern,
|
|
722
702
|
patternOpacity,
|
|
723
703
|
patternClassName,
|
|
724
|
-
className
|
|
704
|
+
className,
|
|
725
705
|
containerClassName: cn("max-w-7xl", containerClassName),
|
|
726
706
|
children: [
|
|
727
|
-
(labelIconElement || label) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
707
|
+
(labelIconElement || label) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
708
|
+
"div",
|
|
709
|
+
{
|
|
710
|
+
className: cn(
|
|
711
|
+
"flex items-center gap-2",
|
|
712
|
+
getTextColor(background, "muted"),
|
|
713
|
+
labelClassName
|
|
714
|
+
),
|
|
715
|
+
children: [
|
|
716
|
+
labelIconElement,
|
|
717
|
+
label && (typeof label === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm", children: label }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm", children: label }))
|
|
718
|
+
]
|
|
719
|
+
}
|
|
720
|
+
),
|
|
731
721
|
/* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "mt-3 mb-8" }),
|
|
732
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
722
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
723
|
+
"div",
|
|
724
|
+
{
|
|
725
|
+
className: cn(
|
|
726
|
+
"flex flex-col justify-between gap-6 md:flex-row",
|
|
727
|
+
headerClassName
|
|
728
|
+
),
|
|
729
|
+
children: [
|
|
730
|
+
title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: cn("text-3xl font-medium md:w-1/2", titleClassName), children: title }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
731
|
+
"div",
|
|
732
|
+
{
|
|
733
|
+
className: cn("text-3xl font-medium md:w-1/2", titleClassName),
|
|
734
|
+
children: title
|
|
735
|
+
}
|
|
736
|
+
)),
|
|
737
|
+
description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("md:w-1/2", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("md:w-1/2", descriptionClassName), children: description }))
|
|
738
|
+
]
|
|
739
|
+
}
|
|
740
|
+
),
|
|
741
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
742
|
+
"div",
|
|
743
|
+
{
|
|
744
|
+
className: cn(
|
|
745
|
+
"mt-11 grid grid-cols-1 gap-6 md:grid-cols-2",
|
|
746
|
+
gridClassName
|
|
747
|
+
),
|
|
748
|
+
children: [
|
|
749
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col gap-6", columnClassName), children: renderColumn(leftColumnCards, leftColumnSlot) }),
|
|
750
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col gap-6", columnClassName), children: renderColumn(rightColumnCards, rightColumnSlot) })
|
|
751
|
+
]
|
|
752
|
+
}
|
|
753
|
+
)
|
|
740
754
|
]
|
|
741
755
|
}
|
|
742
756
|
);
|
|
@@ -13,32 +13,6 @@ import { Img } from '@page-speed/img';
|
|
|
13
13
|
function cn(...inputs) {
|
|
14
14
|
return twMerge(clsx(inputs));
|
|
15
15
|
}
|
|
16
|
-
function getNestedCardBg(parentBg, variant = "muted", options) {
|
|
17
|
-
const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
|
|
18
|
-
if (isDark) {
|
|
19
|
-
switch (variant) {
|
|
20
|
-
case "muted":
|
|
21
|
-
return "bg-background";
|
|
22
|
-
case "card":
|
|
23
|
-
return "bg-card";
|
|
24
|
-
case "accent":
|
|
25
|
-
return "bg-accent";
|
|
26
|
-
case "subtle":
|
|
27
|
-
return "bg-background/50";
|
|
28
|
-
}
|
|
29
|
-
} else {
|
|
30
|
-
switch (variant) {
|
|
31
|
-
case "muted":
|
|
32
|
-
return "bg-muted";
|
|
33
|
-
case "card":
|
|
34
|
-
return "bg-card";
|
|
35
|
-
case "accent":
|
|
36
|
-
return "bg-accent";
|
|
37
|
-
case "subtle":
|
|
38
|
-
return "bg-muted/50";
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
16
|
function getTextColor(parentBg, variant = "default", options) {
|
|
43
17
|
const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
|
|
44
18
|
if (isDark) {
|
|
@@ -635,57 +609,63 @@ function FeatureBentoUtilities({
|
|
|
635
609
|
patternOpacity,
|
|
636
610
|
patternClassName
|
|
637
611
|
}) {
|
|
638
|
-
const renderCard = React.useCallback(
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
612
|
+
const renderCard = React.useCallback(
|
|
613
|
+
(card, index) => {
|
|
614
|
+
const hasImage = card.imageSrc || card.imageSlot;
|
|
615
|
+
const cardClasses = cn(
|
|
616
|
+
hasImage ? "overflow-hidden pt-0" : "p-6",
|
|
617
|
+
card.isDashed && "border-dashed bg-transparent shadow-none",
|
|
618
|
+
card.className
|
|
619
|
+
);
|
|
620
|
+
const renderImage = () => {
|
|
621
|
+
if (card.imageSlot) return card.imageSlot;
|
|
622
|
+
if (card.imageSrc) {
|
|
623
|
+
return /* @__PURE__ */ jsx(
|
|
624
|
+
Img,
|
|
625
|
+
{
|
|
626
|
+
src: card.imageSrc,
|
|
627
|
+
alt: card.imageAlt || "",
|
|
628
|
+
className: "aspect-video w-full object-cover",
|
|
629
|
+
loading: "lazy",
|
|
630
|
+
optixFlowConfig
|
|
631
|
+
}
|
|
632
|
+
);
|
|
633
|
+
}
|
|
634
|
+
return null;
|
|
635
|
+
};
|
|
636
|
+
const renderTitle = () => {
|
|
637
|
+
if (!card.title) return null;
|
|
638
|
+
const titleContent = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
639
|
+
card.title,
|
|
640
|
+
card.showSparkle && /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/sparkles", size: 16 }),
|
|
641
|
+
card.badge && /* @__PURE__ */ jsx(Badge, { variant: "outline", children: card.badge })
|
|
642
|
+
] });
|
|
643
|
+
return /* @__PURE__ */ jsx("div", { className: "mb-1 flex items-center gap-2 font-medium", children: titleContent });
|
|
644
|
+
};
|
|
645
|
+
if (hasImage) {
|
|
646
|
+
return /* @__PURE__ */ jsxs(Card, { className: cardClasses, children: [
|
|
647
|
+
renderImage(),
|
|
648
|
+
/* @__PURE__ */ jsxs("div", { className: "p-6", children: [
|
|
649
|
+
renderTitle(),
|
|
650
|
+
card.description && /* @__PURE__ */ jsx("p", { children: card.description })
|
|
651
|
+
] })
|
|
652
|
+
] }, index);
|
|
658
653
|
}
|
|
659
|
-
return null;
|
|
660
|
-
};
|
|
661
|
-
const renderTitle = () => {
|
|
662
|
-
if (!card.title) return null;
|
|
663
|
-
const titleContent = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
664
|
-
card.title,
|
|
665
|
-
card.showSparkle && /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/sparkles", size: 16 }),
|
|
666
|
-
card.badge && /* @__PURE__ */ jsx(Badge, { variant: "outline", children: card.badge })
|
|
667
|
-
] });
|
|
668
|
-
return /* @__PURE__ */ jsx("div", { className: "mb-1 flex items-center gap-2 font-medium", children: titleContent });
|
|
669
|
-
};
|
|
670
|
-
if (hasImage) {
|
|
671
654
|
return /* @__PURE__ */ jsxs(Card, { className: cardClasses, children: [
|
|
672
|
-
|
|
673
|
-
/* @__PURE__ */
|
|
674
|
-
renderTitle(),
|
|
675
|
-
card.description && /* @__PURE__ */ jsx("p", { className: getTextColor(background, "muted"), children: card.description })
|
|
676
|
-
] })
|
|
655
|
+
renderTitle(),
|
|
656
|
+
card.description && /* @__PURE__ */ jsx("p", { className: getTextColor(background, "muted"), children: card.description })
|
|
677
657
|
] }, index);
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
658
|
+
},
|
|
659
|
+
[optixFlowConfig]
|
|
660
|
+
);
|
|
661
|
+
const renderColumn = React.useCallback(
|
|
662
|
+
(cards, slot) => {
|
|
663
|
+
if (slot) return slot;
|
|
664
|
+
if (!cards || cards.length === 0) return null;
|
|
665
|
+
return cards.map((card, index) => renderCard(card, index));
|
|
666
|
+
},
|
|
667
|
+
[renderCard]
|
|
668
|
+
);
|
|
689
669
|
const labelIconElement = useMemo(() => {
|
|
690
670
|
if (labelIcon) return labelIcon;
|
|
691
671
|
if (labelIconName) return /* @__PURE__ */ jsx(DynamicIcon, { name: labelIconName, size: 20 });
|
|
@@ -699,22 +679,56 @@ function FeatureBentoUtilities({
|
|
|
699
679
|
pattern,
|
|
700
680
|
patternOpacity,
|
|
701
681
|
patternClassName,
|
|
702
|
-
className
|
|
682
|
+
className,
|
|
703
683
|
containerClassName: cn("max-w-7xl", containerClassName),
|
|
704
684
|
children: [
|
|
705
|
-
(labelIconElement || label) && /* @__PURE__ */ jsxs(
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
685
|
+
(labelIconElement || label) && /* @__PURE__ */ jsxs(
|
|
686
|
+
"div",
|
|
687
|
+
{
|
|
688
|
+
className: cn(
|
|
689
|
+
"flex items-center gap-2",
|
|
690
|
+
getTextColor(background, "muted"),
|
|
691
|
+
labelClassName
|
|
692
|
+
),
|
|
693
|
+
children: [
|
|
694
|
+
labelIconElement,
|
|
695
|
+
label && (typeof label === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm", children: label }) : /* @__PURE__ */ jsx("div", { className: "text-sm", children: label }))
|
|
696
|
+
]
|
|
697
|
+
}
|
|
698
|
+
),
|
|
709
699
|
/* @__PURE__ */ jsx(Separator, { className: "mt-3 mb-8" }),
|
|
710
|
-
/* @__PURE__ */ jsxs(
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
700
|
+
/* @__PURE__ */ jsxs(
|
|
701
|
+
"div",
|
|
702
|
+
{
|
|
703
|
+
className: cn(
|
|
704
|
+
"flex flex-col justify-between gap-6 md:flex-row",
|
|
705
|
+
headerClassName
|
|
706
|
+
),
|
|
707
|
+
children: [
|
|
708
|
+
title && (typeof title === "string" ? /* @__PURE__ */ jsx("h2", { className: cn("text-3xl font-medium md:w-1/2", titleClassName), children: title }) : /* @__PURE__ */ jsx(
|
|
709
|
+
"div",
|
|
710
|
+
{
|
|
711
|
+
className: cn("text-3xl font-medium md:w-1/2", titleClassName),
|
|
712
|
+
children: title
|
|
713
|
+
}
|
|
714
|
+
)),
|
|
715
|
+
description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("md:w-1/2", descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: cn("md:w-1/2", descriptionClassName), children: description }))
|
|
716
|
+
]
|
|
717
|
+
}
|
|
718
|
+
),
|
|
719
|
+
/* @__PURE__ */ jsxs(
|
|
720
|
+
"div",
|
|
721
|
+
{
|
|
722
|
+
className: cn(
|
|
723
|
+
"mt-11 grid grid-cols-1 gap-6 md:grid-cols-2",
|
|
724
|
+
gridClassName
|
|
725
|
+
),
|
|
726
|
+
children: [
|
|
727
|
+
/* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-6", columnClassName), children: renderColumn(leftColumnCards, leftColumnSlot) }),
|
|
728
|
+
/* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-6", columnClassName), children: renderColumn(rightColumnCards, rightColumnSlot) })
|
|
729
|
+
]
|
|
730
|
+
}
|
|
731
|
+
)
|
|
718
732
|
]
|
|
719
733
|
}
|
|
720
734
|
);
|
|
@@ -200,6 +200,19 @@ function Badge({
|
|
|
200
200
|
}
|
|
201
201
|
);
|
|
202
202
|
}
|
|
203
|
+
function Card({ className, ...props }) {
|
|
204
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
205
|
+
"div",
|
|
206
|
+
{
|
|
207
|
+
"data-slot": "card",
|
|
208
|
+
className: cn(
|
|
209
|
+
"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
|
|
210
|
+
className
|
|
211
|
+
),
|
|
212
|
+
...props
|
|
213
|
+
}
|
|
214
|
+
);
|
|
215
|
+
}
|
|
203
216
|
function normalizePhoneNumber(input) {
|
|
204
217
|
const trimmed = input.trim();
|
|
205
218
|
if (trimmed.toLowerCase().startsWith("tel:")) {
|
|
@@ -1026,11 +1039,11 @@ function FeatureChecklistThreeColumn({
|
|
|
1026
1039
|
const renderChecklistColumn = React.useCallback((items, slot, gapClass) => {
|
|
1027
1040
|
if (slot) return slot;
|
|
1028
1041
|
if (!items || items.length === 0) return null;
|
|
1029
|
-
return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("flex flex-col",
|
|
1030
|
-
/* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/check", size:
|
|
1031
|
-
getCheckItemContent(item)
|
|
1042
|
+
return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("flex flex-col", gapClass, checklistClassName), children: items.map((item, index) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("flex items-start gap-3", getCheckItemClassName(item)), children: [
|
|
1043
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/check", size: 12, className: getAccentColor(background) }) }),
|
|
1044
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: getTextColor(background, "muted"), children: getCheckItemContent(item) })
|
|
1032
1045
|
] }, index)) });
|
|
1033
|
-
}, [checklistClassName, getCheckItemContent, getCheckItemClassName]);
|
|
1046
|
+
}, [checklistClassName, getCheckItemContent, getCheckItemClassName, background]);
|
|
1034
1047
|
const renderCardImage = React.useCallback((card) => {
|
|
1035
1048
|
if (card.imageSlot) return card.imageSlot;
|
|
1036
1049
|
if (card.image) {
|
|
@@ -1054,10 +1067,10 @@ function FeatureChecklistThreeColumn({
|
|
|
1054
1067
|
Pressable,
|
|
1055
1068
|
{
|
|
1056
1069
|
href: card.link,
|
|
1057
|
-
className: "
|
|
1070
|
+
className: "flex items-center gap-2 px-5 py-4 font-medium transition-opacity hover:opacity-80 md:px-6",
|
|
1058
1071
|
children: [
|
|
1059
1072
|
card.linkLabel || "Read more",
|
|
1060
|
-
/* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/
|
|
1073
|
+
/* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
|
|
1061
1074
|
]
|
|
1062
1075
|
}
|
|
1063
1076
|
);
|
|
@@ -1065,43 +1078,62 @@ function FeatureChecklistThreeColumn({
|
|
|
1065
1078
|
const cardsContent = React.useMemo(() => {
|
|
1066
1079
|
if (cardsSlot) return cardsSlot;
|
|
1067
1080
|
if (!cards || cards.length === 0) return null;
|
|
1068
|
-
return cards.map((card, index) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-3 px-4 pt-5 sm:px-5 md:px-6 md:pt-6", children: [
|
|
1082
|
-
card.title && (typeof card.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("font-medium", card.titleClassName), children: card.title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("font-medium", card.titleClassName), children: card.title })),
|
|
1083
|
-
card.description && (typeof card.description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn(getTextColor(background, "muted"), card.descriptionClassName), children: card.description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(getTextColor(background, "muted"), card.descriptionClassName), children: card.description }))
|
|
1084
|
-
] }),
|
|
1085
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px border-t border-dashed" }),
|
|
1086
|
-
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: getTextColor(background, "muted"), children: card.checklistItems?.map((item, itemIndex) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
|
|
1087
|
-
/* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("flex items-start gap-2 px-4 py-3 sm:px-5 md:px-6", getCheckItemClassName(item)), children: [
|
|
1088
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1089
|
-
DynamicIcon,
|
|
1081
|
+
return cards.map((card, index) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1082
|
+
Card,
|
|
1083
|
+
{
|
|
1084
|
+
className: cn(
|
|
1085
|
+
"overflow-hidden pt-0 transition-shadow duration-300 hover:shadow-lg",
|
|
1086
|
+
cardClassName,
|
|
1087
|
+
card.className
|
|
1088
|
+
),
|
|
1089
|
+
children: [
|
|
1090
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
|
|
1091
|
+
renderCardImage(card),
|
|
1092
|
+
card.badge && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1093
|
+
Badge,
|
|
1090
1094
|
{
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1095
|
+
variant: "outline",
|
|
1096
|
+
className: cn(
|
|
1097
|
+
"absolute top-4 left-4 bg-background/90 backdrop-blur-sm",
|
|
1098
|
+
card.badgeClassName
|
|
1099
|
+
),
|
|
1100
|
+
children: card.badge
|
|
1094
1101
|
}
|
|
1095
|
-
)
|
|
1096
|
-
getCheckItemContent(item)
|
|
1102
|
+
)
|
|
1097
1103
|
] }),
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1104
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
|
|
1105
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-5 py-5 md:px-6 md:py-6", children: [
|
|
1106
|
+
card.title && (typeof card.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("mb-2 text-lg font-semibold", card.titleClassName), children: card.title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mb-2 text-lg font-semibold", card.titleClassName), children: card.title })),
|
|
1107
|
+
card.description && (typeof card.description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-sm leading-relaxed", getTextColor(background, "muted"), card.descriptionClassName), children: card.description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-sm leading-relaxed", getTextColor(background, "muted"), card.descriptionClassName), children: card.description }))
|
|
1108
|
+
] }),
|
|
1109
|
+
card.checklistItems && card.checklistItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "border-t px-5 py-4 md:px-6", children: card.checklistItems.map((item, itemIndex) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1110
|
+
"li",
|
|
1111
|
+
{
|
|
1112
|
+
className: cn(
|
|
1113
|
+
"flex items-start gap-3 py-2",
|
|
1114
|
+
getCheckItemClassName(item)
|
|
1115
|
+
),
|
|
1116
|
+
children: [
|
|
1117
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
1118
|
+
DynamicIcon,
|
|
1119
|
+
{
|
|
1120
|
+
name: "lucide/check",
|
|
1121
|
+
size: 12,
|
|
1122
|
+
className: getAccentColor(background)
|
|
1123
|
+
}
|
|
1124
|
+
) }),
|
|
1125
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-sm", getTextColor(background, "muted")), children: getCheckItemContent(item) })
|
|
1126
|
+
]
|
|
1127
|
+
},
|
|
1128
|
+
itemIndex
|
|
1129
|
+
)) }),
|
|
1130
|
+
card.link && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "border-t", children: renderCardLink(card) })
|
|
1131
|
+
] })
|
|
1132
|
+
]
|
|
1133
|
+
},
|
|
1134
|
+
index
|
|
1135
|
+
));
|
|
1136
|
+
}, [cardsSlot, cards, cardClassName, renderCardImage, renderCardLink, getCheckItemContent, getCheckItemClassName, background]);
|
|
1105
1137
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1106
1138
|
Section,
|
|
1107
1139
|
{
|
|
@@ -1113,9 +1145,9 @@ function FeatureChecklistThreeColumn({
|
|
|
1113
1145
|
className,
|
|
1114
1146
|
containerClassName,
|
|
1115
1147
|
children: [
|
|
1116
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("grid gap-
|
|
1117
|
-
title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: cn("mb-
|
|
1118
|
-
renderChecklistColumn(checklistColumn1, checklistColumn1Slot, "gap-
|
|
1148
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("grid gap-6 sm:grid-cols-2 sm:gap-8 lg:grid-cols-3 lg:gap-12", headerGridClassName), children: [
|
|
1149
|
+
title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: cn("mb-2 text-2xl font-semibold text-balance sm:col-span-2 sm:text-3xl lg:col-span-1 lg:text-4xl", titleClassName), children: title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mb-2 text-2xl font-semibold text-balance sm:col-span-2 sm:text-3xl lg:col-span-1 lg:text-4xl", titleClassName), children: title })),
|
|
1150
|
+
renderChecklistColumn(checklistColumn1, checklistColumn1Slot, "gap-4"),
|
|
1119
1151
|
renderChecklistColumn(checklistColumn2, checklistColumn2Slot, "gap-4")
|
|
1120
1152
|
] }),
|
|
1121
1153
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mt-10 grid gap-6 sm:mt-16 md:grid-cols-2 lg:grid-cols-3", cardsGridClassName), children: cardsContent })
|