@opensite/ui 0.8.1 → 0.8.3

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 +119 -177
  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 +119 -177
  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 +964 -714
  82. package/dist/registry.js +966 -716
  83. package/package.json +1 -1
@@ -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, { useMemo, useCallback } from 'react';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -968,7 +968,7 @@ function FeatureBadgeGridSix({
968
968
  if (!label) return null;
969
969
  return /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: badgeClassName, children: label });
970
970
  }, [badgeSlot, label, badgeClassName]);
971
- const renderFeatureIcon = (feature) => {
971
+ const renderFeatureIcon = useCallback((feature) => {
972
972
  if (feature.icon) return feature.icon;
973
973
  if (feature.iconName) {
974
974
  return /* @__PURE__ */ jsx(
@@ -981,25 +981,28 @@ function FeatureBadgeGridSix({
981
981
  );
982
982
  }
983
983
  return null;
984
- };
984
+ }, []);
985
985
  const featuresContent = useMemo(() => {
986
986
  if (featuresSlot) return featuresSlot;
987
987
  if (!features || features.length === 0) return null;
988
- return features.map((feature, index) => /* @__PURE__ */ jsxs(
989
- "div",
990
- {
991
- className: cn("flex gap-6 space-y-4 rounded-lg md:block", cardClassName, feature.className),
992
- children: [
993
- /* @__PURE__ */ jsx("span", { className: "flex size-10 shrink-0 items-center justify-center rounded-full bg-accent md:size-12", children: renderFeatureIcon(feature) }),
994
- /* @__PURE__ */ jsxs("div", { children: [
995
- feature.heading && (typeof feature.heading === "string" ? /* @__PURE__ */ jsx("h3", { className: cn("font-medium md:mb-2 md:text-xl", feature.headingClassName), children: feature.heading }) : /* @__PURE__ */ jsx("div", { className: cn("font-medium md:mb-2 md:text-xl", feature.headingClassName), children: feature.heading })),
996
- feature.description && (typeof feature.description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-sm text-muted-foreground md:text-base", feature.descriptionClassName), children: feature.description }) : /* @__PURE__ */ jsx("div", { className: cn("text-sm text-muted-foreground md:text-base", feature.descriptionClassName), children: feature.description }))
997
- ] })
998
- ]
999
- },
1000
- index
1001
- ));
1002
- }, [featuresSlot, features, cardClassName]);
988
+ return features.map((feature, index) => {
989
+ const iconContent = renderFeatureIcon(feature);
990
+ return /* @__PURE__ */ jsxs(
991
+ "div",
992
+ {
993
+ className: cn("flex gap-6 space-y-4 rounded-lg md:block", cardClassName, feature.className),
994
+ children: [
995
+ iconContent && /* @__PURE__ */ jsx("span", { className: "flex size-10 shrink-0 items-center justify-center rounded-full bg-accent md:size-12", children: iconContent }),
996
+ /* @__PURE__ */ jsxs("div", { children: [
997
+ feature.heading && (typeof feature.heading === "string" ? /* @__PURE__ */ jsx("h3", { className: cn("font-medium md:mb-2 md:text-xl", feature.headingClassName), children: feature.heading }) : /* @__PURE__ */ jsx("div", { className: cn("font-medium md:mb-2 md:text-xl", feature.headingClassName), children: feature.heading })),
998
+ feature.description && (typeof feature.description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-sm text-muted-foreground md:text-base", feature.descriptionClassName), children: feature.description }) : /* @__PURE__ */ jsx("div", { className: cn("text-sm text-muted-foreground md:text-base", feature.descriptionClassName), children: feature.description }))
999
+ ] })
1000
+ ]
1001
+ },
1002
+ index
1003
+ );
1004
+ });
1005
+ }, [featuresSlot, features, cardClassName, renderFeatureIcon]);
1003
1006
  const actionContent = useMemo(() => {
1004
1007
  if (actionSlot) return actionSlot;
1005
1008
  if (!action) return null;
@@ -949,12 +949,12 @@ function FeatureBentoImageGrid({
949
949
  patternOpacity,
950
950
  patternClassName
951
951
  }) {
952
- const renderItemIcon = React.useMemo(() => (item) => {
952
+ const renderItemIcon = React__namespace.useCallback((item) => {
953
953
  if (item.icon) return item.icon;
954
954
  if (item.iconName) return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: item.iconName, size: 24 });
955
955
  return null;
956
956
  }, []);
957
- const renderItemImage = React.useMemo(() => (item, imageClassName) => {
957
+ const renderItemImage = React__namespace.useCallback((item, imageClassName) => {
958
958
  if (item.imageSlot) return item.imageSlot;
959
959
  if (item.imageSrc) {
960
960
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -970,13 +970,15 @@ function FeatureBentoImageGrid({
970
970
  }
971
971
  return null;
972
972
  }, [optixFlowConfig]);
973
- const renderLargeCard = React.useMemo(() => (item) => {
973
+ const renderLargeCard = React__namespace.useCallback((item) => {
974
+ const iconContent = renderItemIcon(item);
975
+ const hasIconBadgeContent = iconContent || item.iconBadge;
974
976
  const cardContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
975
977
  renderItemImage(item, "h-full max-h-[580px] w-full rounded-xl object-cover object-center"),
976
978
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-0 right-0 bottom-0 left-0 translate-y-20 rounded-xl bg-linear-to-t from-primary to-transparent transition-transform duration-300 group-hover:translate-y-0" }),
977
979
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute top-0 flex h-full w-full flex-col justify-between p-7", children: [
978
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("ml-auto flex w-fit items-center gap-1 p-2.5 text-sm font-semibold text-background", item.iconBadgeClassName), children: [
979
- renderItemIcon(item),
980
+ hasIconBadgeContent && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("ml-auto flex w-fit items-center gap-1 p-2.5 text-sm font-semibold text-background", item.iconBadgeClassName), children: [
981
+ iconContent,
980
982
  item.iconBadge
981
983
  ] }),
982
984
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-5 text-background", children: [
@@ -1000,7 +1002,9 @@ function FeatureBentoImageGrid({
1000
1002
  }
1001
1003
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("group relative col-span-2 row-span-3 overflow-hidden rounded-xl", largeCardClassName, item.className), children: cardContent });
1002
1004
  }, [largeCardClassName, renderItemImage, renderItemIcon]);
1003
- const renderSmallCard = React.useMemo(() => (item, index) => {
1005
+ const renderSmallCard = React__namespace.useCallback((item, index) => {
1006
+ const iconContent = renderItemIcon(item);
1007
+ const hasIconBadgeContent = iconContent || item.iconBadge;
1004
1008
  const cardContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1005
1009
  renderItemImage(item, cn(
1006
1010
  "h-full w-full rounded-xl object-cover object-center",
@@ -1008,8 +1012,8 @@ function FeatureBentoImageGrid({
1008
1012
  )),
1009
1013
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-0 right-0 bottom-0 left-0 translate-y-10 rounded-xl bg-linear-to-t from-primary to-transparent opacity-80 transition-transform duration-300 group-hover:translate-y-0" }),
1010
1014
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute top-0 flex h-full w-full flex-col justify-between p-7", children: [
1011
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("ml-auto flex w-fit items-center gap-1 p-2.5 text-sm font-semibold text-background", item.iconBadgeClassName), children: [
1012
- renderItemIcon(item),
1015
+ hasIconBadgeContent && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("ml-auto flex w-fit items-center gap-1 p-2.5 text-sm font-semibold text-background", item.iconBadgeClassName), children: [
1016
+ iconContent,
1013
1017
  item.iconBadge
1014
1018
  ] }),
1015
1019
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-5 text-background", children: [
@@ -928,12 +928,12 @@ function FeatureBentoImageGrid({
928
928
  patternOpacity,
929
929
  patternClassName
930
930
  }) {
931
- const renderItemIcon = useMemo(() => (item) => {
931
+ const renderItemIcon = React.useCallback((item) => {
932
932
  if (item.icon) return item.icon;
933
933
  if (item.iconName) return /* @__PURE__ */ jsx(DynamicIcon, { name: item.iconName, size: 24 });
934
934
  return null;
935
935
  }, []);
936
- const renderItemImage = useMemo(() => (item, imageClassName) => {
936
+ const renderItemImage = React.useCallback((item, imageClassName) => {
937
937
  if (item.imageSlot) return item.imageSlot;
938
938
  if (item.imageSrc) {
939
939
  return /* @__PURE__ */ jsx(
@@ -949,13 +949,15 @@ function FeatureBentoImageGrid({
949
949
  }
950
950
  return null;
951
951
  }, [optixFlowConfig]);
952
- const renderLargeCard = useMemo(() => (item) => {
952
+ const renderLargeCard = React.useCallback((item) => {
953
+ const iconContent = renderItemIcon(item);
954
+ const hasIconBadgeContent = iconContent || item.iconBadge;
953
955
  const cardContent = /* @__PURE__ */ jsxs(Fragment, { children: [
954
956
  renderItemImage(item, "h-full max-h-[580px] w-full rounded-xl object-cover object-center"),
955
957
  /* @__PURE__ */ jsx("div", { className: "absolute top-0 right-0 bottom-0 left-0 translate-y-20 rounded-xl bg-linear-to-t from-primary to-transparent transition-transform duration-300 group-hover:translate-y-0" }),
956
958
  /* @__PURE__ */ jsxs("div", { className: "absolute top-0 flex h-full w-full flex-col justify-between p-7", children: [
957
- /* @__PURE__ */ jsxs("span", { className: cn("ml-auto flex w-fit items-center gap-1 p-2.5 text-sm font-semibold text-background", item.iconBadgeClassName), children: [
958
- renderItemIcon(item),
959
+ hasIconBadgeContent && /* @__PURE__ */ jsxs("span", { className: cn("ml-auto flex w-fit items-center gap-1 p-2.5 text-sm font-semibold text-background", item.iconBadgeClassName), children: [
960
+ iconContent,
959
961
  item.iconBadge
960
962
  ] }),
961
963
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-5 text-background", children: [
@@ -979,7 +981,9 @@ function FeatureBentoImageGrid({
979
981
  }
980
982
  return /* @__PURE__ */ jsx("div", { className: cn("group relative col-span-2 row-span-3 overflow-hidden rounded-xl", largeCardClassName, item.className), children: cardContent });
981
983
  }, [largeCardClassName, renderItemImage, renderItemIcon]);
982
- const renderSmallCard = useMemo(() => (item, index) => {
984
+ const renderSmallCard = React.useCallback((item, index) => {
985
+ const iconContent = renderItemIcon(item);
986
+ const hasIconBadgeContent = iconContent || item.iconBadge;
983
987
  const cardContent = /* @__PURE__ */ jsxs(Fragment, { children: [
984
988
  renderItemImage(item, cn(
985
989
  "h-full w-full rounded-xl object-cover object-center",
@@ -987,8 +991,8 @@ function FeatureBentoImageGrid({
987
991
  )),
988
992
  /* @__PURE__ */ jsx("div", { className: "absolute top-0 right-0 bottom-0 left-0 translate-y-10 rounded-xl bg-linear-to-t from-primary to-transparent opacity-80 transition-transform duration-300 group-hover:translate-y-0" }),
989
993
  /* @__PURE__ */ jsxs("div", { className: "absolute top-0 flex h-full w-full flex-col justify-between p-7", children: [
990
- /* @__PURE__ */ jsxs("span", { className: cn("ml-auto flex w-fit items-center gap-1 p-2.5 text-sm font-semibold text-background", item.iconBadgeClassName), children: [
991
- renderItemIcon(item),
994
+ hasIconBadgeContent && /* @__PURE__ */ jsxs("span", { className: cn("ml-auto flex w-fit items-center gap-1 p-2.5 text-sm font-semibold text-background", item.iconBadgeClassName), children: [
995
+ iconContent,
992
996
  item.iconBadge
993
997
  ] }),
994
998
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-5 text-background", children: [
@@ -582,7 +582,7 @@ var Section = React__namespace.default.forwardRef(
582
582
  Section.displayName = "Section";
583
583
  function FeatureBentoUtilities({
584
584
  label,
585
- labelIconName = "lucide/square-dashed-mouse-pointer",
585
+ labelIconName,
586
586
  labelIcon,
587
587
  title,
588
588
  description,
@@ -605,7 +605,7 @@ function FeatureBentoUtilities({
605
605
  patternOpacity,
606
606
  patternClassName
607
607
  }) {
608
- const renderCard = React.useMemo(() => (card, index) => {
608
+ const renderCard = React__namespace.useCallback((card, index) => {
609
609
  const hasImage = card.imageSrc || card.imageSlot;
610
610
  const cardClasses = cn(
611
611
  hasImage ? "overflow-hidden pt-0" : "p-6",
@@ -651,12 +651,16 @@ function FeatureBentoUtilities({
651
651
  card.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: card.description })
652
652
  ] }, index);
653
653
  }, [optixFlowConfig]);
654
- const renderColumn = React.useMemo(() => (cards, slot) => {
654
+ const renderColumn = React__namespace.useCallback((cards, slot) => {
655
655
  if (slot) return slot;
656
656
  if (!cards || cards.length === 0) return null;
657
657
  return cards.map((card, index) => renderCard(card, index));
658
658
  }, [renderCard]);
659
- const labelIconElement = React.useMemo(() => labelIcon ?? (labelIconName ? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: labelIconName, size: 20 }) : null), [labelIcon, labelIconName]);
659
+ const labelIconElement = React.useMemo(() => {
660
+ if (labelIcon) return labelIcon;
661
+ if (labelIconName) return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: labelIconName, size: 20 });
662
+ return null;
663
+ }, [labelIcon, labelIconName]);
660
664
  return /* @__PURE__ */ jsxRuntime.jsxs(
661
665
  Section,
662
666
  {
@@ -668,7 +672,7 @@ function FeatureBentoUtilities({
668
672
  className: cn("bg-gray-50 dark:bg-background", className),
669
673
  containerClassName: cn("max-w-7xl", containerClassName),
670
674
  children: [
671
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center gap-2 text-muted-foreground", labelClassName), children: [
675
+ (labelIconElement || label) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center gap-2 text-muted-foreground", labelClassName), children: [
672
676
  labelIconElement,
673
677
  label && (typeof label === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm", children: label }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm", children: label }))
674
678
  ] }),
@@ -560,7 +560,7 @@ var Section = React__default.forwardRef(
560
560
  Section.displayName = "Section";
561
561
  function FeatureBentoUtilities({
562
562
  label,
563
- labelIconName = "lucide/square-dashed-mouse-pointer",
563
+ labelIconName,
564
564
  labelIcon,
565
565
  title,
566
566
  description,
@@ -583,7 +583,7 @@ function FeatureBentoUtilities({
583
583
  patternOpacity,
584
584
  patternClassName
585
585
  }) {
586
- const renderCard = useMemo(() => (card, index) => {
586
+ const renderCard = React.useCallback((card, index) => {
587
587
  const hasImage = card.imageSrc || card.imageSlot;
588
588
  const cardClasses = cn(
589
589
  hasImage ? "overflow-hidden pt-0" : "p-6",
@@ -629,12 +629,16 @@ function FeatureBentoUtilities({
629
629
  card.description && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: card.description })
630
630
  ] }, index);
631
631
  }, [optixFlowConfig]);
632
- const renderColumn = useMemo(() => (cards, slot) => {
632
+ const renderColumn = React.useCallback((cards, slot) => {
633
633
  if (slot) return slot;
634
634
  if (!cards || cards.length === 0) return null;
635
635
  return cards.map((card, index) => renderCard(card, index));
636
636
  }, [renderCard]);
637
- const labelIconElement = useMemo(() => labelIcon ?? (labelIconName ? /* @__PURE__ */ jsx(DynamicIcon, { name: labelIconName, size: 20 }) : null), [labelIcon, labelIconName]);
637
+ const labelIconElement = useMemo(() => {
638
+ if (labelIcon) return labelIcon;
639
+ if (labelIconName) return /* @__PURE__ */ jsx(DynamicIcon, { name: labelIconName, size: 20 });
640
+ return null;
641
+ }, [labelIcon, labelIconName]);
638
642
  return /* @__PURE__ */ jsxs(
639
643
  Section,
640
644
  {
@@ -646,7 +650,7 @@ function FeatureBentoUtilities({
646
650
  className: cn("bg-gray-50 dark:bg-background", className),
647
651
  containerClassName: cn("max-w-7xl", containerClassName),
648
652
  children: [
649
- /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2 text-muted-foreground", labelClassName), children: [
653
+ (labelIconElement || label) && /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2 text-muted-foreground", labelClassName), children: [
650
654
  labelIconElement,
651
655
  label && (typeof label === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm", children: label }) : /* @__PURE__ */ jsx("div", { className: "text-sm", children: label }))
652
656
  ] }),
@@ -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
  {