@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.
@@ -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", getTextColor(background, "muted"), gapClass, checklistClassName), children: items.map((item, index) => /* @__PURE__ */ jsxs("li", { className: cn("flex items-center gap-2", getCheckItemClassName(item)), children: [
1009
- /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/check", size: 16, className: getAccentColor(background) }),
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: "my-3 flex items-center gap-2 px-4 font-medium sm:my-4 sm:px-5 md:px-6",
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/chevron-right", size: 16, className: "mt-0.5" })
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("div", { className: cn("rounded-lg border", cardClassName, card.className), children: [
1048
- /* @__PURE__ */ jsxs("div", { className: "relative p-1", children: [
1049
- renderCardImage(card),
1050
- card.badge && /* @__PURE__ */ jsx(
1051
- Badge,
1052
- {
1053
- variant: "outline",
1054
- className: cn("absolute top-5 left-5 bg-background", card.badgeClassName),
1055
- children: card.badge
1056
- }
1057
- )
1058
- ] }),
1059
- /* @__PURE__ */ jsxs("div", { children: [
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
- name: "lucide/check",
1071
- size: 16,
1072
- className: cn("mt-1 shrink-0", getAccentColor(background))
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
- card.checklistItems && itemIndex < card.checklistItems.length - 1 && /* @__PURE__ */ jsx("div", { className: "h-px border-t border-dashed" })
1078
- ] }, itemIndex)) }),
1079
- /* @__PURE__ */ jsx("div", { className: "h-px border-t border-dashed" }),
1080
- renderCardLink(card)
1081
- ] })
1082
- ] }, index));
1083
- }, [cardsSlot, cards, cardClassName, renderCardImage, renderCardLink, getCheckItemContent, getCheckItemClassName]);
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-4 sm:grid-cols-2 sm:gap-8 md:gap-12 lg:grid-cols-3 lg:gap-16", headerGridClassName), children: [
1096
- title && (typeof title === "string" ? /* @__PURE__ */ jsx("h2", { className: cn("mb-4 text-3xl font-medium sm:col-span-2 sm:text-4xl md:mb-0 lg:col-span-1", titleClassName), children: title }) : /* @__PURE__ */ jsx("div", { className: cn("mb-4 text-3xl font-medium sm:col-span-2 sm:text-4xl md:mb-0 lg:col-span-1", titleClassName), children: title })),
1097
- renderChecklistColumn(checklistColumn1, checklistColumn1Slot, "gap-3 sm:gap-4"),
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-6 md:py-32",
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("p", { className: cn("lg:text-lg", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("lg:text-lg", descriptionClassName), children: description })),
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 top-0 right-0 bottom-0 left-0 rounded-2xl bg-linear-to-t from-foreground via-foreground/20 to-transparent",
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 top-0 flex h-full w-full flex-col justify-between pt-4 pr-4 pl-4 pb-8 md:pt-7 md:bpr-7 md:pl-7 md:pb-7 rounded-2xl", children: [
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-foreground/30 px-4 py-2.5 text-sm font-semibold backdrop-blur-sm shadow-xl",
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-5", children: [
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/chevron-right", size: 18 })
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-6 md:py-32",
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("p", { className: cn("lg:text-lg", descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: cn("lg:text-lg", descriptionClassName), children: description })),
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 top-0 right-0 bottom-0 left-0 rounded-2xl bg-linear-to-t from-foreground via-foreground/20 to-transparent",
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 top-0 flex h-full w-full flex-col justify-between pt-4 pr-4 pl-4 pb-8 md:pt-7 md:bpr-7 md:pl-7 md:pb-7 rounded-2xl", children: [
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-foreground/30 px-4 py-2.5 text-sm font-semibold backdrop-blur-sm shadow-xl",
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-5", children: [
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/chevron-right", size: 18 })
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("span", { className: cn("flex items-center gap-1 rounded-full border px-3 py-2.5 text-sm", integration.linkLabelClassName), children: [
996
- integration.linkLabel,
997
- /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
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("span", { className: "grid size-12 shrink-0 place-content-center rounded-md border", children: iconContent }),
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("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 })),
1013
- integration.description && (typeof integration.description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-sm md:text-base", getTextColor(background, "muted"), integration.descriptionClassName), children: integration.description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-sm md:text-base", getTextColor(background, "muted"), integration.descriptionClassName), children: integration.description }))
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: cn("flex flex-col gap-4 rounded-xl border p-6 transition-colors duration-300", cardClassName, integration.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
  {