@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.
- package/dist/carousel-horizontal-cards.cjs +8 -6
- package/dist/carousel-horizontal-cards.js +8 -6
- package/dist/carousel-image-hero.cjs +119 -177
- package/dist/carousel-image-hero.d.cts +1 -5
- package/dist/carousel-image-hero.d.ts +1 -5
- package/dist/carousel-image-hero.js +119 -177
- package/dist/carousel-portfolio-hero.cjs +138 -59
- package/dist/carousel-portfolio-hero.js +138 -59
- package/dist/carousel-product-feature-showcase.cjs +148 -95
- package/dist/carousel-product-feature-showcase.js +148 -95
- package/dist/carousel-progress-slider.cjs +13 -9
- package/dist/carousel-progress-slider.js +13 -9
- package/dist/carousel-scrolling-feature-showcase.cjs +105 -54
- package/dist/carousel-scrolling-feature-showcase.js +105 -54
- package/dist/feature-accordion-image.cjs +9 -8
- package/dist/feature-accordion-image.js +9 -8
- package/dist/feature-animated-carousel.cjs +65 -49
- package/dist/feature-animated-carousel.js +65 -49
- package/dist/feature-badge-grid-six.cjs +20 -17
- package/dist/feature-badge-grid-six.js +21 -18
- package/dist/feature-bento-image-grid.cjs +12 -8
- package/dist/feature-bento-image-grid.js +12 -8
- package/dist/feature-bento-utilities.cjs +9 -5
- package/dist/feature-bento-utilities.js +9 -5
- package/dist/feature-capabilities-grid.cjs +41 -38
- package/dist/feature-capabilities-grid.js +41 -38
- package/dist/feature-card-grid-linked.cjs +18 -18
- package/dist/feature-card-grid-linked.js +19 -19
- package/dist/feature-carousel-progress.cjs +3 -3
- package/dist/feature-carousel-progress.js +4 -4
- package/dist/feature-category-image-cards.cjs +3 -3
- package/dist/feature-category-image-cards.js +4 -4
- package/dist/feature-checklist-image.cjs +2 -2
- package/dist/feature-checklist-image.js +2 -2
- package/dist/feature-checklist-three-column.cjs +6 -6
- package/dist/feature-checklist-three-column.js +7 -7
- package/dist/feature-icon-grid-accent.cjs +2 -2
- package/dist/feature-icon-grid-accent.js +2 -2
- package/dist/feature-icon-grid-bordered.cjs +29 -31
- package/dist/feature-icon-grid-bordered.d.cts +9 -9
- package/dist/feature-icon-grid-bordered.d.ts +9 -9
- package/dist/feature-icon-grid-bordered.js +30 -32
- package/dist/feature-icon-grid-muted.cjs +6 -6
- package/dist/feature-icon-grid-muted.d.cts +9 -9
- package/dist/feature-icon-grid-muted.d.ts +9 -9
- package/dist/feature-icon-grid-muted.js +7 -7
- package/dist/feature-icon-tabs-content.cjs +8 -8
- package/dist/feature-icon-tabs-content.d.cts +13 -13
- package/dist/feature-icon-tabs-content.d.ts +13 -13
- package/dist/feature-icon-tabs-content.js +9 -9
- package/dist/feature-image-cards-three-column.cjs +26 -27
- package/dist/feature-image-cards-three-column.js +27 -28
- package/dist/feature-image-overlay-badge.cjs +23 -21
- package/dist/feature-image-overlay-badge.js +24 -22
- package/dist/feature-integration-cards.cjs +19 -18
- package/dist/feature-integration-cards.js +20 -19
- package/dist/feature-numbered-cards.cjs +2 -2
- package/dist/feature-numbered-cards.js +3 -3
- package/dist/feature-pattern-grid-links.cjs +26 -29
- package/dist/feature-pattern-grid-links.d.cts +1 -5
- package/dist/feature-pattern-grid-links.d.ts +1 -5
- package/dist/feature-pattern-grid-links.js +27 -30
- package/dist/feature-showcase.cjs +441 -40
- package/dist/feature-showcase.d.cts +62 -5
- package/dist/feature-showcase.d.ts +62 -5
- package/dist/feature-showcase.js +438 -37
- package/dist/feature-split-image-reverse.cjs +15 -36
- package/dist/feature-split-image-reverse.js +16 -37
- package/dist/feature-split-image.cjs +15 -36
- package/dist/feature-split-image.js +16 -37
- package/dist/feature-stats-highlight.cjs +20 -32
- package/dist/feature-stats-highlight.js +21 -33
- package/dist/feature-tabbed-content-image.cjs +11 -6
- package/dist/feature-tabbed-content-image.js +11 -6
- package/dist/feature-three-column-values.cjs +6 -6
- package/dist/feature-three-column-values.js +6 -6
- package/dist/feature-utility-cards-grid.cjs +17 -15
- package/dist/feature-utility-cards-grid.js +18 -16
- package/dist/navbar-tabbed-sections.cjs +23 -16
- package/dist/navbar-tabbed-sections.js +23 -16
- package/dist/registry.cjs +964 -714
- package/dist/registry.js +966 -716
- 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) =>
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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 =
|
|
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(() =>
|
|
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
|
|
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 =
|
|
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 =
|
|
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(() =>
|
|
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
|
|
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) =>
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -
|
|
594
|
-
/* @__PURE__ */ jsxRuntime.
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
/* @__PURE__ */ jsxRuntime.
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
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
|
|
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) =>
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
/* @__PURE__ */ jsx("div", { className: "absolute -
|
|
573
|
-
/* @__PURE__ */
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
/* @__PURE__ */
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
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,
|
|
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,
|
|
864
|
+
}, [featuresSlot, features, cardClassName, renderImage]);
|
|
865
865
|
return /* @__PURE__ */ jsxs(
|
|
866
866
|
Section,
|
|
867
867
|
{
|