@opensite/ui 1.4.4 → 1.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components.cjs +160 -54
- package/dist/components.js +160 -54
- package/dist/feature-bento-utilities.cjs +101 -87
- package/dist/feature-bento-utilities.js +101 -87
- package/dist/feature-checklist-three-column.cjs +75 -43
- package/dist/feature-checklist-three-column.js +75 -43
- package/dist/feature-image-overlay-badge.cjs +57 -10
- package/dist/feature-image-overlay-badge.js +57 -10
- package/dist/feature-integration-cards.cjs +105 -19
- package/dist/feature-integration-cards.js +105 -19
- package/dist/feature-utility-cards-grid.cjs +79 -9
- package/dist/feature-utility-cards-grid.js +79 -9
- package/dist/footer-animated-social.cjs +66 -10
- package/dist/footer-animated-social.d.cts +5 -1
- package/dist/footer-animated-social.d.ts +5 -1
- package/dist/footer-animated-social.js +66 -10
- package/dist/footer-contact-card.cjs +94 -44
- package/dist/footer-contact-card.d.cts +5 -1
- package/dist/footer-contact-card.d.ts +5 -1
- package/dist/footer-contact-card.js +94 -44
- package/dist/index.cjs +160 -54
- package/dist/index.js +160 -54
- package/dist/registry.cjs +486 -196
- package/dist/registry.js +486 -196
- package/package.json +1 -1
|
@@ -179,6 +179,19 @@ function Badge({
|
|
|
179
179
|
}
|
|
180
180
|
);
|
|
181
181
|
}
|
|
182
|
+
function Card({ className, ...props }) {
|
|
183
|
+
return /* @__PURE__ */ jsx(
|
|
184
|
+
"div",
|
|
185
|
+
{
|
|
186
|
+
"data-slot": "card",
|
|
187
|
+
className: cn(
|
|
188
|
+
"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
|
|
189
|
+
className
|
|
190
|
+
),
|
|
191
|
+
...props
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
}
|
|
182
195
|
function normalizePhoneNumber(input) {
|
|
183
196
|
const trimmed = input.trim();
|
|
184
197
|
if (trimmed.toLowerCase().startsWith("tel:")) {
|
|
@@ -1005,11 +1018,11 @@ function FeatureChecklistThreeColumn({
|
|
|
1005
1018
|
const renderChecklistColumn = useCallback((items, slot, gapClass) => {
|
|
1006
1019
|
if (slot) return slot;
|
|
1007
1020
|
if (!items || items.length === 0) return null;
|
|
1008
|
-
return /* @__PURE__ */ jsx("ul", { className: cn("flex flex-col",
|
|
1009
|
-
/* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/check", size:
|
|
1010
|
-
getCheckItemContent(item)
|
|
1021
|
+
return /* @__PURE__ */ jsx("ul", { className: cn("flex flex-col", gapClass, checklistClassName), children: items.map((item, index) => /* @__PURE__ */ jsxs("li", { className: cn("flex items-start gap-3", getCheckItemClassName(item)), children: [
|
|
1022
|
+
/* @__PURE__ */ jsx("span", { className: "mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/check", size: 12, className: getAccentColor(background) }) }),
|
|
1023
|
+
/* @__PURE__ */ jsx("span", { className: getTextColor(background, "muted"), children: getCheckItemContent(item) })
|
|
1011
1024
|
] }, index)) });
|
|
1012
|
-
}, [checklistClassName, getCheckItemContent, getCheckItemClassName]);
|
|
1025
|
+
}, [checklistClassName, getCheckItemContent, getCheckItemClassName, background]);
|
|
1013
1026
|
const renderCardImage = useCallback((card) => {
|
|
1014
1027
|
if (card.imageSlot) return card.imageSlot;
|
|
1015
1028
|
if (card.image) {
|
|
@@ -1033,10 +1046,10 @@ function FeatureChecklistThreeColumn({
|
|
|
1033
1046
|
Pressable,
|
|
1034
1047
|
{
|
|
1035
1048
|
href: card.link,
|
|
1036
|
-
className: "
|
|
1049
|
+
className: "flex items-center gap-2 px-5 py-4 font-medium transition-opacity hover:opacity-80 md:px-6",
|
|
1037
1050
|
children: [
|
|
1038
1051
|
card.linkLabel || "Read more",
|
|
1039
|
-
/* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/
|
|
1052
|
+
/* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
|
|
1040
1053
|
]
|
|
1041
1054
|
}
|
|
1042
1055
|
);
|
|
@@ -1044,43 +1057,62 @@ function FeatureChecklistThreeColumn({
|
|
|
1044
1057
|
const cardsContent = useMemo(() => {
|
|
1045
1058
|
if (cardsSlot) return cardsSlot;
|
|
1046
1059
|
if (!cards || cards.length === 0) return null;
|
|
1047
|
-
return cards.map((card, index) => /* @__PURE__ */ jsxs(
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
/* @__PURE__ */ jsxs("div", { className: "mb-3 px-4 pt-5 sm:px-5 md:px-6 md:pt-6", children: [
|
|
1061
|
-
card.title && (typeof card.title === "string" ? /* @__PURE__ */ jsx("h3", { className: cn("font-medium", card.titleClassName), children: card.title }) : /* @__PURE__ */ jsx("div", { className: cn("font-medium", card.titleClassName), children: card.title })),
|
|
1062
|
-
card.description && (typeof card.description === "string" ? /* @__PURE__ */ jsx("p", { className: cn(getTextColor(background, "muted"), card.descriptionClassName), children: card.description }) : /* @__PURE__ */ jsx("div", { className: cn(getTextColor(background, "muted"), card.descriptionClassName), children: card.description }))
|
|
1063
|
-
] }),
|
|
1064
|
-
/* @__PURE__ */ jsx("div", { className: "h-px border-t border-dashed" }),
|
|
1065
|
-
/* @__PURE__ */ jsx("ul", { className: getTextColor(background, "muted"), children: card.checklistItems?.map((item, itemIndex) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
1066
|
-
/* @__PURE__ */ jsxs("li", { className: cn("flex items-start gap-2 px-4 py-3 sm:px-5 md:px-6", getCheckItemClassName(item)), children: [
|
|
1067
|
-
/* @__PURE__ */ jsx(
|
|
1068
|
-
DynamicIcon,
|
|
1060
|
+
return cards.map((card, index) => /* @__PURE__ */ jsxs(
|
|
1061
|
+
Card,
|
|
1062
|
+
{
|
|
1063
|
+
className: cn(
|
|
1064
|
+
"overflow-hidden pt-0 transition-shadow duration-300 hover:shadow-lg",
|
|
1065
|
+
cardClassName,
|
|
1066
|
+
card.className
|
|
1067
|
+
),
|
|
1068
|
+
children: [
|
|
1069
|
+
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
1070
|
+
renderCardImage(card),
|
|
1071
|
+
card.badge && /* @__PURE__ */ jsx(
|
|
1072
|
+
Badge,
|
|
1069
1073
|
{
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1074
|
+
variant: "outline",
|
|
1075
|
+
className: cn(
|
|
1076
|
+
"absolute top-4 left-4 bg-background/90 backdrop-blur-sm",
|
|
1077
|
+
card.badgeClassName
|
|
1078
|
+
),
|
|
1079
|
+
children: card.badge
|
|
1073
1080
|
}
|
|
1074
|
-
)
|
|
1075
|
-
getCheckItemContent(item)
|
|
1081
|
+
)
|
|
1076
1082
|
] }),
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1083
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
|
|
1084
|
+
/* @__PURE__ */ jsxs("div", { className: "px-5 py-5 md:px-6 md:py-6", children: [
|
|
1085
|
+
card.title && (typeof card.title === "string" ? /* @__PURE__ */ jsx("h3", { className: cn("mb-2 text-lg font-semibold", card.titleClassName), children: card.title }) : /* @__PURE__ */ jsx("div", { className: cn("mb-2 text-lg font-semibold", card.titleClassName), children: card.title })),
|
|
1086
|
+
card.description && (typeof card.description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-sm leading-relaxed", getTextColor(background, "muted"), card.descriptionClassName), children: card.description }) : /* @__PURE__ */ jsx("div", { className: cn("text-sm leading-relaxed", getTextColor(background, "muted"), card.descriptionClassName), children: card.description }))
|
|
1087
|
+
] }),
|
|
1088
|
+
card.checklistItems && card.checklistItems.length > 0 && /* @__PURE__ */ jsx("ul", { className: "border-t px-5 py-4 md:px-6", children: card.checklistItems.map((item, itemIndex) => /* @__PURE__ */ jsxs(
|
|
1089
|
+
"li",
|
|
1090
|
+
{
|
|
1091
|
+
className: cn(
|
|
1092
|
+
"flex items-start gap-3 py-2",
|
|
1093
|
+
getCheckItemClassName(item)
|
|
1094
|
+
),
|
|
1095
|
+
children: [
|
|
1096
|
+
/* @__PURE__ */ jsx("span", { className: "mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(
|
|
1097
|
+
DynamicIcon,
|
|
1098
|
+
{
|
|
1099
|
+
name: "lucide/check",
|
|
1100
|
+
size: 12,
|
|
1101
|
+
className: getAccentColor(background)
|
|
1102
|
+
}
|
|
1103
|
+
) }),
|
|
1104
|
+
/* @__PURE__ */ jsx("span", { className: cn("text-sm", getTextColor(background, "muted")), children: getCheckItemContent(item) })
|
|
1105
|
+
]
|
|
1106
|
+
},
|
|
1107
|
+
itemIndex
|
|
1108
|
+
)) }),
|
|
1109
|
+
card.link && /* @__PURE__ */ jsx("div", { className: "border-t", children: renderCardLink(card) })
|
|
1110
|
+
] })
|
|
1111
|
+
]
|
|
1112
|
+
},
|
|
1113
|
+
index
|
|
1114
|
+
));
|
|
1115
|
+
}, [cardsSlot, cards, cardClassName, renderCardImage, renderCardLink, getCheckItemContent, getCheckItemClassName, background]);
|
|
1084
1116
|
return /* @__PURE__ */ jsxs(
|
|
1085
1117
|
Section,
|
|
1086
1118
|
{
|
|
@@ -1092,9 +1124,9 @@ function FeatureChecklistThreeColumn({
|
|
|
1092
1124
|
className,
|
|
1093
1125
|
containerClassName,
|
|
1094
1126
|
children: [
|
|
1095
|
-
/* @__PURE__ */ jsxs("div", { className: cn("grid gap-
|
|
1096
|
-
title && (typeof title === "string" ? /* @__PURE__ */ jsx("h2", { className: cn("mb-
|
|
1097
|
-
renderChecklistColumn(checklistColumn1, checklistColumn1Slot, "gap-
|
|
1127
|
+
/* @__PURE__ */ jsxs("div", { className: cn("grid gap-6 sm:grid-cols-2 sm:gap-8 lg:grid-cols-3 lg:gap-12", headerGridClassName), children: [
|
|
1128
|
+
title && (typeof title === "string" ? /* @__PURE__ */ jsx("h2", { className: cn("mb-2 text-2xl font-semibold text-balance sm:col-span-2 sm:text-3xl lg:col-span-1 lg:text-4xl", titleClassName), children: title }) : /* @__PURE__ */ jsx("div", { className: cn("mb-2 text-2xl font-semibold text-balance sm:col-span-2 sm:text-3xl lg:col-span-1 lg:text-4xl", titleClassName), children: title })),
|
|
1129
|
+
renderChecklistColumn(checklistColumn1, checklistColumn1Slot, "gap-4"),
|
|
1098
1130
|
renderChecklistColumn(checklistColumn2, checklistColumn2Slot, "gap-4")
|
|
1099
1131
|
] }),
|
|
1100
1132
|
/* @__PURE__ */ jsx("div", { className: cn("mt-10 grid gap-6 sm:mt-16 md:grid-cols-2 lg:grid-cols-3", cardsGridClassName), children: cardsContent })
|
|
@@ -35,6 +35,32 @@ var AvatarPrimitive__namespace = /*#__PURE__*/_interopNamespace(AvatarPrimitive)
|
|
|
35
35
|
function cn(...inputs) {
|
|
36
36
|
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
37
37
|
}
|
|
38
|
+
function getTextColor(parentBg, variant = "default", options) {
|
|
39
|
+
const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
|
|
40
|
+
if (isDark) {
|
|
41
|
+
switch (variant) {
|
|
42
|
+
case "default":
|
|
43
|
+
return "text-foreground";
|
|
44
|
+
case "muted":
|
|
45
|
+
return "text-foreground/80";
|
|
46
|
+
case "subtle":
|
|
47
|
+
return "text-foreground/60";
|
|
48
|
+
case "accent":
|
|
49
|
+
return "text-accent-foreground";
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
switch (variant) {
|
|
53
|
+
case "default":
|
|
54
|
+
return "text-foreground";
|
|
55
|
+
case "muted":
|
|
56
|
+
return "text-muted-foreground";
|
|
57
|
+
case "subtle":
|
|
58
|
+
return "text-muted-foreground/70";
|
|
59
|
+
case "accent":
|
|
60
|
+
return "text-primary";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
38
64
|
var svgCache = /* @__PURE__ */ new Map();
|
|
39
65
|
function DynamicIcon({
|
|
40
66
|
name,
|
|
@@ -1024,7 +1050,7 @@ function FeatureImageOverlayBadge({
|
|
|
1024
1050
|
overlayTitleClassName,
|
|
1025
1051
|
optixFlowConfig,
|
|
1026
1052
|
background,
|
|
1027
|
-
spacing = "py-
|
|
1053
|
+
spacing = "py-12 md:py-20 lg:py-24",
|
|
1028
1054
|
pattern,
|
|
1029
1055
|
patternOpacity,
|
|
1030
1056
|
patternClassName
|
|
@@ -1127,7 +1153,27 @@ function FeatureImageOverlayBadge({
|
|
|
1127
1153
|
children: title
|
|
1128
1154
|
}
|
|
1129
1155
|
)),
|
|
1130
|
-
description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1156
|
+
description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1157
|
+
"p",
|
|
1158
|
+
{
|
|
1159
|
+
className: cn(
|
|
1160
|
+
"text-base leading-relaxed lg:text-lg",
|
|
1161
|
+
getTextColor(background, "muted"),
|
|
1162
|
+
descriptionClassName
|
|
1163
|
+
),
|
|
1164
|
+
children: description
|
|
1165
|
+
}
|
|
1166
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1167
|
+
"div",
|
|
1168
|
+
{
|
|
1169
|
+
className: cn(
|
|
1170
|
+
"text-base leading-relaxed lg:text-lg",
|
|
1171
|
+
getTextColor(background, "muted"),
|
|
1172
|
+
descriptionClassName
|
|
1173
|
+
),
|
|
1174
|
+
children: description
|
|
1175
|
+
}
|
|
1176
|
+
)),
|
|
1131
1177
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1132
1178
|
"div",
|
|
1133
1179
|
{
|
|
@@ -1146,31 +1192,31 @@ function FeatureImageOverlayBadge({
|
|
|
1146
1192
|
"div",
|
|
1147
1193
|
{
|
|
1148
1194
|
className: cn(
|
|
1149
|
-
"absolute
|
|
1195
|
+
"absolute inset-0 rounded-2xl bg-gradient-to-t from-black/80 via-black/30 to-transparent",
|
|
1150
1196
|
overlayClassName
|
|
1151
1197
|
)
|
|
1152
1198
|
}
|
|
1153
1199
|
),
|
|
1154
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute
|
|
1200
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0 flex flex-col justify-between rounded-2xl p-5 md:p-7", children: [
|
|
1155
1201
|
(avatarSrc || avatarBadgeText) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1156
1202
|
"span",
|
|
1157
1203
|
{
|
|
1158
1204
|
className: cn(
|
|
1159
|
-
"ml-auto flex w-fit items-center gap-2 rounded-full bg-
|
|
1205
|
+
"ml-auto flex w-fit items-center gap-2 rounded-full bg-white/20 px-4 py-2.5 text-sm font-semibold text-white backdrop-blur-md shadow-lg",
|
|
1160
1206
|
avatarBadgeClassName
|
|
1161
1207
|
),
|
|
1162
1208
|
children: [
|
|
1163
|
-
avatarSrc && /* @__PURE__ */ jsxRuntime.jsx(Avatar, { className: "size-7 rounded-full", children: /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: "Avatar" }) }),
|
|
1209
|
+
avatarSrc && /* @__PURE__ */ jsxRuntime.jsx(Avatar, { className: "size-7 rounded-full ring-2 ring-white/30", children: /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: "Avatar" }) }),
|
|
1164
1210
|
avatarBadgeText
|
|
1165
1211
|
]
|
|
1166
1212
|
}
|
|
1167
1213
|
),
|
|
1168
|
-
(overlayTitle || overlayLinkText) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-
|
|
1214
|
+
(overlayTitle || overlayLinkText) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4", children: [
|
|
1169
1215
|
overlayTitle && (typeof overlayTitle === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1170
1216
|
"h4",
|
|
1171
1217
|
{
|
|
1172
1218
|
className: cn(
|
|
1173
|
-
"text-lg font-semibold lg:text-3xl",
|
|
1219
|
+
"text-lg font-semibold text-white lg:text-2xl xl:text-3xl",
|
|
1174
1220
|
overlayTitleClassName
|
|
1175
1221
|
),
|
|
1176
1222
|
children: overlayTitle
|
|
@@ -1179,7 +1225,7 @@ function FeatureImageOverlayBadge({
|
|
|
1179
1225
|
"div",
|
|
1180
1226
|
{
|
|
1181
1227
|
className: cn(
|
|
1182
|
-
"text-lg font-semibold lg:text-3xl",
|
|
1228
|
+
"text-lg font-semibold text-white lg:text-2xl xl:text-3xl",
|
|
1183
1229
|
overlayTitleClassName
|
|
1184
1230
|
),
|
|
1185
1231
|
children: overlayTitle
|
|
@@ -1190,9 +1236,10 @@ function FeatureImageOverlayBadge({
|
|
|
1190
1236
|
{
|
|
1191
1237
|
href: overlayLinkUrl,
|
|
1192
1238
|
onClick: overlayLinkOnClick,
|
|
1239
|
+
className: "flex w-fit items-center gap-2 font-medium text-white transition-opacity hover:opacity-80",
|
|
1193
1240
|
children: [
|
|
1194
1241
|
overlayLinkText,
|
|
1195
|
-
/* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/
|
|
1242
|
+
/* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
|
|
1196
1243
|
]
|
|
1197
1244
|
}
|
|
1198
1245
|
)
|
|
@@ -13,6 +13,32 @@ import { Img } from '@page-speed/img';
|
|
|
13
13
|
function cn(...inputs) {
|
|
14
14
|
return twMerge(clsx(inputs));
|
|
15
15
|
}
|
|
16
|
+
function getTextColor(parentBg, variant = "default", options) {
|
|
17
|
+
const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
|
|
18
|
+
if (isDark) {
|
|
19
|
+
switch (variant) {
|
|
20
|
+
case "default":
|
|
21
|
+
return "text-foreground";
|
|
22
|
+
case "muted":
|
|
23
|
+
return "text-foreground/80";
|
|
24
|
+
case "subtle":
|
|
25
|
+
return "text-foreground/60";
|
|
26
|
+
case "accent":
|
|
27
|
+
return "text-accent-foreground";
|
|
28
|
+
}
|
|
29
|
+
} else {
|
|
30
|
+
switch (variant) {
|
|
31
|
+
case "default":
|
|
32
|
+
return "text-foreground";
|
|
33
|
+
case "muted":
|
|
34
|
+
return "text-muted-foreground";
|
|
35
|
+
case "subtle":
|
|
36
|
+
return "text-muted-foreground/70";
|
|
37
|
+
case "accent":
|
|
38
|
+
return "text-primary";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
16
42
|
var svgCache = /* @__PURE__ */ new Map();
|
|
17
43
|
function DynamicIcon({
|
|
18
44
|
name,
|
|
@@ -1002,7 +1028,7 @@ function FeatureImageOverlayBadge({
|
|
|
1002
1028
|
overlayTitleClassName,
|
|
1003
1029
|
optixFlowConfig,
|
|
1004
1030
|
background,
|
|
1005
|
-
spacing = "py-
|
|
1031
|
+
spacing = "py-12 md:py-20 lg:py-24",
|
|
1006
1032
|
pattern,
|
|
1007
1033
|
patternOpacity,
|
|
1008
1034
|
patternClassName
|
|
@@ -1105,7 +1131,27 @@ function FeatureImageOverlayBadge({
|
|
|
1105
1131
|
children: title
|
|
1106
1132
|
}
|
|
1107
1133
|
)),
|
|
1108
|
-
description && (typeof description === "string" ? /* @__PURE__ */ jsx(
|
|
1134
|
+
description && (typeof description === "string" ? /* @__PURE__ */ jsx(
|
|
1135
|
+
"p",
|
|
1136
|
+
{
|
|
1137
|
+
className: cn(
|
|
1138
|
+
"text-base leading-relaxed lg:text-lg",
|
|
1139
|
+
getTextColor(background, "muted"),
|
|
1140
|
+
descriptionClassName
|
|
1141
|
+
),
|
|
1142
|
+
children: description
|
|
1143
|
+
}
|
|
1144
|
+
) : /* @__PURE__ */ jsx(
|
|
1145
|
+
"div",
|
|
1146
|
+
{
|
|
1147
|
+
className: cn(
|
|
1148
|
+
"text-base leading-relaxed lg:text-lg",
|
|
1149
|
+
getTextColor(background, "muted"),
|
|
1150
|
+
descriptionClassName
|
|
1151
|
+
),
|
|
1152
|
+
children: description
|
|
1153
|
+
}
|
|
1154
|
+
)),
|
|
1109
1155
|
/* @__PURE__ */ jsx(
|
|
1110
1156
|
"div",
|
|
1111
1157
|
{
|
|
@@ -1124,31 +1170,31 @@ function FeatureImageOverlayBadge({
|
|
|
1124
1170
|
"div",
|
|
1125
1171
|
{
|
|
1126
1172
|
className: cn(
|
|
1127
|
-
"absolute
|
|
1173
|
+
"absolute inset-0 rounded-2xl bg-gradient-to-t from-black/80 via-black/30 to-transparent",
|
|
1128
1174
|
overlayClassName
|
|
1129
1175
|
)
|
|
1130
1176
|
}
|
|
1131
1177
|
),
|
|
1132
|
-
/* @__PURE__ */ jsxs("div", { className: "absolute
|
|
1178
|
+
/* @__PURE__ */ jsxs("div", { className: "absolute inset-0 flex flex-col justify-between rounded-2xl p-5 md:p-7", children: [
|
|
1133
1179
|
(avatarSrc || avatarBadgeText) && /* @__PURE__ */ jsxs(
|
|
1134
1180
|
"span",
|
|
1135
1181
|
{
|
|
1136
1182
|
className: cn(
|
|
1137
|
-
"ml-auto flex w-fit items-center gap-2 rounded-full bg-
|
|
1183
|
+
"ml-auto flex w-fit items-center gap-2 rounded-full bg-white/20 px-4 py-2.5 text-sm font-semibold text-white backdrop-blur-md shadow-lg",
|
|
1138
1184
|
avatarBadgeClassName
|
|
1139
1185
|
),
|
|
1140
1186
|
children: [
|
|
1141
|
-
avatarSrc && /* @__PURE__ */ jsx(Avatar, { className: "size-7 rounded-full", children: /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: "Avatar" }) }),
|
|
1187
|
+
avatarSrc && /* @__PURE__ */ jsx(Avatar, { className: "size-7 rounded-full ring-2 ring-white/30", children: /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: "Avatar" }) }),
|
|
1142
1188
|
avatarBadgeText
|
|
1143
1189
|
]
|
|
1144
1190
|
}
|
|
1145
1191
|
),
|
|
1146
|
-
(overlayTitle || overlayLinkText) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-
|
|
1192
|
+
(overlayTitle || overlayLinkText) && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
|
|
1147
1193
|
overlayTitle && (typeof overlayTitle === "string" ? /* @__PURE__ */ jsx(
|
|
1148
1194
|
"h4",
|
|
1149
1195
|
{
|
|
1150
1196
|
className: cn(
|
|
1151
|
-
"text-lg font-semibold lg:text-3xl",
|
|
1197
|
+
"text-lg font-semibold text-white lg:text-2xl xl:text-3xl",
|
|
1152
1198
|
overlayTitleClassName
|
|
1153
1199
|
),
|
|
1154
1200
|
children: overlayTitle
|
|
@@ -1157,7 +1203,7 @@ function FeatureImageOverlayBadge({
|
|
|
1157
1203
|
"div",
|
|
1158
1204
|
{
|
|
1159
1205
|
className: cn(
|
|
1160
|
-
"text-lg font-semibold lg:text-3xl",
|
|
1206
|
+
"text-lg font-semibold text-white lg:text-2xl xl:text-3xl",
|
|
1161
1207
|
overlayTitleClassName
|
|
1162
1208
|
),
|
|
1163
1209
|
children: overlayTitle
|
|
@@ -1168,9 +1214,10 @@ function FeatureImageOverlayBadge({
|
|
|
1168
1214
|
{
|
|
1169
1215
|
href: overlayLinkUrl,
|
|
1170
1216
|
onClick: overlayLinkOnClick,
|
|
1217
|
+
className: "flex w-fit items-center gap-2 font-medium text-white transition-opacity hover:opacity-80",
|
|
1171
1218
|
children: [
|
|
1172
1219
|
overlayLinkText,
|
|
1173
|
-
/* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/
|
|
1220
|
+
/* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
|
|
1174
1221
|
]
|
|
1175
1222
|
}
|
|
1176
1223
|
)
|
|
@@ -58,6 +58,32 @@ function getTextColor(parentBg, variant = "default", options) {
|
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
+
function getAccentColor(parentBg, options) {
|
|
62
|
+
const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
|
|
63
|
+
return isDark ? "text-accent-foreground" : "text-primary";
|
|
64
|
+
}
|
|
65
|
+
function getBorderColor(parentBg, variant = "default", options) {
|
|
66
|
+
const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
|
|
67
|
+
if (isDark) {
|
|
68
|
+
switch (variant) {
|
|
69
|
+
case "default":
|
|
70
|
+
return "border-foreground/20";
|
|
71
|
+
case "muted":
|
|
72
|
+
return "border-foreground/10";
|
|
73
|
+
case "accent":
|
|
74
|
+
return "border-accent-foreground";
|
|
75
|
+
}
|
|
76
|
+
} else {
|
|
77
|
+
switch (variant) {
|
|
78
|
+
case "default":
|
|
79
|
+
return "border-border";
|
|
80
|
+
case "muted":
|
|
81
|
+
return "border-muted";
|
|
82
|
+
case "accent":
|
|
83
|
+
return "border-primary";
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
61
87
|
var svgCache = /* @__PURE__ */ new Map();
|
|
62
88
|
function DynamicIcon({
|
|
63
89
|
name,
|
|
@@ -992,11 +1018,22 @@ function FeatureIntegrationCards({
|
|
|
992
1018
|
const renderLinkLabel = React.useCallback((integration) => {
|
|
993
1019
|
if (integration.linkLabelSlot) return integration.linkLabelSlot;
|
|
994
1020
|
if (!integration.linkLabel) return null;
|
|
995
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1021
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1022
|
+
"span",
|
|
1023
|
+
{
|
|
1024
|
+
className: cn(
|
|
1025
|
+
"flex items-center gap-1.5 rounded-full border px-3 py-2 text-sm font-medium transition-colors",
|
|
1026
|
+
getBorderColor(background),
|
|
1027
|
+
getAccentColor(background),
|
|
1028
|
+
integration.linkLabelClassName
|
|
1029
|
+
),
|
|
1030
|
+
children: [
|
|
1031
|
+
integration.linkLabel,
|
|
1032
|
+
/* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 14 })
|
|
1033
|
+
]
|
|
1034
|
+
}
|
|
1035
|
+
);
|
|
1036
|
+
}, [background]);
|
|
1000
1037
|
const integrationsContent = React.useMemo(() => {
|
|
1001
1038
|
if (integrationsSlot) return integrationsSlot;
|
|
1002
1039
|
if (!integrations || integrations.length === 0) return null;
|
|
@@ -1005,35 +1042,84 @@ function FeatureIntegrationCards({
|
|
|
1005
1042
|
const linkLabelContent = renderLinkLabel(integration);
|
|
1006
1043
|
const cardContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1007
1044
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
1008
|
-
iconContent && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1045
|
+
iconContent && /* @__PURE__ */ jsxRuntime.jsx(
|
|
1046
|
+
"span",
|
|
1047
|
+
{
|
|
1048
|
+
className: cn(
|
|
1049
|
+
"grid size-12 shrink-0 place-content-center rounded-lg border bg-background/50",
|
|
1050
|
+
getBorderColor(background)
|
|
1051
|
+
),
|
|
1052
|
+
children: iconContent
|
|
1053
|
+
}
|
|
1054
|
+
),
|
|
1009
1055
|
linkLabelContent
|
|
1010
1056
|
] }),
|
|
1011
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1012
|
-
integration.title && (typeof integration.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1013
|
-
|
|
1057
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
1058
|
+
integration.title && (typeof integration.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1059
|
+
"h3",
|
|
1060
|
+
{
|
|
1061
|
+
className: cn(
|
|
1062
|
+
"font-semibold md:text-lg",
|
|
1063
|
+
getTextColor(background),
|
|
1064
|
+
integration.titleClassName
|
|
1065
|
+
),
|
|
1066
|
+
children: integration.title
|
|
1067
|
+
}
|
|
1068
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1069
|
+
"div",
|
|
1070
|
+
{
|
|
1071
|
+
className: cn(
|
|
1072
|
+
"font-semibold md:text-lg",
|
|
1073
|
+
getTextColor(background),
|
|
1074
|
+
integration.titleClassName
|
|
1075
|
+
),
|
|
1076
|
+
children: integration.title
|
|
1077
|
+
}
|
|
1078
|
+
)),
|
|
1079
|
+
integration.description && (typeof integration.description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1080
|
+
"p",
|
|
1081
|
+
{
|
|
1082
|
+
className: cn(
|
|
1083
|
+
"text-sm leading-relaxed md:text-base",
|
|
1084
|
+
getTextColor(background, "muted"),
|
|
1085
|
+
integration.descriptionClassName
|
|
1086
|
+
),
|
|
1087
|
+
children: integration.description
|
|
1088
|
+
}
|
|
1089
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1090
|
+
"div",
|
|
1091
|
+
{
|
|
1092
|
+
className: cn(
|
|
1093
|
+
"text-sm leading-relaxed md:text-base",
|
|
1094
|
+
getTextColor(background, "muted"),
|
|
1095
|
+
integration.descriptionClassName
|
|
1096
|
+
),
|
|
1097
|
+
children: integration.description
|
|
1098
|
+
}
|
|
1099
|
+
))
|
|
1014
1100
|
] })
|
|
1015
1101
|
] });
|
|
1102
|
+
const cardClasses = cn(
|
|
1103
|
+
"flex flex-col gap-5 rounded-xl border p-6 transition-all duration-300",
|
|
1104
|
+
getBorderColor(background),
|
|
1105
|
+
"hover:shadow-lg",
|
|
1106
|
+
cardClassName,
|
|
1107
|
+
integration.className
|
|
1108
|
+
);
|
|
1016
1109
|
if (integration.link) {
|
|
1017
1110
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1018
1111
|
Pressable,
|
|
1019
1112
|
{
|
|
1020
1113
|
href: integration.link,
|
|
1021
|
-
className:
|
|
1114
|
+
className: cardClasses,
|
|
1022
1115
|
children: cardContent
|
|
1023
1116
|
},
|
|
1024
1117
|
index
|
|
1025
1118
|
);
|
|
1026
1119
|
}
|
|
1027
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1028
|
-
"div",
|
|
1029
|
-
{
|
|
1030
|
-
className: cn("flex flex-col gap-4 rounded-xl border p-6 transition-colors duration-300", cardClassName, integration.className),
|
|
1031
|
-
children: cardContent
|
|
1032
|
-
},
|
|
1033
|
-
index
|
|
1034
|
-
);
|
|
1120
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cardClasses, children: cardContent }, index);
|
|
1035
1121
|
});
|
|
1036
|
-
}, [integrationsSlot, integrations, cardClassName, renderIntegrationIcon, renderLinkLabel]);
|
|
1122
|
+
}, [integrationsSlot, integrations, cardClassName, renderIntegrationIcon, renderLinkLabel, background]);
|
|
1037
1123
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1038
1124
|
Section,
|
|
1039
1125
|
{
|