@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.
@@ -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((card, index) => {
661
- const hasImage = card.imageSrc || card.imageSlot;
662
- const cardClasses = cn(
663
- hasImage ? "overflow-hidden pt-0" : "p-6",
664
- card.isDashed && "border-dashed bg-transparent shadow-none",
665
- card.className
666
- );
667
- const renderImage = () => {
668
- if (card.imageSlot) return card.imageSlot;
669
- if (card.imageSrc) {
670
- return /* @__PURE__ */ jsxRuntime.jsx(
671
- img.Img,
672
- {
673
- src: card.imageSrc,
674
- alt: card.imageAlt || "",
675
- className: "aspect-video w-full object-cover",
676
- loading: "lazy",
677
- optixFlowConfig
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
- renderImage(),
695
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6", children: [
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
- return /* @__PURE__ */ jsxRuntime.jsxs(Card, { className: cardClasses, children: [
702
- renderTitle(),
703
- card.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: getTextColor(background, "muted"), children: card.description })
704
- ] }, index);
705
- }, [optixFlowConfig]);
706
- const renderColumn = React__namespace.useCallback((cards, slot) => {
707
- if (slot) return slot;
708
- if (!cards || cards.length === 0) return null;
709
- return cards.map((card, index) => renderCard(card, index));
710
- }, [renderCard]);
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: cn(getNestedCardBg(background, "muted"), className),
704
+ className,
725
705
  containerClassName: cn("max-w-7xl", containerClassName),
726
706
  children: [
727
- (labelIconElement || label) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center gap-2", getTextColor(background, "muted"), labelClassName), children: [
728
- labelIconElement,
729
- label && (typeof label === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm", children: label }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm", children: label }))
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("div", { className: cn("flex flex-col justify-between gap-6 md:flex-row", headerClassName), children: [
733
- title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: cn("text-3xl font-medium md:w-1/2", titleClassName), children: title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-3xl font-medium md:w-1/2", titleClassName), children: title })),
734
- 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 }))
735
- ] }),
736
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mt-11 flex flex-col gap-6 md:flex-row", gridClassName), children: [
737
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex w-full flex-col gap-6", columnClassName), children: renderColumn(leftColumnCards, leftColumnSlot) }),
738
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex w-full flex-col gap-6", columnClassName), children: renderColumn(rightColumnCards, rightColumnSlot) })
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((card, index) => {
639
- const hasImage = card.imageSrc || card.imageSlot;
640
- const cardClasses = cn(
641
- hasImage ? "overflow-hidden pt-0" : "p-6",
642
- card.isDashed && "border-dashed bg-transparent shadow-none",
643
- card.className
644
- );
645
- const renderImage = () => {
646
- if (card.imageSlot) return card.imageSlot;
647
- if (card.imageSrc) {
648
- return /* @__PURE__ */ jsx(
649
- Img,
650
- {
651
- src: card.imageSrc,
652
- alt: card.imageAlt || "",
653
- className: "aspect-video w-full object-cover",
654
- loading: "lazy",
655
- optixFlowConfig
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
- renderImage(),
673
- /* @__PURE__ */ jsxs("div", { className: "p-6", children: [
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
- return /* @__PURE__ */ jsxs(Card, { className: cardClasses, children: [
680
- renderTitle(),
681
- card.description && /* @__PURE__ */ jsx("p", { className: getTextColor(background, "muted"), children: card.description })
682
- ] }, index);
683
- }, [optixFlowConfig]);
684
- const renderColumn = React.useCallback((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
- }, [renderCard]);
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: cn(getNestedCardBg(background, "muted"), className),
682
+ className,
703
683
  containerClassName: cn("max-w-7xl", containerClassName),
704
684
  children: [
705
- (labelIconElement || label) && /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2", getTextColor(background, "muted"), labelClassName), children: [
706
- labelIconElement,
707
- label && (typeof label === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm", children: label }) : /* @__PURE__ */ jsx("div", { className: "text-sm", children: label }))
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("div", { className: cn("flex flex-col justify-between gap-6 md:flex-row", headerClassName), children: [
711
- title && (typeof title === "string" ? /* @__PURE__ */ jsx("h2", { className: cn("text-3xl font-medium md:w-1/2", titleClassName), children: title }) : /* @__PURE__ */ jsx("div", { className: cn("text-3xl font-medium md:w-1/2", titleClassName), children: title })),
712
- 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 }))
713
- ] }),
714
- /* @__PURE__ */ jsxs("div", { className: cn("mt-11 flex flex-col gap-6 md:flex-row", gridClassName), children: [
715
- /* @__PURE__ */ jsx("div", { className: cn("flex w-full flex-col gap-6", columnClassName), children: renderColumn(leftColumnCards, leftColumnSlot) }),
716
- /* @__PURE__ */ jsx("div", { className: cn("flex w-full flex-col gap-6", columnClassName), children: renderColumn(rightColumnCards, rightColumnSlot) })
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", getTextColor(background, "muted"), gapClass, checklistClassName), children: items.map((item, index) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("flex items-center gap-2", getCheckItemClassName(item)), children: [
1030
- /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/check", size: 16, className: getAccentColor(background) }),
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: "my-3 flex items-center gap-2 px-4 font-medium sm:my-4 sm:px-5 md:px-6",
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/chevron-right", size: 16, className: "mt-0.5" })
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("div", { className: cn("rounded-lg border", cardClassName, card.className), children: [
1069
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative p-1", children: [
1070
- renderCardImage(card),
1071
- card.badge && /* @__PURE__ */ jsxRuntime.jsx(
1072
- Badge,
1073
- {
1074
- variant: "outline",
1075
- className: cn("absolute top-5 left-5 bg-background", card.badgeClassName),
1076
- children: card.badge
1077
- }
1078
- )
1079
- ] }),
1080
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
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
- name: "lucide/check",
1092
- size: 16,
1093
- className: cn("mt-1 shrink-0", getAccentColor(background))
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
- card.checklistItems && itemIndex < card.checklistItems.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px border-t border-dashed" })
1099
- ] }, itemIndex)) }),
1100
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px border-t border-dashed" }),
1101
- renderCardLink(card)
1102
- ] })
1103
- ] }, index));
1104
- }, [cardsSlot, cards, cardClassName, renderCardImage, renderCardLink, getCheckItemContent, getCheckItemClassName]);
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-4 sm:grid-cols-2 sm:gap-8 md:gap-12 lg:grid-cols-3 lg:gap-16", headerGridClassName), children: [
1117
- title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: cn("mb-4 text-3xl font-medium sm:col-span-2 sm:text-4xl md:mb-0 lg:col-span-1", titleClassName), children: title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mb-4 text-3xl font-medium sm:col-span-2 sm:text-4xl md:mb-0 lg:col-span-1", titleClassName), children: title })),
1118
- renderChecklistColumn(checklistColumn1, checklistColumn1Slot, "gap-3 sm:gap-4"),
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 })