@opensite/ui 0.8.1 → 0.8.2

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.
Files changed (83) hide show
  1. package/dist/carousel-horizontal-cards.cjs +8 -6
  2. package/dist/carousel-horizontal-cards.js +8 -6
  3. package/dist/carousel-image-hero.cjs +85 -160
  4. package/dist/carousel-image-hero.d.cts +1 -5
  5. package/dist/carousel-image-hero.d.ts +1 -5
  6. package/dist/carousel-image-hero.js +85 -160
  7. package/dist/carousel-portfolio-hero.cjs +138 -59
  8. package/dist/carousel-portfolio-hero.js +138 -59
  9. package/dist/carousel-product-feature-showcase.cjs +148 -95
  10. package/dist/carousel-product-feature-showcase.js +148 -95
  11. package/dist/carousel-progress-slider.cjs +13 -9
  12. package/dist/carousel-progress-slider.js +13 -9
  13. package/dist/carousel-scrolling-feature-showcase.cjs +105 -54
  14. package/dist/carousel-scrolling-feature-showcase.js +105 -54
  15. package/dist/feature-accordion-image.cjs +9 -8
  16. package/dist/feature-accordion-image.js +9 -8
  17. package/dist/feature-animated-carousel.cjs +65 -49
  18. package/dist/feature-animated-carousel.js +65 -49
  19. package/dist/feature-badge-grid-six.cjs +20 -17
  20. package/dist/feature-badge-grid-six.js +21 -18
  21. package/dist/feature-bento-image-grid.cjs +12 -8
  22. package/dist/feature-bento-image-grid.js +12 -8
  23. package/dist/feature-bento-utilities.cjs +9 -5
  24. package/dist/feature-bento-utilities.js +9 -5
  25. package/dist/feature-capabilities-grid.cjs +41 -38
  26. package/dist/feature-capabilities-grid.js +41 -38
  27. package/dist/feature-card-grid-linked.cjs +18 -18
  28. package/dist/feature-card-grid-linked.js +19 -19
  29. package/dist/feature-carousel-progress.cjs +3 -3
  30. package/dist/feature-carousel-progress.js +4 -4
  31. package/dist/feature-category-image-cards.cjs +3 -3
  32. package/dist/feature-category-image-cards.js +4 -4
  33. package/dist/feature-checklist-image.cjs +2 -2
  34. package/dist/feature-checklist-image.js +2 -2
  35. package/dist/feature-checklist-three-column.cjs +6 -6
  36. package/dist/feature-checklist-three-column.js +7 -7
  37. package/dist/feature-icon-grid-accent.cjs +2 -2
  38. package/dist/feature-icon-grid-accent.js +2 -2
  39. package/dist/feature-icon-grid-bordered.cjs +29 -31
  40. package/dist/feature-icon-grid-bordered.d.cts +9 -9
  41. package/dist/feature-icon-grid-bordered.d.ts +9 -9
  42. package/dist/feature-icon-grid-bordered.js +30 -32
  43. package/dist/feature-icon-grid-muted.cjs +6 -6
  44. package/dist/feature-icon-grid-muted.d.cts +9 -9
  45. package/dist/feature-icon-grid-muted.d.ts +9 -9
  46. package/dist/feature-icon-grid-muted.js +7 -7
  47. package/dist/feature-icon-tabs-content.cjs +8 -8
  48. package/dist/feature-icon-tabs-content.d.cts +13 -13
  49. package/dist/feature-icon-tabs-content.d.ts +13 -13
  50. package/dist/feature-icon-tabs-content.js +9 -9
  51. package/dist/feature-image-cards-three-column.cjs +26 -27
  52. package/dist/feature-image-cards-three-column.js +27 -28
  53. package/dist/feature-image-overlay-badge.cjs +23 -21
  54. package/dist/feature-image-overlay-badge.js +24 -22
  55. package/dist/feature-integration-cards.cjs +19 -18
  56. package/dist/feature-integration-cards.js +20 -19
  57. package/dist/feature-numbered-cards.cjs +2 -2
  58. package/dist/feature-numbered-cards.js +3 -3
  59. package/dist/feature-pattern-grid-links.cjs +26 -29
  60. package/dist/feature-pattern-grid-links.d.cts +1 -5
  61. package/dist/feature-pattern-grid-links.d.ts +1 -5
  62. package/dist/feature-pattern-grid-links.js +27 -30
  63. package/dist/feature-showcase.cjs +441 -40
  64. package/dist/feature-showcase.d.cts +62 -5
  65. package/dist/feature-showcase.d.ts +62 -5
  66. package/dist/feature-showcase.js +438 -37
  67. package/dist/feature-split-image-reverse.cjs +15 -36
  68. package/dist/feature-split-image-reverse.js +16 -37
  69. package/dist/feature-split-image.cjs +15 -36
  70. package/dist/feature-split-image.js +16 -37
  71. package/dist/feature-stats-highlight.cjs +20 -32
  72. package/dist/feature-stats-highlight.js +21 -33
  73. package/dist/feature-tabbed-content-image.cjs +11 -6
  74. package/dist/feature-tabbed-content-image.js +11 -6
  75. package/dist/feature-three-column-values.cjs +6 -6
  76. package/dist/feature-three-column-values.js +6 -6
  77. package/dist/feature-utility-cards-grid.cjs +17 -15
  78. package/dist/feature-utility-cards-grid.js +18 -16
  79. package/dist/navbar-tabbed-sections.cjs +23 -16
  80. package/dist/navbar-tabbed-sections.js +23 -16
  81. package/dist/registry.cjs +941 -708
  82. package/dist/registry.js +943 -710
  83. package/package.json +1 -1
@@ -574,49 +574,52 @@ function FeatureCapabilitiesGrid({
574
574
  patternOpacity,
575
575
  patternClassName
576
576
  }) {
577
- const renderItemIcon = (item) => {
577
+ const renderItemIcon = React__namespace.useCallback((item) => {
578
578
  if (item.icon) return item.icon;
579
579
  if (item.iconName) return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: item.iconName, size: 20 });
580
- return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/star", size: 20 });
581
- };
580
+ return null;
581
+ }, []);
582
582
  const itemsContent = React.useMemo(() => {
583
583
  if (itemsSlot) return itemsSlot;
584
584
  if (!items || items.length === 0) return null;
585
- return items.map((item, index) => /* @__PURE__ */ jsxRuntime.jsxs(
586
- Card,
587
- {
588
- className: cn("group relative overflow-visible border-white/10 bg-white/5 p-0 transition-colors duration-300 hover:border-white/20", cardClassName, item.className),
589
- children: [
590
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-100", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -inset-px rounded-xl bg-linear-to-br from-white/10 via-white/5 to-transparent" }) }),
591
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 rounded-xl bg-linear-to-tr from-white/0 to-white/0 transition-colors group-hover:from-white/3 group-hover:to-white/6" }),
592
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "pointer-events-none absolute inset-0 hidden group-hover:block", children: [
593
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -left-2 -top-2 h-3 w-3 bg-white" }),
594
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -right-2 -top-2 h-3 w-3 bg-white" }),
595
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -left-2 -bottom-2 h-3 w-3 bg-white" }),
596
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -right-2 -bottom-2 h-3 w-3 bg-white" })
597
- ] }),
598
- /* @__PURE__ */ jsxRuntime.jsxs(CardHeader, { className: "relative z-10 flex flex-row items-start gap-3 p-6", children: [
599
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex h-10 w-10 items-center justify-center rounded-xl border border-white/15 bg-white/5 text-white", item.iconClassName), children: renderItemIcon(item) }),
600
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
601
- item.title && (typeof item.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(CardTitle, { className: cn("text-lg font-medium text-white", item.titleClassName), children: item.title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-lg font-medium text-white", item.titleClassName), children: item.title })),
602
- item.badge && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("rounded-full border border-white/20 px-2 py-0.5 text-[10px] leading-none text-white/70", item.badgeClassName), children: item.badge })
603
- ] }) })
604
- ] }),
605
- /* @__PURE__ */ jsxRuntime.jsx(CardContent, { className: cn("relative z-10 px-6 pb-6 text-sm text-white/70", item.descriptionClassName), children: item.description }),
606
- /* @__PURE__ */ jsxRuntime.jsx(
607
- framerMotion.motion.div,
608
- {
609
- className: "pointer-events-none absolute inset-0 rounded-xl ring-0 ring-white/0",
610
- initial: { opacity: 0 },
611
- whileHover: { opacity: 1 },
612
- transition: { duration: 0.25 }
613
- }
614
- )
615
- ]
616
- },
617
- `${typeof item.title === "string" ? item.title : "item"}-${index}`
618
- ));
619
- }, [itemsSlot, items, cardClassName]);
585
+ return items.map((item, index) => {
586
+ const iconContent = renderItemIcon(item);
587
+ return /* @__PURE__ */ jsxRuntime.jsxs(
588
+ Card,
589
+ {
590
+ className: cn("group relative overflow-visible border-white/10 bg-white/5 p-0 transition-colors duration-300 hover:border-white/20", cardClassName, item.className),
591
+ children: [
592
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-100", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -inset-px rounded-xl bg-linear-to-br from-white/10 via-white/5 to-transparent" }) }),
593
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 rounded-xl bg-linear-to-tr from-white/0 to-white/0 transition-colors group-hover:from-white/3 group-hover:to-white/6" }),
594
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "pointer-events-none absolute inset-0 hidden group-hover:block", children: [
595
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -left-2 -top-2 h-3 w-3 bg-white" }),
596
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -right-2 -top-2 h-3 w-3 bg-white" }),
597
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -left-2 -bottom-2 h-3 w-3 bg-white" }),
598
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -right-2 -bottom-2 h-3 w-3 bg-white" })
599
+ ] }),
600
+ /* @__PURE__ */ jsxRuntime.jsxs(CardHeader, { className: "relative z-10 flex flex-row items-start gap-3 p-6", children: [
601
+ iconContent && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex h-10 w-10 items-center justify-center rounded-xl border border-white/15 bg-white/5 text-white", item.iconClassName), children: iconContent }),
602
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
603
+ item.title && (typeof item.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(CardTitle, { className: cn("text-lg font-medium text-white", item.titleClassName), children: item.title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-lg font-medium text-white", item.titleClassName), children: item.title })),
604
+ item.badge && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("rounded-full border border-white/20 px-2 py-0.5 text-[10px] leading-none text-white/70", item.badgeClassName), children: item.badge })
605
+ ] }) })
606
+ ] }),
607
+ item.description && /* @__PURE__ */ jsxRuntime.jsx(CardContent, { className: cn("relative z-10 px-6 pb-6 text-sm text-white/70", item.descriptionClassName), children: item.description }),
608
+ /* @__PURE__ */ jsxRuntime.jsx(
609
+ framerMotion.motion.div,
610
+ {
611
+ className: "pointer-events-none absolute inset-0 rounded-xl ring-0 ring-white/0",
612
+ initial: { opacity: 0 },
613
+ whileHover: { opacity: 1 },
614
+ transition: { duration: 0.25 }
615
+ }
616
+ )
617
+ ]
618
+ },
619
+ `${typeof item.title === "string" ? item.title : "item"}-${index}`
620
+ );
621
+ });
622
+ }, [itemsSlot, items, cardClassName, renderItemIcon]);
620
623
  return /* @__PURE__ */ jsxRuntime.jsxs(
621
624
  Section,
622
625
  {
@@ -553,49 +553,52 @@ function FeatureCapabilitiesGrid({
553
553
  patternOpacity,
554
554
  patternClassName
555
555
  }) {
556
- const renderItemIcon = (item) => {
556
+ const renderItemIcon = React.useCallback((item) => {
557
557
  if (item.icon) return item.icon;
558
558
  if (item.iconName) return /* @__PURE__ */ jsx(DynamicIcon, { name: item.iconName, size: 20 });
559
- return /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/star", size: 20 });
560
- };
559
+ return null;
560
+ }, []);
561
561
  const itemsContent = useMemo(() => {
562
562
  if (itemsSlot) return itemsSlot;
563
563
  if (!items || items.length === 0) return null;
564
- return items.map((item, index) => /* @__PURE__ */ jsxs(
565
- Card,
566
- {
567
- className: cn("group relative overflow-visible border-white/10 bg-white/5 p-0 transition-colors duration-300 hover:border-white/20", cardClassName, item.className),
568
- children: [
569
- /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-100", children: /* @__PURE__ */ jsx("div", { className: "absolute -inset-px rounded-xl bg-linear-to-br from-white/10 via-white/5 to-transparent" }) }),
570
- /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 rounded-xl bg-linear-to-tr from-white/0 to-white/0 transition-colors group-hover:from-white/3 group-hover:to-white/6" }),
571
- /* @__PURE__ */ jsxs("div", { className: "pointer-events-none absolute inset-0 hidden group-hover:block", children: [
572
- /* @__PURE__ */ jsx("div", { className: "absolute -left-2 -top-2 h-3 w-3 bg-white" }),
573
- /* @__PURE__ */ jsx("div", { className: "absolute -right-2 -top-2 h-3 w-3 bg-white" }),
574
- /* @__PURE__ */ jsx("div", { className: "absolute -left-2 -bottom-2 h-3 w-3 bg-white" }),
575
- /* @__PURE__ */ jsx("div", { className: "absolute -right-2 -bottom-2 h-3 w-3 bg-white" })
576
- ] }),
577
- /* @__PURE__ */ jsxs(CardHeader, { className: "relative z-10 flex flex-row items-start gap-3 p-6", children: [
578
- /* @__PURE__ */ jsx("div", { className: cn("flex h-10 w-10 items-center justify-center rounded-xl border border-white/15 bg-white/5 text-white", item.iconClassName), children: renderItemIcon(item) }),
579
- /* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
580
- item.title && (typeof item.title === "string" ? /* @__PURE__ */ jsx(CardTitle, { className: cn("text-lg font-medium text-white", item.titleClassName), children: item.title }) : /* @__PURE__ */ jsx("div", { className: cn("text-lg font-medium text-white", item.titleClassName), children: item.title })),
581
- item.badge && /* @__PURE__ */ jsx("span", { className: cn("rounded-full border border-white/20 px-2 py-0.5 text-[10px] leading-none text-white/70", item.badgeClassName), children: item.badge })
582
- ] }) })
583
- ] }),
584
- /* @__PURE__ */ jsx(CardContent, { className: cn("relative z-10 px-6 pb-6 text-sm text-white/70", item.descriptionClassName), children: item.description }),
585
- /* @__PURE__ */ jsx(
586
- motion.div,
587
- {
588
- className: "pointer-events-none absolute inset-0 rounded-xl ring-0 ring-white/0",
589
- initial: { opacity: 0 },
590
- whileHover: { opacity: 1 },
591
- transition: { duration: 0.25 }
592
- }
593
- )
594
- ]
595
- },
596
- `${typeof item.title === "string" ? item.title : "item"}-${index}`
597
- ));
598
- }, [itemsSlot, items, cardClassName]);
564
+ return items.map((item, index) => {
565
+ const iconContent = renderItemIcon(item);
566
+ return /* @__PURE__ */ jsxs(
567
+ Card,
568
+ {
569
+ className: cn("group relative overflow-visible border-white/10 bg-white/5 p-0 transition-colors duration-300 hover:border-white/20", cardClassName, item.className),
570
+ children: [
571
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 opacity-0 transition-opacity duration-300 group-hover:opacity-100", children: /* @__PURE__ */ jsx("div", { className: "absolute -inset-px rounded-xl bg-linear-to-br from-white/10 via-white/5 to-transparent" }) }),
572
+ /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 rounded-xl bg-linear-to-tr from-white/0 to-white/0 transition-colors group-hover:from-white/3 group-hover:to-white/6" }),
573
+ /* @__PURE__ */ jsxs("div", { className: "pointer-events-none absolute inset-0 hidden group-hover:block", children: [
574
+ /* @__PURE__ */ jsx("div", { className: "absolute -left-2 -top-2 h-3 w-3 bg-white" }),
575
+ /* @__PURE__ */ jsx("div", { className: "absolute -right-2 -top-2 h-3 w-3 bg-white" }),
576
+ /* @__PURE__ */ jsx("div", { className: "absolute -left-2 -bottom-2 h-3 w-3 bg-white" }),
577
+ /* @__PURE__ */ jsx("div", { className: "absolute -right-2 -bottom-2 h-3 w-3 bg-white" })
578
+ ] }),
579
+ /* @__PURE__ */ jsxs(CardHeader, { className: "relative z-10 flex flex-row items-start gap-3 p-6", children: [
580
+ iconContent && /* @__PURE__ */ jsx("div", { className: cn("flex h-10 w-10 items-center justify-center rounded-xl border border-white/15 bg-white/5 text-white", item.iconClassName), children: iconContent }),
581
+ /* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
582
+ item.title && (typeof item.title === "string" ? /* @__PURE__ */ jsx(CardTitle, { className: cn("text-lg font-medium text-white", item.titleClassName), children: item.title }) : /* @__PURE__ */ jsx("div", { className: cn("text-lg font-medium text-white", item.titleClassName), children: item.title })),
583
+ item.badge && /* @__PURE__ */ jsx("span", { className: cn("rounded-full border border-white/20 px-2 py-0.5 text-[10px] leading-none text-white/70", item.badgeClassName), children: item.badge })
584
+ ] }) })
585
+ ] }),
586
+ item.description && /* @__PURE__ */ jsx(CardContent, { className: cn("relative z-10 px-6 pb-6 text-sm text-white/70", item.descriptionClassName), children: item.description }),
587
+ /* @__PURE__ */ jsx(
588
+ motion.div,
589
+ {
590
+ className: "pointer-events-none absolute inset-0 rounded-xl ring-0 ring-white/0",
591
+ initial: { opacity: 0 },
592
+ whileHover: { opacity: 1 },
593
+ transition: { duration: 0.25 }
594
+ }
595
+ )
596
+ ]
597
+ },
598
+ `${typeof item.title === "string" ? item.title : "item"}-${index}`
599
+ );
600
+ });
601
+ }, [itemsSlot, items, cardClassName, renderItemIcon]);
599
602
  return /* @__PURE__ */ jsxs(
600
603
  Section,
601
604
  {
@@ -842,28 +842,28 @@ function FeatureCardGridLinked({
842
842
  patternOpacity,
843
843
  patternClassName
844
844
  }) {
845
+ const renderImage = React.useCallback((feature, imageAlt) => {
846
+ if (feature.imageSlot) return feature.imageSlot;
847
+ if (feature.image) {
848
+ return /* @__PURE__ */ jsxRuntime.jsx(
849
+ img.Img,
850
+ {
851
+ src: feature.image,
852
+ alt: imageAlt,
853
+ className: "h-full w-full rounded-t-lg object-cover transition-opacity hover:opacity-80",
854
+ loading: "lazy",
855
+ optixFlowConfig
856
+ }
857
+ );
858
+ }
859
+ return null;
860
+ }, [optixFlowConfig]);
845
861
  const featuresContent = React.useMemo(() => {
846
862
  if (featuresSlot) return featuresSlot;
847
863
  if (!features || features.length === 0) return null;
848
864
  return features.map((feature, index) => {
849
865
  const featureKey = feature.id || `feature-${index}`;
850
866
  const imageAlt = feature.imageAlt || (typeof feature.heading === "string" ? feature.heading : "Feature image");
851
- const renderImage = () => {
852
- if (feature.imageSlot) return feature.imageSlot;
853
- if (feature.image) {
854
- return /* @__PURE__ */ jsxRuntime.jsx(
855
- img.Img,
856
- {
857
- src: feature.image,
858
- alt: imageAlt,
859
- className: "h-full w-full rounded-t-lg object-cover transition-opacity hover:opacity-80",
860
- loading: "lazy",
861
- optixFlowConfig
862
- }
863
- );
864
- }
865
- return null;
866
- };
867
867
  return /* @__PURE__ */ jsxRuntime.jsxs(
868
868
  "div",
869
869
  {
@@ -874,7 +874,7 @@ function FeatureCardGridLinked({
874
874
  feature.label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("font-mono text-xs text-muted-foreground", feature.labelClassName), children: feature.label }),
875
875
  feature.heading && /* @__PURE__ */ jsxRuntime.jsx(Pressable, { href: feature.url, children: typeof feature.heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("text-2xl transition-all hover:text-primary hover:opacity-80 sm:text-3xl lg:text-4xl", feature.headingClassName), children: feature.heading }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-2xl transition-all hover:text-primary hover:opacity-80 sm:text-3xl lg:text-4xl", feature.headingClassName), children: feature.heading }) })
876
876
  ] }),
877
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "md:1/3 w-2/5 shrink-0 rounded-r-lg border-l", children: /* @__PURE__ */ jsxRuntime.jsx(Pressable, { href: feature.url, children: renderImage() }) })
877
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "md:1/3 w-2/5 shrink-0 rounded-r-lg border-l", children: /* @__PURE__ */ jsxRuntime.jsx(Pressable, { href: feature.url, children: renderImage(feature, imageAlt) }) })
878
878
  ] }),
879
879
  feature.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("p-4 text-muted-foreground md:p-8", feature.descriptionClassName), children: feature.description })
880
880
  ]
@@ -882,7 +882,7 @@ function FeatureCardGridLinked({
882
882
  featureKey
883
883
  );
884
884
  });
885
- }, [featuresSlot, features, cardClassName, optixFlowConfig]);
885
+ }, [featuresSlot, features, cardClassName, renderImage]);
886
886
  return /* @__PURE__ */ jsxRuntime.jsxs(
887
887
  Section,
888
888
  {
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import * as React from 'react';
3
- import React__default, { useMemo } from 'react';
3
+ import React__default, { useCallback, useMemo } from 'react';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { cva } from 'class-variance-authority';
@@ -821,28 +821,28 @@ function FeatureCardGridLinked({
821
821
  patternOpacity,
822
822
  patternClassName
823
823
  }) {
824
+ const renderImage = useCallback((feature, imageAlt) => {
825
+ if (feature.imageSlot) return feature.imageSlot;
826
+ if (feature.image) {
827
+ return /* @__PURE__ */ jsx(
828
+ Img,
829
+ {
830
+ src: feature.image,
831
+ alt: imageAlt,
832
+ className: "h-full w-full rounded-t-lg object-cover transition-opacity hover:opacity-80",
833
+ loading: "lazy",
834
+ optixFlowConfig
835
+ }
836
+ );
837
+ }
838
+ return null;
839
+ }, [optixFlowConfig]);
824
840
  const featuresContent = useMemo(() => {
825
841
  if (featuresSlot) return featuresSlot;
826
842
  if (!features || features.length === 0) return null;
827
843
  return features.map((feature, index) => {
828
844
  const featureKey = feature.id || `feature-${index}`;
829
845
  const imageAlt = feature.imageAlt || (typeof feature.heading === "string" ? feature.heading : "Feature image");
830
- const renderImage = () => {
831
- if (feature.imageSlot) return feature.imageSlot;
832
- if (feature.image) {
833
- return /* @__PURE__ */ jsx(
834
- Img,
835
- {
836
- src: feature.image,
837
- alt: imageAlt,
838
- className: "h-full w-full rounded-t-lg object-cover transition-opacity hover:opacity-80",
839
- loading: "lazy",
840
- optixFlowConfig
841
- }
842
- );
843
- }
844
- return null;
845
- };
846
846
  return /* @__PURE__ */ jsxs(
847
847
  "div",
848
848
  {
@@ -853,7 +853,7 @@ function FeatureCardGridLinked({
853
853
  feature.label && /* @__PURE__ */ jsx("span", { className: cn("font-mono text-xs text-muted-foreground", feature.labelClassName), children: feature.label }),
854
854
  feature.heading && /* @__PURE__ */ jsx(Pressable, { href: feature.url, children: typeof feature.heading === "string" ? /* @__PURE__ */ jsx("h3", { className: cn("text-2xl transition-all hover:text-primary hover:opacity-80 sm:text-3xl lg:text-4xl", feature.headingClassName), children: feature.heading }) : /* @__PURE__ */ jsx("div", { className: cn("text-2xl transition-all hover:text-primary hover:opacity-80 sm:text-3xl lg:text-4xl", feature.headingClassName), children: feature.heading }) })
855
855
  ] }),
856
- /* @__PURE__ */ jsx("div", { className: "md:1/3 w-2/5 shrink-0 rounded-r-lg border-l", children: /* @__PURE__ */ jsx(Pressable, { href: feature.url, children: renderImage() }) })
856
+ /* @__PURE__ */ jsx("div", { className: "md:1/3 w-2/5 shrink-0 rounded-r-lg border-l", children: /* @__PURE__ */ jsx(Pressable, { href: feature.url, children: renderImage(feature, imageAlt) }) })
857
857
  ] }),
858
858
  feature.description && /* @__PURE__ */ jsx("p", { className: cn("p-4 text-muted-foreground md:p-8", feature.descriptionClassName), children: feature.description })
859
859
  ]
@@ -861,7 +861,7 @@ function FeatureCardGridLinked({
861
861
  featureKey
862
862
  );
863
863
  });
864
- }, [featuresSlot, features, cardClassName, optixFlowConfig]);
864
+ }, [featuresSlot, features, cardClassName, renderImage]);
865
865
  return /* @__PURE__ */ jsxs(
866
866
  Section,
867
867
  {
@@ -1237,10 +1237,10 @@ function FeatureCarouselProgress({
1237
1237
  );
1238
1238
  });
1239
1239
  }, [api, slidesLength]);
1240
- const renderSlideIcon = React4.useMemo(() => (slide) => {
1240
+ const renderSlideIcon = React4.useCallback((slide) => {
1241
1241
  if (slide.icon) return slide.icon;
1242
1242
  if (slide.iconName) return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: slide.iconName, size: 16 });
1243
- return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/star", size: 16 });
1243
+ return null;
1244
1244
  }, []);
1245
1245
  const slidesContent = React4.useMemo(() => {
1246
1246
  if (slidesSlot) return slidesSlot;
@@ -1250,7 +1250,7 @@ function FeatureCarouselProgress({
1250
1250
  {
1251
1251
  className: "basis-full md:basis-1/2 lg:basis-1/3",
1252
1252
  children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-1", children: /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn(cardClassName, slide.className), children: /* @__PURE__ */ jsxRuntime.jsx(CardContent, { className: "flex flex-col justify-center p-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1253
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("mb-5 flex size-8 items-center justify-center rounded-full bg-accent lg:size-10", slide.iconClassName), children: renderSlideIcon(slide) }),
1253
+ (slide.icon || slide.iconName) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("mb-5 flex size-8 items-center justify-center rounded-full bg-accent lg:size-10", slide.iconClassName), children: renderSlideIcon(slide) }),
1254
1254
  slide.title && (typeof slide.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-xl font-semibold md:text-2xl lg:text-2xl", slide.titleClassName), children: slide.title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-xl font-semibold md:text-2xl lg:text-2xl", slide.titleClassName), children: slide.title })),
1255
1255
  slide.description && (typeof slide.description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("pt-2 text-muted-foreground", slide.descriptionClassName), children: slide.description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("pt-2 text-muted-foreground", slide.descriptionClassName), children: slide.description }))
1256
1256
  ] }) }) }) })
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import * as React4 from 'react';
3
- import React4__default, { useState, useEffect, useMemo } from 'react';
3
+ import React4__default, { useState, useEffect, useCallback, useMemo } from 'react';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1212,10 +1212,10 @@ function FeatureCarouselProgress({
1212
1212
  );
1213
1213
  });
1214
1214
  }, [api, slidesLength]);
1215
- const renderSlideIcon = useMemo(() => (slide) => {
1215
+ const renderSlideIcon = useCallback((slide) => {
1216
1216
  if (slide.icon) return slide.icon;
1217
1217
  if (slide.iconName) return /* @__PURE__ */ jsx(DynamicIcon, { name: slide.iconName, size: 16 });
1218
- return /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/star", size: 16 });
1218
+ return null;
1219
1219
  }, []);
1220
1220
  const slidesContent = useMemo(() => {
1221
1221
  if (slidesSlot) return slidesSlot;
@@ -1225,7 +1225,7 @@ function FeatureCarouselProgress({
1225
1225
  {
1226
1226
  className: "basis-full md:basis-1/2 lg:basis-1/3",
1227
1227
  children: /* @__PURE__ */ jsx("div", { className: "p-1", children: /* @__PURE__ */ jsx(Card, { className: cn(cardClassName, slide.className), children: /* @__PURE__ */ jsx(CardContent, { className: "flex flex-col justify-center p-6", children: /* @__PURE__ */ jsxs("div", { children: [
1228
- /* @__PURE__ */ jsx("span", { className: cn("mb-5 flex size-8 items-center justify-center rounded-full bg-accent lg:size-10", slide.iconClassName), children: renderSlideIcon(slide) }),
1228
+ (slide.icon || slide.iconName) && /* @__PURE__ */ jsx("span", { className: cn("mb-5 flex size-8 items-center justify-center rounded-full bg-accent lg:size-10", slide.iconClassName), children: renderSlideIcon(slide) }),
1229
1229
  slide.title && (typeof slide.title === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-xl font-semibold md:text-2xl lg:text-2xl", slide.titleClassName), children: slide.title }) : /* @__PURE__ */ jsx("div", { className: cn("text-xl font-semibold md:text-2xl lg:text-2xl", slide.titleClassName), children: slide.title })),
1230
1230
  slide.description && (typeof slide.description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("pt-2 text-muted-foreground", slide.descriptionClassName), children: slide.description }) : /* @__PURE__ */ jsx("div", { className: cn("pt-2 text-muted-foreground", slide.descriptionClassName), children: slide.description }))
1231
1231
  ] }) }) }) })
@@ -501,7 +501,7 @@ function FeatureCategoryImageCards({
501
501
  patternOpacity,
502
502
  patternClassName
503
503
  }) {
504
- const renderFeatureImage = (feature) => {
504
+ const renderFeatureImage = React.useCallback((feature) => {
505
505
  if (feature.imageSlot) return feature.imageSlot;
506
506
  if (feature.imageSrc) {
507
507
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -516,7 +516,7 @@ function FeatureCategoryImageCards({
516
516
  );
517
517
  }
518
518
  return null;
519
- };
519
+ }, [optixFlowConfig]);
520
520
  const featuresContent = React.useMemo(() => {
521
521
  if (featuresSlot) return featuresSlot;
522
522
  if (!features || features.length === 0) return null;
@@ -527,7 +527,7 @@ function FeatureCategoryImageCards({
527
527
  ] }),
528
528
  /* @__PURE__ */ jsxRuntime.jsx(CardContent, { className: "px-7 pb-7", children: renderFeatureImage(feature) })
529
529
  ] }, index));
530
- }, [featuresSlot, features, cardClassName, optixFlowConfig]);
530
+ }, [featuresSlot, features, cardClassName, renderFeatureImage]);
531
531
  return /* @__PURE__ */ jsxRuntime.jsxs(
532
532
  Section,
533
533
  {
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import React, { useMemo } from 'react';
2
+ import React, { useCallback, useMemo } from 'react';
3
3
  import { clsx } from 'clsx';
4
4
  import { twMerge } from 'tailwind-merge';
5
5
  import { Slot } from '@radix-ui/react-slot';
@@ -495,7 +495,7 @@ function FeatureCategoryImageCards({
495
495
  patternOpacity,
496
496
  patternClassName
497
497
  }) {
498
- const renderFeatureImage = (feature) => {
498
+ const renderFeatureImage = useCallback((feature) => {
499
499
  if (feature.imageSlot) return feature.imageSlot;
500
500
  if (feature.imageSrc) {
501
501
  return /* @__PURE__ */ jsx(
@@ -510,7 +510,7 @@ function FeatureCategoryImageCards({
510
510
  );
511
511
  }
512
512
  return null;
513
- };
513
+ }, [optixFlowConfig]);
514
514
  const featuresContent = useMemo(() => {
515
515
  if (featuresSlot) return featuresSlot;
516
516
  if (!features || features.length === 0) return null;
@@ -521,7 +521,7 @@ function FeatureCategoryImageCards({
521
521
  ] }),
522
522
  /* @__PURE__ */ jsx(CardContent, { className: "px-7 pb-7", children: renderFeatureImage(feature) })
523
523
  ] }, index));
524
- }, [featuresSlot, features, cardClassName, optixFlowConfig]);
524
+ }, [featuresSlot, features, cardClassName, renderFeatureImage]);
525
525
  return /* @__PURE__ */ jsxs(
526
526
  Section,
527
527
  {
@@ -1039,8 +1039,8 @@ function FeatureChecklistImage({
1039
1039
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("lg:p-10", contentClassName), children: [
1040
1040
  title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: cn("text-3xl font-medium text-balance md:text-5xl", titleClassName), children: title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-3xl font-medium text-balance md:text-5xl", titleClassName), children: title })),
1041
1041
  description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-1 text-muted-foreground md:mt-6", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mt-1 text-muted-foreground md:mt-6", descriptionClassName), children: description })),
1042
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: actionsClassName, children: actionsContent }),
1043
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("mt-10 flex-wrap items-center gap-6 space-y-6 md:flex md:space-y-0", checklistClassName), children: checklistContent })
1042
+ actionsContent && /* @__PURE__ */ jsxRuntime.jsx("div", { className: actionsClassName, children: actionsContent }),
1043
+ checklistContent && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("mt-10 flex-wrap items-center gap-6 space-y-6 md:flex md:space-y-0", checklistClassName), children: checklistContent })
1044
1044
  ] })
1045
1045
  ] })
1046
1046
  }
@@ -1018,8 +1018,8 @@ function FeatureChecklistImage({
1018
1018
  /* @__PURE__ */ jsxs("div", { className: cn("lg:p-10", contentClassName), children: [
1019
1019
  title && (typeof title === "string" ? /* @__PURE__ */ jsx("h2", { className: cn("text-3xl font-medium text-balance md:text-5xl", titleClassName), children: title }) : /* @__PURE__ */ jsx("div", { className: cn("text-3xl font-medium text-balance md:text-5xl", titleClassName), children: title })),
1020
1020
  description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("mt-1 text-muted-foreground md:mt-6", descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: cn("mt-1 text-muted-foreground md:mt-6", descriptionClassName), children: description })),
1021
- /* @__PURE__ */ jsx("div", { className: actionsClassName, children: actionsContent }),
1022
- /* @__PURE__ */ jsx("ul", { className: cn("mt-10 flex-wrap items-center gap-6 space-y-6 md:flex md:space-y-0", checklistClassName), children: checklistContent })
1021
+ actionsContent && /* @__PURE__ */ jsx("div", { className: actionsClassName, children: actionsContent }),
1022
+ checklistContent && /* @__PURE__ */ jsx("ul", { className: cn("mt-10 flex-wrap items-center gap-6 space-y-6 md:flex md:space-y-0", checklistClassName), children: checklistContent })
1023
1023
  ] })
1024
1024
  ] })
1025
1025
  }
@@ -985,15 +985,15 @@ function FeatureChecklistThreeColumn({
985
985
  patternOpacity,
986
986
  patternClassName
987
987
  }) {
988
- const getCheckItemContent = React.useMemo(() => (item) => {
988
+ const getCheckItemContent = React.useCallback((item) => {
989
989
  if (typeof item === "string") return item;
990
990
  return item.content;
991
991
  }, []);
992
- const getCheckItemClassName = React.useMemo(() => (item) => {
992
+ const getCheckItemClassName = React.useCallback((item) => {
993
993
  if (typeof item === "string") return void 0;
994
994
  return item.className;
995
995
  }, []);
996
- const renderChecklistColumn = React.useMemo(() => (items, slot, gapClass) => {
996
+ const renderChecklistColumn = React.useCallback((items, slot, gapClass) => {
997
997
  if (slot) return slot;
998
998
  if (!items || items.length === 0) return null;
999
999
  return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("flex flex-col text-muted-foreground", gapClass, checklistClassName), children: items.map((item, index) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("flex items-center gap-2", getCheckItemClassName(item)), children: [
@@ -1001,7 +1001,7 @@ function FeatureChecklistThreeColumn({
1001
1001
  getCheckItemContent(item)
1002
1002
  ] }, index)) });
1003
1003
  }, [checklistClassName, getCheckItemContent, getCheckItemClassName]);
1004
- const renderCardImage = React.useMemo(() => (card) => {
1004
+ const renderCardImage = React.useCallback((card) => {
1005
1005
  if (card.imageSlot) return card.imageSlot;
1006
1006
  if (card.image) {
1007
1007
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -1017,7 +1017,7 @@ function FeatureChecklistThreeColumn({
1017
1017
  }
1018
1018
  return null;
1019
1019
  }, [optixFlowConfig]);
1020
- const renderCardLink = React.useMemo(() => (card) => {
1020
+ const renderCardLink = React.useCallback((card) => {
1021
1021
  if (card.linkSlot) return card.linkSlot;
1022
1022
  if (!card.link) return null;
1023
1023
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1080,7 +1080,7 @@ function FeatureChecklistThreeColumn({
1080
1080
  pattern,
1081
1081
  patternOpacity,
1082
1082
  patternClassName,
1083
- className: cn("py-16 sm:py-24 md:py-32", className),
1083
+ className,
1084
1084
  containerClassName,
1085
1085
  children: [
1086
1086
  /* @__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: [
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import * as React from 'react';
3
- import React__default, { useMemo } from 'react';
3
+ import React__default, { useCallback, useMemo } from 'react';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -964,15 +964,15 @@ function FeatureChecklistThreeColumn({
964
964
  patternOpacity,
965
965
  patternClassName
966
966
  }) {
967
- const getCheckItemContent = useMemo(() => (item) => {
967
+ const getCheckItemContent = useCallback((item) => {
968
968
  if (typeof item === "string") return item;
969
969
  return item.content;
970
970
  }, []);
971
- const getCheckItemClassName = useMemo(() => (item) => {
971
+ const getCheckItemClassName = useCallback((item) => {
972
972
  if (typeof item === "string") return void 0;
973
973
  return item.className;
974
974
  }, []);
975
- const renderChecklistColumn = useMemo(() => (items, slot, gapClass) => {
975
+ const renderChecklistColumn = useCallback((items, slot, gapClass) => {
976
976
  if (slot) return slot;
977
977
  if (!items || items.length === 0) return null;
978
978
  return /* @__PURE__ */ jsx("ul", { className: cn("flex flex-col text-muted-foreground", gapClass, checklistClassName), children: items.map((item, index) => /* @__PURE__ */ jsxs("li", { className: cn("flex items-center gap-2", getCheckItemClassName(item)), children: [
@@ -980,7 +980,7 @@ function FeatureChecklistThreeColumn({
980
980
  getCheckItemContent(item)
981
981
  ] }, index)) });
982
982
  }, [checklistClassName, getCheckItemContent, getCheckItemClassName]);
983
- const renderCardImage = useMemo(() => (card) => {
983
+ const renderCardImage = useCallback((card) => {
984
984
  if (card.imageSlot) return card.imageSlot;
985
985
  if (card.image) {
986
986
  return /* @__PURE__ */ jsx(
@@ -996,7 +996,7 @@ function FeatureChecklistThreeColumn({
996
996
  }
997
997
  return null;
998
998
  }, [optixFlowConfig]);
999
- const renderCardLink = useMemo(() => (card) => {
999
+ const renderCardLink = useCallback((card) => {
1000
1000
  if (card.linkSlot) return card.linkSlot;
1001
1001
  if (!card.link) return null;
1002
1002
  return /* @__PURE__ */ jsxs(
@@ -1059,7 +1059,7 @@ function FeatureChecklistThreeColumn({
1059
1059
  pattern,
1060
1060
  patternOpacity,
1061
1061
  patternClassName,
1062
- className: cn("py-16 sm:py-24 md:py-32", className),
1062
+ className,
1063
1063
  containerClassName,
1064
1064
  children: [
1065
1065
  /* @__PURE__ */ 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: [
@@ -566,12 +566,12 @@ function FeatureIconGridAccent({
566
566
  className,
567
567
  containerClassName,
568
568
  children: [
569
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex w-full flex-col items-center", headerClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center space-y-4 text-center sm:space-y-6 md:max-w-3xl md:text-center", children: [
569
+ (label || title || description) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex w-full flex-col items-center", headerClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center space-y-4 text-center sm:space-y-6 md:max-w-3xl md:text-center", children: [
570
570
  label && (typeof label === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-sm text-muted-foreground", labelClassName), children: label }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: labelClassName, children: label })),
571
571
  title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: cn("text-3xl font-medium md:text-5xl", titleClassName), children: title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: titleClassName, children: title })),
572
572
  description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-muted-foreground md:max-w-2xl", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description }))
573
573
  ] }) }),
574
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mx-auto mt-20 grid max-w-5xl gap-6 md:grid-cols-2", gridClassName), children: featuresContent })
574
+ featuresContent && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mx-auto mt-20 grid max-w-5xl gap-6 md:grid-cols-2", gridClassName), children: featuresContent })
575
575
  ]
576
576
  }
577
577
  );
@@ -545,12 +545,12 @@ function FeatureIconGridAccent({
545
545
  className,
546
546
  containerClassName,
547
547
  children: [
548
- /* @__PURE__ */ jsx("div", { className: cn("flex w-full flex-col items-center", headerClassName), children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center space-y-4 text-center sm:space-y-6 md:max-w-3xl md:text-center", children: [
548
+ (label || title || description) && /* @__PURE__ */ jsx("div", { className: cn("flex w-full flex-col items-center", headerClassName), children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center space-y-4 text-center sm:space-y-6 md:max-w-3xl md:text-center", children: [
549
549
  label && (typeof label === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-sm text-muted-foreground", labelClassName), children: label }) : /* @__PURE__ */ jsx("div", { className: labelClassName, children: label })),
550
550
  title && (typeof title === "string" ? /* @__PURE__ */ jsx("h2", { className: cn("text-3xl font-medium md:text-5xl", titleClassName), children: title }) : /* @__PURE__ */ jsx("div", { className: titleClassName, children: title })),
551
551
  description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-muted-foreground md:max-w-2xl", descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description }))
552
552
  ] }) }),
553
- /* @__PURE__ */ jsx("div", { className: cn("mx-auto mt-20 grid max-w-5xl gap-6 md:grid-cols-2", gridClassName), children: featuresContent })
553
+ featuresContent && /* @__PURE__ */ jsx("div", { className: cn("mx-auto mt-20 grid max-w-5xl gap-6 md:grid-cols-2", gridClassName), children: featuresContent })
554
554
  ]
555
555
  }
556
556
  );