@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
@@ -3,7 +3,7 @@ import * as React from 'react';
3
3
  import React__default, { useMemo } from 'react';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
- import { jsx, jsxs } from 'react/jsx-runtime';
6
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
7
  import { cva } from 'class-variance-authority';
8
8
  import { Slot } from '@radix-ui/react-slot';
9
9
  import * as AvatarPrimitive from '@radix-ui/react-avatar';
@@ -1080,28 +1080,30 @@ function FeatureImageOverlayBadge({
1080
1080
  description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-muted-foreground lg:text-lg", descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: cn("text-muted-foreground lg:text-lg", descriptionClassName), children: description })),
1081
1081
  /* @__PURE__ */ jsx("div", { className: actionsClassName, children: actionsContent })
1082
1082
  ] }),
1083
- /* @__PURE__ */ jsxs("div", { className: cn("relative rounded-xl", imageWrapperClassName), children: [
1083
+ imageContent && /* @__PURE__ */ jsxs("div", { className: cn("relative rounded-xl", imageWrapperClassName), children: [
1084
1084
  imageContent,
1085
- /* @__PURE__ */ jsx("div", { className: cn("absolute top-0 right-0 bottom-0 left-0 rounded-xl bg-linear-to-t from-primary via-transparent to-transparent", overlayClassName) }),
1086
- /* @__PURE__ */ jsxs("div", { className: "absolute top-0 flex h-full w-full flex-col justify-between p-7", children: [
1087
- /* @__PURE__ */ jsxs("span", { className: cn("ml-auto flex w-fit items-center gap-2 rounded-full bg-background/30 px-4 py-2.5 text-sm font-semibold backdrop-blur-sm", avatarBadgeClassName), children: [
1088
- /* @__PURE__ */ jsx(Avatar, { className: "size-7 rounded-full", children: /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: "Avatar" }) }),
1089
- avatarBadgeText
1090
- ] }),
1091
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-5 text-background", children: [
1092
- overlayTitle && (typeof overlayTitle === "string" ? /* @__PURE__ */ jsx("h4", { className: cn("text-lg font-semibold lg:text-3xl", overlayTitleClassName), children: overlayTitle }) : /* @__PURE__ */ jsx("div", { className: cn("text-lg font-semibold lg:text-3xl", overlayTitleClassName), children: overlayTitle })),
1093
- overlayLinkText && /* @__PURE__ */ jsxs(
1094
- Pressable,
1095
- {
1096
- href: overlayLinkUrl,
1097
- onClick: overlayLinkOnClick,
1098
- className: "flex items-center gap-1 font-medium",
1099
- children: [
1100
- overlayLinkText,
1101
- /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-right", size: 16 })
1102
- ]
1103
- }
1104
- )
1085
+ (avatarSrc || avatarBadgeText || overlayTitle || overlayLinkText) && /* @__PURE__ */ jsxs(Fragment, { children: [
1086
+ /* @__PURE__ */ jsx("div", { className: cn("absolute top-0 right-0 bottom-0 left-0 rounded-xl bg-linear-to-t from-primary via-transparent to-transparent", overlayClassName) }),
1087
+ /* @__PURE__ */ jsxs("div", { className: "absolute top-0 flex h-full w-full flex-col justify-between p-7", children: [
1088
+ (avatarSrc || avatarBadgeText) && /* @__PURE__ */ jsxs("span", { className: cn("ml-auto flex w-fit items-center gap-2 rounded-full bg-background/30 px-4 py-2.5 text-sm font-semibold backdrop-blur-sm", avatarBadgeClassName), children: [
1089
+ avatarSrc && /* @__PURE__ */ jsx(Avatar, { className: "size-7 rounded-full", children: /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: "Avatar" }) }),
1090
+ avatarBadgeText
1091
+ ] }),
1092
+ (overlayTitle || overlayLinkText) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-5 text-background", children: [
1093
+ overlayTitle && (typeof overlayTitle === "string" ? /* @__PURE__ */ jsx("h4", { className: cn("text-lg font-semibold lg:text-3xl", overlayTitleClassName), children: overlayTitle }) : /* @__PURE__ */ jsx("div", { className: cn("text-lg font-semibold lg:text-3xl", overlayTitleClassName), children: overlayTitle })),
1094
+ overlayLinkText && /* @__PURE__ */ jsxs(
1095
+ Pressable,
1096
+ {
1097
+ href: overlayLinkUrl,
1098
+ onClick: overlayLinkOnClick,
1099
+ className: "flex items-center gap-1 font-medium",
1100
+ children: [
1101
+ overlayLinkText,
1102
+ /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-right", size: 16 })
1103
+ ]
1104
+ }
1105
+ )
1106
+ ] })
1105
1107
  ] })
1106
1108
  ] })
1107
1109
  ] })
@@ -949,26 +949,25 @@ function FeatureIntegrationCards({
949
949
  patternOpacity,
950
950
  patternClassName
951
951
  }) {
952
- const renderIntegrationIcon = React.useMemo(() => (integration) => {
952
+ const renderIntegrationIcon = React.useCallback((integration) => {
953
953
  if (integration.iconSlot) return integration.iconSlot;
954
- if (integration.icon) {
955
- return /* @__PURE__ */ jsxRuntime.jsx(
956
- img.Img,
957
- {
958
- src: integration.icon,
959
- alt: integration.iconAlt || (typeof integration.title === "string" ? integration.title : "Integration icon"),
960
- className: cn("h-auto w-7", integration.iconClassName),
961
- loading: "lazy",
962
- optixFlowConfig
963
- }
964
- );
965
- }
966
- return null;
954
+ if (!integration.icon) return null;
955
+ return /* @__PURE__ */ jsxRuntime.jsx(
956
+ img.Img,
957
+ {
958
+ src: integration.icon,
959
+ alt: integration.iconAlt || (typeof integration.title === "string" ? integration.title : "Integration icon"),
960
+ className: cn("h-auto w-7", integration.iconClassName),
961
+ loading: "lazy",
962
+ optixFlowConfig
963
+ }
964
+ );
967
965
  }, [optixFlowConfig]);
968
- const renderLinkLabel = React.useMemo(() => (integration) => {
966
+ const renderLinkLabel = React.useCallback((integration) => {
969
967
  if (integration.linkLabelSlot) return integration.linkLabelSlot;
968
+ if (!integration.linkLabel) return null;
970
969
  return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("flex items-center gap-1 rounded-full border px-3 py-2.5 text-sm", integration.linkLabelClassName), children: [
971
- integration.linkLabel || "Visit Website",
970
+ integration.linkLabel,
972
971
  /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
973
972
  ] });
974
973
  }, []);
@@ -976,10 +975,12 @@ function FeatureIntegrationCards({
976
975
  if (integrationsSlot) return integrationsSlot;
977
976
  if (!integrations || integrations.length === 0) return null;
978
977
  return integrations.map((integration, index) => {
978
+ const iconContent = renderIntegrationIcon(integration);
979
+ const linkLabelContent = renderLinkLabel(integration);
979
980
  const cardContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
980
981
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
981
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "grid size-12 shrink-0 place-content-center rounded-md border", children: renderIntegrationIcon(integration) }),
982
- renderLinkLabel(integration)
982
+ iconContent && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "grid size-12 shrink-0 place-content-center rounded-md border", children: iconContent }),
983
+ linkLabelContent
983
984
  ] }),
984
985
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
985
986
  integration.title && (typeof integration.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("font-medium md:text-lg", integration.titleClassName), children: integration.title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("font-medium md:text-lg", integration.titleClassName), children: integration.title })),
@@ -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, Fragment } from 'react/jsx-runtime';
@@ -928,26 +928,25 @@ function FeatureIntegrationCards({
928
928
  patternOpacity,
929
929
  patternClassName
930
930
  }) {
931
- const renderIntegrationIcon = useMemo(() => (integration) => {
931
+ const renderIntegrationIcon = useCallback((integration) => {
932
932
  if (integration.iconSlot) return integration.iconSlot;
933
- if (integration.icon) {
934
- return /* @__PURE__ */ jsx(
935
- Img,
936
- {
937
- src: integration.icon,
938
- alt: integration.iconAlt || (typeof integration.title === "string" ? integration.title : "Integration icon"),
939
- className: cn("h-auto w-7", integration.iconClassName),
940
- loading: "lazy",
941
- optixFlowConfig
942
- }
943
- );
944
- }
945
- return null;
933
+ if (!integration.icon) return null;
934
+ return /* @__PURE__ */ jsx(
935
+ Img,
936
+ {
937
+ src: integration.icon,
938
+ alt: integration.iconAlt || (typeof integration.title === "string" ? integration.title : "Integration icon"),
939
+ className: cn("h-auto w-7", integration.iconClassName),
940
+ loading: "lazy",
941
+ optixFlowConfig
942
+ }
943
+ );
946
944
  }, [optixFlowConfig]);
947
- const renderLinkLabel = useMemo(() => (integration) => {
945
+ const renderLinkLabel = useCallback((integration) => {
948
946
  if (integration.linkLabelSlot) return integration.linkLabelSlot;
947
+ if (!integration.linkLabel) return null;
949
948
  return /* @__PURE__ */ jsxs("span", { className: cn("flex items-center gap-1 rounded-full border px-3 py-2.5 text-sm", integration.linkLabelClassName), children: [
950
- integration.linkLabel || "Visit Website",
949
+ integration.linkLabel,
951
950
  /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
952
951
  ] });
953
952
  }, []);
@@ -955,10 +954,12 @@ function FeatureIntegrationCards({
955
954
  if (integrationsSlot) return integrationsSlot;
956
955
  if (!integrations || integrations.length === 0) return null;
957
956
  return integrations.map((integration, index) => {
957
+ const iconContent = renderIntegrationIcon(integration);
958
+ const linkLabelContent = renderLinkLabel(integration);
958
959
  const cardContent = /* @__PURE__ */ jsxs(Fragment, { children: [
959
960
  /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
960
- /* @__PURE__ */ jsx("span", { className: "grid size-12 shrink-0 place-content-center rounded-md border", children: renderIntegrationIcon(integration) }),
961
- renderLinkLabel(integration)
961
+ iconContent && /* @__PURE__ */ jsx("span", { className: "grid size-12 shrink-0 place-content-center rounded-md border", children: iconContent }),
962
+ linkLabelContent
962
963
  ] }),
963
964
  /* @__PURE__ */ jsxs("div", { children: [
964
965
  integration.title && (typeof integration.title === "string" ? /* @__PURE__ */ jsx("h3", { className: cn("font-medium md:text-lg", integration.titleClassName), children: integration.title }) : /* @__PURE__ */ jsx("div", { className: cn("font-medium md:text-lg", integration.titleClassName), children: integration.title })),
@@ -529,7 +529,7 @@ function FeatureNumberedCards({
529
529
  patternOpacity,
530
530
  patternClassName
531
531
  }) {
532
- const renderChecklistItems = (feature) => {
532
+ const renderChecklistItems = React.useCallback((feature) => {
533
533
  if (feature.checklistSlot) return feature.checklistSlot;
534
534
  if (!feature.checklistItems || feature.checklistItems.length === 0) return null;
535
535
  return feature.checklistItems.map((item, itemIndex) => {
@@ -549,7 +549,7 @@ function FeatureNumberedCards({
549
549
  /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm md:text-base", children: content })
550
550
  ] }, itemIndex);
551
551
  });
552
- };
552
+ }, []);
553
553
  const featuresContent = React.useMemo(() => {
554
554
  if (featuresSlot) return featuresSlot;
555
555
  if (!features || features.length === 0) return null;
@@ -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';
@@ -508,7 +508,7 @@ function FeatureNumberedCards({
508
508
  patternOpacity,
509
509
  patternClassName
510
510
  }) {
511
- const renderChecklistItems = (feature) => {
511
+ const renderChecklistItems = useCallback((feature) => {
512
512
  if (feature.checklistSlot) return feature.checklistSlot;
513
513
  if (!feature.checklistItems || feature.checklistItems.length === 0) return null;
514
514
  return feature.checklistItems.map((item, itemIndex) => {
@@ -528,7 +528,7 @@ function FeatureNumberedCards({
528
528
  /* @__PURE__ */ jsx("p", { className: "text-sm md:text-base", children: content })
529
529
  ] }, itemIndex);
530
530
  });
531
- };
531
+ }, []);
532
532
  const featuresContent = useMemo(() => {
533
533
  if (featuresSlot) return featuresSlot;
534
534
  if (!features || features.length === 0) return null;
@@ -554,22 +554,6 @@ var Pressable = React__namespace.forwardRef(
554
554
  }
555
555
  );
556
556
  Pressable.displayName = "Pressable";
557
-
558
- // lib/patternSvgs.ts
559
- var patternSvgs = {
560
- squareAltGrid: "https://cdn.ing/assets/files/record/286187/4gpn0yq2ptra8iwlvmwwv860ggwv",
561
- grid1: "https://cdn.ing/assets/files/record/286186/nbdflpgp4ostrno079hygibsflp3",
562
- noise: "https://cdn.ing/assets/i/r/286188/zrqcp9hynh3j7p2laihwzfbujgrl/noise.png",
563
- dots: "https://cdn.ing/assets/files/record/286198/yfsjx9thvtxzhl2qtshxyhkrm524",
564
- dotPattern: "https://cdn.ing/assets/files/record/286192/7ig0cku8aqbboiza8nuk6hw0nnsr",
565
- dotPattern2: "https://cdn.ing/assets/files/record/286189/arez6gd2s7isn9i1o6c7sexdq7bl",
566
- circles: "https://cdn.ing/assets/files/record/286190/gtmia3sncjtzetdshc20zf1d3c17",
567
- waves: "https://cdn.ing/assets/files/record/286191/mqlb33fzxz9cdth1bx7if0wmpkp1",
568
- crossPattern: "https://cdn.ing/assets/files/record/286193/9yfqwdbnqaipbp7fsb3wbzzmq472",
569
- architect: "https://cdn.ing/assets/files/record/286194/vgs88ugpvyhxu13wqgy0acvae6re",
570
- tinyCheckers: "https://cdn.ing/assets/files/record/286195/65efaknsw8kcpf9o3c2gybytsl5b",
571
- p6: "https://cdn.ing/assets/i/r/286196/6kl0rqnd6mjk8j7e525fo8fo0vkc/p6.webp"
572
- };
573
557
  var maxWidthStyles = {
574
558
  sm: "max-w-screen-sm",
575
559
  md: "max-w-screen-md",
@@ -598,6 +582,22 @@ var Container = React__namespace.default.forwardRef(
598
582
  }
599
583
  );
600
584
  Container.displayName = "Container";
585
+
586
+ // lib/patternSvgs.ts
587
+ var patternSvgs = {
588
+ squareAltGrid: "https://cdn.ing/assets/files/record/286187/4gpn0yq2ptra8iwlvmwwv860ggwv",
589
+ grid1: "https://cdn.ing/assets/files/record/286186/nbdflpgp4ostrno079hygibsflp3",
590
+ noise: "https://cdn.ing/assets/i/r/286188/zrqcp9hynh3j7p2laihwzfbujgrl/noise.png",
591
+ dots: "https://cdn.ing/assets/files/record/286198/yfsjx9thvtxzhl2qtshxyhkrm524",
592
+ dotPattern: "https://cdn.ing/assets/files/record/286192/7ig0cku8aqbboiza8nuk6hw0nnsr",
593
+ dotPattern2: "https://cdn.ing/assets/files/record/286189/arez6gd2s7isn9i1o6c7sexdq7bl",
594
+ circles: "https://cdn.ing/assets/files/record/286190/gtmia3sncjtzetdshc20zf1d3c17",
595
+ waves: "https://cdn.ing/assets/files/record/286191/mqlb33fzxz9cdth1bx7if0wmpkp1",
596
+ crossPattern: "https://cdn.ing/assets/files/record/286193/9yfqwdbnqaipbp7fsb3wbzzmq472",
597
+ architect: "https://cdn.ing/assets/files/record/286194/vgs88ugpvyhxu13wqgy0acvae6re",
598
+ tinyCheckers: "https://cdn.ing/assets/files/record/286195/65efaknsw8kcpf9o3c2gybytsl5b",
599
+ p6: "https://cdn.ing/assets/i/r/286196/6kl0rqnd6mjk8j7e525fo8fo0vkc/p6.webp"
600
+ };
601
601
  var maskTop = "radial-gradient(ellipse 70% 60% at 50% 0%, #000 60%, transparent 100%)";
602
602
  var maskBottom = "radial-gradient(ellipse 100% 80% at 50% 100%, #000 50%, transparent 90%)";
603
603
  var maskCenter = "radial-gradient(ellipse 60% 60% at 50% 50%, #000 30%, transparent 70%)";
@@ -932,7 +932,6 @@ Section.displayName = "Section";
932
932
  function FeaturePatternGridLinks({
933
933
  features,
934
934
  featuresSlot,
935
- patternUrl = patternSvgs.dotPattern,
936
935
  className,
937
936
  containerClassName,
938
937
  gridClassName,
@@ -943,26 +942,28 @@ function FeaturePatternGridLinks({
943
942
  patternOpacity,
944
943
  patternClassName
945
944
  }) {
946
- const renderFeatureIcon = (feature) => {
945
+ const renderFeatureIcon = React.useCallback((feature) => {
947
946
  if (feature.icon) return feature.icon;
948
947
  if (feature.iconName) return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: feature.iconName, size: 24, className: feature.iconClassName });
949
948
  return null;
950
- };
951
- const renderFeatureLink = (feature) => {
949
+ }, []);
950
+ const renderFeatureLink = React.useCallback((feature) => {
952
951
  if (feature.linkSlot) return feature.linkSlot;
953
- if (!feature.link) return null;
952
+ if (!feature.link && !feature.linkLabel) return null;
953
+ const label = feature.linkLabel || (feature.link ? "Learn more" : null);
954
+ if (!label) return null;
954
955
  return /* @__PURE__ */ jsxRuntime.jsxs(
955
956
  Pressable,
956
957
  {
957
958
  href: feature.link,
958
959
  className: cn("flex items-center gap-2 text-sm font-medium", feature.linkClassName),
959
960
  children: [
960
- feature.linkLabel || "Learn more",
961
+ label,
961
962
  /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/chevron-right", size: 16 })
962
963
  ]
963
964
  }
964
965
  );
965
- };
966
+ }, []);
966
967
  const featuresContent = React.useMemo(() => {
967
968
  if (featuresSlot) return featuresSlot;
968
969
  if (!features || features.length === 0) return null;
@@ -981,7 +982,7 @@ function FeaturePatternGridLinks({
981
982
  },
982
983
  index
983
984
  ));
984
- }, [featuresSlot, features, cardClassName]);
985
+ }, [featuresSlot, features, cardClassName, renderFeatureIcon, renderFeatureLink]);
985
986
  return /* @__PURE__ */ jsxRuntime.jsx(
986
987
  Section,
987
988
  {
@@ -990,12 +991,8 @@ function FeaturePatternGridLinks({
990
991
  pattern,
991
992
  patternOpacity,
992
993
  patternClassName,
993
- className: cn("bg-muted/30", className),
994
+ className,
994
995
  containerClassName,
995
- style: {
996
- backgroundImage: `url(${patternUrl})`,
997
- backgroundRepeat: "repeat"
998
- },
999
996
  children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid gap-6 md:grid-cols-2 lg:grid-cols-3", gridClassName), children: featuresContent })
1000
997
  }
1001
998
  );
@@ -66,10 +66,6 @@ interface FeaturePatternGridLinksProps {
66
66
  * Custom slot for rendering features (overrides features array)
67
67
  */
68
68
  featuresSlot?: React.ReactNode;
69
- /**
70
- * Background pattern URL
71
- */
72
- patternUrl?: string;
73
69
  /**
74
70
  * Additional CSS classes for the section
75
71
  */
@@ -124,6 +120,6 @@ interface FeaturePatternGridLinksProps {
124
120
  * />
125
121
  * ```
126
122
  */
127
- declare function FeaturePatternGridLinks({ features, featuresSlot, patternUrl, className, containerClassName, gridClassName, cardClassName, background, spacing, pattern, patternOpacity, patternClassName, }: FeaturePatternGridLinksProps): React.JSX.Element;
123
+ declare function FeaturePatternGridLinks({ features, featuresSlot, className, containerClassName, gridClassName, cardClassName, background, spacing, pattern, patternOpacity, patternClassName, }: FeaturePatternGridLinksProps): React.JSX.Element;
128
124
 
129
125
  export { FeaturePatternGridLinks, type FeaturePatternGridLinksProps };
@@ -66,10 +66,6 @@ interface FeaturePatternGridLinksProps {
66
66
  * Custom slot for rendering features (overrides features array)
67
67
  */
68
68
  featuresSlot?: React.ReactNode;
69
- /**
70
- * Background pattern URL
71
- */
72
- patternUrl?: string;
73
69
  /**
74
70
  * Additional CSS classes for the section
75
71
  */
@@ -124,6 +120,6 @@ interface FeaturePatternGridLinksProps {
124
120
  * />
125
121
  * ```
126
122
  */
127
- declare function FeaturePatternGridLinks({ features, featuresSlot, patternUrl, className, containerClassName, gridClassName, cardClassName, background, spacing, pattern, patternOpacity, patternClassName, }: FeaturePatternGridLinksProps): React.JSX.Element;
123
+ declare function FeaturePatternGridLinks({ features, featuresSlot, className, containerClassName, gridClassName, cardClassName, background, spacing, pattern, patternOpacity, patternClassName, }: FeaturePatternGridLinksProps): React.JSX.Element;
128
124
 
129
125
  export { FeaturePatternGridLinks, type FeaturePatternGridLinksProps };
@@ -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';
@@ -533,22 +533,6 @@ var Pressable = React.forwardRef(
533
533
  }
534
534
  );
535
535
  Pressable.displayName = "Pressable";
536
-
537
- // lib/patternSvgs.ts
538
- var patternSvgs = {
539
- squareAltGrid: "https://cdn.ing/assets/files/record/286187/4gpn0yq2ptra8iwlvmwwv860ggwv",
540
- grid1: "https://cdn.ing/assets/files/record/286186/nbdflpgp4ostrno079hygibsflp3",
541
- noise: "https://cdn.ing/assets/i/r/286188/zrqcp9hynh3j7p2laihwzfbujgrl/noise.png",
542
- dots: "https://cdn.ing/assets/files/record/286198/yfsjx9thvtxzhl2qtshxyhkrm524",
543
- dotPattern: "https://cdn.ing/assets/files/record/286192/7ig0cku8aqbboiza8nuk6hw0nnsr",
544
- dotPattern2: "https://cdn.ing/assets/files/record/286189/arez6gd2s7isn9i1o6c7sexdq7bl",
545
- circles: "https://cdn.ing/assets/files/record/286190/gtmia3sncjtzetdshc20zf1d3c17",
546
- waves: "https://cdn.ing/assets/files/record/286191/mqlb33fzxz9cdth1bx7if0wmpkp1",
547
- crossPattern: "https://cdn.ing/assets/files/record/286193/9yfqwdbnqaipbp7fsb3wbzzmq472",
548
- architect: "https://cdn.ing/assets/files/record/286194/vgs88ugpvyhxu13wqgy0acvae6re",
549
- tinyCheckers: "https://cdn.ing/assets/files/record/286195/65efaknsw8kcpf9o3c2gybytsl5b",
550
- p6: "https://cdn.ing/assets/i/r/286196/6kl0rqnd6mjk8j7e525fo8fo0vkc/p6.webp"
551
- };
552
536
  var maxWidthStyles = {
553
537
  sm: "max-w-screen-sm",
554
538
  md: "max-w-screen-md",
@@ -577,6 +561,22 @@ var Container = React__default.forwardRef(
577
561
  }
578
562
  );
579
563
  Container.displayName = "Container";
564
+
565
+ // lib/patternSvgs.ts
566
+ var patternSvgs = {
567
+ squareAltGrid: "https://cdn.ing/assets/files/record/286187/4gpn0yq2ptra8iwlvmwwv860ggwv",
568
+ grid1: "https://cdn.ing/assets/files/record/286186/nbdflpgp4ostrno079hygibsflp3",
569
+ noise: "https://cdn.ing/assets/i/r/286188/zrqcp9hynh3j7p2laihwzfbujgrl/noise.png",
570
+ dots: "https://cdn.ing/assets/files/record/286198/yfsjx9thvtxzhl2qtshxyhkrm524",
571
+ dotPattern: "https://cdn.ing/assets/files/record/286192/7ig0cku8aqbboiza8nuk6hw0nnsr",
572
+ dotPattern2: "https://cdn.ing/assets/files/record/286189/arez6gd2s7isn9i1o6c7sexdq7bl",
573
+ circles: "https://cdn.ing/assets/files/record/286190/gtmia3sncjtzetdshc20zf1d3c17",
574
+ waves: "https://cdn.ing/assets/files/record/286191/mqlb33fzxz9cdth1bx7if0wmpkp1",
575
+ crossPattern: "https://cdn.ing/assets/files/record/286193/9yfqwdbnqaipbp7fsb3wbzzmq472",
576
+ architect: "https://cdn.ing/assets/files/record/286194/vgs88ugpvyhxu13wqgy0acvae6re",
577
+ tinyCheckers: "https://cdn.ing/assets/files/record/286195/65efaknsw8kcpf9o3c2gybytsl5b",
578
+ p6: "https://cdn.ing/assets/i/r/286196/6kl0rqnd6mjk8j7e525fo8fo0vkc/p6.webp"
579
+ };
580
580
  var maskTop = "radial-gradient(ellipse 70% 60% at 50% 0%, #000 60%, transparent 100%)";
581
581
  var maskBottom = "radial-gradient(ellipse 100% 80% at 50% 100%, #000 50%, transparent 90%)";
582
582
  var maskCenter = "radial-gradient(ellipse 60% 60% at 50% 50%, #000 30%, transparent 70%)";
@@ -911,7 +911,6 @@ Section.displayName = "Section";
911
911
  function FeaturePatternGridLinks({
912
912
  features,
913
913
  featuresSlot,
914
- patternUrl = patternSvgs.dotPattern,
915
914
  className,
916
915
  containerClassName,
917
916
  gridClassName,
@@ -922,26 +921,28 @@ function FeaturePatternGridLinks({
922
921
  patternOpacity,
923
922
  patternClassName
924
923
  }) {
925
- const renderFeatureIcon = (feature) => {
924
+ const renderFeatureIcon = useCallback((feature) => {
926
925
  if (feature.icon) return feature.icon;
927
926
  if (feature.iconName) return /* @__PURE__ */ jsx(DynamicIcon, { name: feature.iconName, size: 24, className: feature.iconClassName });
928
927
  return null;
929
- };
930
- const renderFeatureLink = (feature) => {
928
+ }, []);
929
+ const renderFeatureLink = useCallback((feature) => {
931
930
  if (feature.linkSlot) return feature.linkSlot;
932
- if (!feature.link) return null;
931
+ if (!feature.link && !feature.linkLabel) return null;
932
+ const label = feature.linkLabel || (feature.link ? "Learn more" : null);
933
+ if (!label) return null;
933
934
  return /* @__PURE__ */ jsxs(
934
935
  Pressable,
935
936
  {
936
937
  href: feature.link,
937
938
  className: cn("flex items-center gap-2 text-sm font-medium", feature.linkClassName),
938
939
  children: [
939
- feature.linkLabel || "Learn more",
940
+ label,
940
941
  /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-right", size: 16 })
941
942
  ]
942
943
  }
943
944
  );
944
- };
945
+ }, []);
945
946
  const featuresContent = useMemo(() => {
946
947
  if (featuresSlot) return featuresSlot;
947
948
  if (!features || features.length === 0) return null;
@@ -960,7 +961,7 @@ function FeaturePatternGridLinks({
960
961
  },
961
962
  index
962
963
  ));
963
- }, [featuresSlot, features, cardClassName]);
964
+ }, [featuresSlot, features, cardClassName, renderFeatureIcon, renderFeatureLink]);
964
965
  return /* @__PURE__ */ jsx(
965
966
  Section,
966
967
  {
@@ -969,12 +970,8 @@ function FeaturePatternGridLinks({
969
970
  pattern,
970
971
  patternOpacity,
971
972
  patternClassName,
972
- className: cn("bg-muted/30", className),
973
+ className,
973
974
  containerClassName,
974
- style: {
975
- backgroundImage: `url(${patternUrl})`,
976
- backgroundRepeat: "repeat"
977
- },
978
975
  children: /* @__PURE__ */ jsx("div", { className: cn("grid gap-6 md:grid-cols-2 lg:grid-cols-3", gridClassName), children: featuresContent })
979
976
  }
980
977
  );