@opensite/ui 0.8.4 → 0.8.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.
Files changed (51) hide show
  1. package/dist/article-breadcrumb-social.cjs +57 -73
  2. package/dist/article-breadcrumb-social.d.cts +2 -24
  3. package/dist/article-breadcrumb-social.d.ts +2 -24
  4. package/dist/article-breadcrumb-social.js +57 -73
  5. package/dist/article-compact-toc.cjs +1 -1
  6. package/dist/article-compact-toc.js +1 -1
  7. package/dist/article-sidebar-sticky.cjs +73 -26
  8. package/dist/article-sidebar-sticky.js +73 -26
  9. package/dist/blog-horizontal-timeline.cjs +7 -4
  10. package/dist/blog-horizontal-timeline.js +7 -4
  11. package/dist/faq-split-hero.cjs +704 -0
  12. package/dist/faq-split-hero.d.cts +118 -0
  13. package/dist/faq-split-hero.d.ts +118 -0
  14. package/dist/faq-split-hero.js +682 -0
  15. package/dist/feature-badge-grid-six.cjs +1 -1
  16. package/dist/feature-badge-grid-six.js +1 -1
  17. package/dist/feature-card-grid-linked.cjs +92 -22
  18. package/dist/feature-card-grid-linked.js +92 -22
  19. package/dist/feature-carousel-progress.cjs +1 -1
  20. package/dist/feature-carousel-progress.js +1 -1
  21. package/dist/feature-checklist-image.cjs +88 -15
  22. package/dist/feature-checklist-image.js +88 -15
  23. package/dist/feature-checklist-three-column.cjs +1 -1
  24. package/dist/feature-checklist-three-column.js +1 -1
  25. package/dist/feature-icon-grid-accent.cjs +50 -8
  26. package/dist/feature-icon-grid-accent.js +50 -8
  27. package/dist/feature-icon-grid-bordered.cjs +84 -14
  28. package/dist/feature-icon-grid-bordered.js +84 -14
  29. package/dist/feature-icon-tabs-content.cjs +217 -84
  30. package/dist/feature-icon-tabs-content.js +217 -84
  31. package/dist/feature-image-overlay-badge.cjs +106 -33
  32. package/dist/feature-image-overlay-badge.js +106 -33
  33. package/dist/feature-numbered-cards.cjs +154 -35
  34. package/dist/feature-numbered-cards.js +154 -35
  35. package/dist/feature-showcase.cjs +67 -71
  36. package/dist/feature-showcase.d.cts +1 -5
  37. package/dist/feature-showcase.d.ts +1 -5
  38. package/dist/feature-showcase.js +68 -72
  39. package/dist/feature-split-image-reverse.cjs +90 -15
  40. package/dist/feature-split-image-reverse.js +90 -15
  41. package/dist/feature-split-image.cjs +87 -15
  42. package/dist/feature-split-image.js +87 -15
  43. package/dist/feature-stats-highlight.cjs +2 -2
  44. package/dist/feature-stats-highlight.js +2 -2
  45. package/dist/feature-tabbed-content-image.cjs +207 -72
  46. package/dist/feature-tabbed-content-image.js +207 -72
  47. package/dist/feature-three-column-values.cjs +107 -14
  48. package/dist/feature-three-column-values.js +107 -14
  49. package/dist/registry.cjs +1460 -461
  50. package/dist/registry.js +1460 -461
  51. package/package.json +1 -1
@@ -1009,31 +1009,57 @@ function FeatureTabbedContentImage({
1009
1009
  contentGridClassName,
1010
1010
  optixFlowConfig,
1011
1011
  background,
1012
- spacing,
1012
+ spacing = "py-6 md:py-32",
1013
1013
  pattern,
1014
1014
  patternOpacity,
1015
1015
  patternClassName
1016
1016
  }) {
1017
- const renderFeatures = React__namespace.useCallback((slide) => {
1018
- if (slide.featuresSlot) return slide.featuresSlot;
1019
- if (!slide.features || slide.features.length === 0) return null;
1020
- return slide.features.map((feature, index) => {
1021
- const isString = typeof feature === "string";
1022
- const content = isString ? feature : feature.content;
1023
- const iconElement = isString ? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/check-circle-2", size: 16 }) : feature.icon ?? (feature.iconName ? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: feature.iconName, size: 16 }) : /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/check-circle-2", size: 16 }));
1024
- const itemClassName = isString ? void 0 : feature.className;
1025
- return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("flex items-center gap-2", itemClassName), children: [
1026
- iconElement,
1027
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: content })
1028
- ] }, index);
1029
- });
1030
- }, []);
1031
- const renderActions = React__namespace.useCallback((slide) => {
1032
- if (slide.actionsSlot) return slide.actionsSlot;
1033
- if (!slide.actions || slide.actions.length === 0) return null;
1034
- return slide.actions.map((action, index) => {
1035
- if (action.children) {
1036
- return /* @__PURE__ */ jsxRuntime.jsx(
1017
+ const renderFeatures = React__namespace.useCallback(
1018
+ (slide) => {
1019
+ if (slide.featuresSlot) return slide.featuresSlot;
1020
+ if (!slide.features || slide.features.length === 0) return null;
1021
+ return slide.features.map((feature, index) => {
1022
+ const isString = typeof feature === "string";
1023
+ const content = isString ? feature : feature.content;
1024
+ const iconElement = isString ? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/check-circle-2", size: 16 }) : feature.icon ?? (feature.iconName ? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: feature.iconName, size: 16 }) : /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/check-circle-2", size: 16 }));
1025
+ const itemClassName = isString ? void 0 : feature.className;
1026
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1027
+ "li",
1028
+ {
1029
+ className: cn("flex items-center gap-2", itemClassName),
1030
+ children: [
1031
+ iconElement,
1032
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: content })
1033
+ ]
1034
+ },
1035
+ index
1036
+ );
1037
+ });
1038
+ },
1039
+ []
1040
+ );
1041
+ const renderActions = React__namespace.useCallback(
1042
+ (slide) => {
1043
+ if (slide.actionsSlot) return slide.actionsSlot;
1044
+ if (!slide.actions || slide.actions.length === 0) return null;
1045
+ return slide.actions.map((action, index) => {
1046
+ if (action.children) {
1047
+ return /* @__PURE__ */ jsxRuntime.jsx(
1048
+ Pressable,
1049
+ {
1050
+ href: action.href,
1051
+ onClick: action.onClick,
1052
+ variant: action.variant,
1053
+ size: action.size,
1054
+ className: cn("mt-8", action.className),
1055
+ "aria-label": action["aria-label"],
1056
+ asButton: true,
1057
+ children: action.children
1058
+ },
1059
+ index
1060
+ );
1061
+ }
1062
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1037
1063
  Pressable,
1038
1064
  {
1039
1065
  href: action.href,
@@ -1043,46 +1069,39 @@ function FeatureTabbedContentImage({
1043
1069
  className: cn("mt-8", action.className),
1044
1070
  "aria-label": action["aria-label"],
1045
1071
  asButton: true,
1046
- children: action.children
1072
+ children: [
1073
+ action.icon,
1074
+ action.label,
1075
+ action.iconAfter
1076
+ ]
1047
1077
  },
1048
1078
  index
1049
1079
  );
1050
- }
1051
- return /* @__PURE__ */ jsxRuntime.jsxs(
1052
- Pressable,
1080
+ });
1081
+ },
1082
+ []
1083
+ );
1084
+ const renderImage = React__namespace.useCallback(
1085
+ (slide) => {
1086
+ if (slide.imageSlot) return slide.imageSlot;
1087
+ if (!slide.image) return null;
1088
+ const imageAlt = slide.imageAlt || (typeof slide.title === "string" ? slide.title : "Tab content image");
1089
+ return /* @__PURE__ */ jsxRuntime.jsx(
1090
+ img.Img,
1053
1091
  {
1054
- href: action.href,
1055
- onClick: action.onClick,
1056
- variant: action.variant,
1057
- size: action.size,
1058
- className: cn("mt-8", action.className),
1059
- "aria-label": action["aria-label"],
1060
- asButton: true,
1061
- children: [
1062
- action.icon,
1063
- action.label,
1064
- action.iconAfter
1065
- ]
1066
- },
1067
- index
1092
+ src: slide.image,
1093
+ alt: imageAlt,
1094
+ className: cn(
1095
+ "order-first max-h-[400px] w-full rounded-lg object-cover md:order-last",
1096
+ slide.imageClassName
1097
+ ),
1098
+ loading: "lazy",
1099
+ optixFlowConfig
1100
+ }
1068
1101
  );
1069
- });
1070
- }, []);
1071
- const renderImage = React__namespace.useCallback((slide) => {
1072
- if (slide.imageSlot) return slide.imageSlot;
1073
- if (!slide.image) return null;
1074
- const imageAlt = slide.imageAlt || (typeof slide.title === "string" ? slide.title : "Tab content image");
1075
- return /* @__PURE__ */ jsxRuntime.jsx(
1076
- img.Img,
1077
- {
1078
- src: slide.image,
1079
- alt: imageAlt,
1080
- className: cn("order-first max-h-[400px] w-full rounded-lg object-cover md:order-last", slide.imageClassName),
1081
- loading: "lazy",
1082
- optixFlowConfig
1083
- }
1084
- );
1085
- }, [optixFlowConfig]);
1102
+ },
1103
+ [optixFlowConfig]
1104
+ );
1086
1105
  const slidesContent = React.useMemo(() => {
1087
1106
  if (slidesSlot) return slidesSlot;
1088
1107
  if (!slides || slides.length === 0) return null;
@@ -1091,7 +1110,10 @@ function FeatureTabbedContentImage({
1091
1110
  TabsTrigger,
1092
1111
  {
1093
1112
  value: slide.id.toString(),
1094
- className: cn("text-sm hover:bg-background md:text-base", tabTriggerClassName),
1113
+ className: cn(
1114
+ "text-sm hover:bg-background md:text-base",
1115
+ tabTriggerClassName
1116
+ ),
1095
1117
  children: slide.tabName
1096
1118
  },
1097
1119
  slide.id
@@ -1101,20 +1123,85 @@ function FeatureTabbedContentImage({
1101
1123
  {
1102
1124
  value: slide.id.toString(),
1103
1125
  className: cn("max-w-5xl", tabContentClassName),
1104
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("grid grid-cols-1 items-center gap-10 md:grid-cols-2", contentGridClassName, slide.className), children: [
1105
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1106
- slide.title && (typeof slide.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: cn("mb-4 text-2xl font-semibold lg:text-4xl", slide.titleClassName), children: slide.title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mb-4 text-2xl font-semibold lg:text-4xl", slide.titleClassName), children: slide.title })),
1107
- slide.description && (typeof slide.description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-muted-foreground lg:text-xl", slide.descriptionClassName), children: slide.description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-muted-foreground lg:text-xl", slide.descriptionClassName), children: slide.description })),
1108
- slide.features && slide.features.length > 0 || slide.featuresSlot ? /* @__PURE__ */ jsxRuntime.jsx("ul", { className: cn("mt-8 grid grid-cols-1 gap-2 lg:grid-cols-2", slide.featuresClassName), children: renderFeatures(slide) }) : null,
1109
- renderActions(slide)
1110
- ] }),
1111
- renderImage(slide)
1112
- ] })
1126
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
1127
+ "div",
1128
+ {
1129
+ className: cn(
1130
+ "grid grid-cols-1 items-center gap-10 md:grid-cols-2",
1131
+ contentGridClassName,
1132
+ slide.className
1133
+ ),
1134
+ children: [
1135
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1136
+ slide.title && (typeof slide.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1137
+ "h2",
1138
+ {
1139
+ className: cn(
1140
+ "mb-4 text-2xl font-semibold lg:text-4xl",
1141
+ slide.titleClassName
1142
+ ),
1143
+ children: slide.title
1144
+ }
1145
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1146
+ "div",
1147
+ {
1148
+ className: cn(
1149
+ "mb-4 text-2xl font-semibold lg:text-4xl",
1150
+ slide.titleClassName
1151
+ ),
1152
+ children: slide.title
1153
+ }
1154
+ )),
1155
+ slide.description && (typeof slide.description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1156
+ "p",
1157
+ {
1158
+ className: cn(
1159
+ "text-muted-foreground lg:text-xl",
1160
+ slide.descriptionClassName
1161
+ ),
1162
+ children: slide.description
1163
+ }
1164
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1165
+ "div",
1166
+ {
1167
+ className: cn(
1168
+ "text-muted-foreground lg:text-xl",
1169
+ slide.descriptionClassName
1170
+ ),
1171
+ children: slide.description
1172
+ }
1173
+ )),
1174
+ slide.features && slide.features.length > 0 || slide.featuresSlot ? /* @__PURE__ */ jsxRuntime.jsx(
1175
+ "ul",
1176
+ {
1177
+ className: cn(
1178
+ "mt-8 grid grid-cols-1 gap-2 lg:grid-cols-2",
1179
+ slide.featuresClassName
1180
+ ),
1181
+ children: renderFeatures(slide)
1182
+ }
1183
+ ) : null,
1184
+ renderActions(slide)
1185
+ ] }),
1186
+ renderImage(slide)
1187
+ ]
1188
+ }
1189
+ )
1113
1190
  },
1114
1191
  slide.id
1115
1192
  ))
1116
1193
  ] });
1117
- }, [slidesSlot, slides, tabsListClassName, tabTriggerClassName, tabContentClassName, contentGridClassName, renderFeatures, renderActions, renderImage]);
1194
+ }, [
1195
+ slidesSlot,
1196
+ slides,
1197
+ tabsListClassName,
1198
+ tabTriggerClassName,
1199
+ tabContentClassName,
1200
+ contentGridClassName,
1201
+ renderFeatures,
1202
+ renderActions,
1203
+ renderImage
1204
+ ]);
1118
1205
  const effectiveDefaultTab = React.useMemo(() => {
1119
1206
  if (defaultTab) return defaultTab;
1120
1207
  if (slides && slides.length > 0) return slides[0].id.toString();
@@ -1131,15 +1218,63 @@ function FeatureTabbedContentImage({
1131
1218
  className,
1132
1219
  containerClassName,
1133
1220
  children: [
1134
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mx-auto flex max-w-3xl flex-col items-center gap-6", headerClassName), children: [
1135
- title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: cn("text-center text-3xl font-semibold lg:text-5xl", titleClassName), children: title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-center text-3xl font-semibold lg:text-5xl", titleClassName), children: title })),
1136
- description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-center text-balance text-muted-foreground lg:text-xl", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-center text-balance text-muted-foreground lg:text-xl", descriptionClassName), children: description }))
1137
- ] }),
1221
+ /* @__PURE__ */ jsxRuntime.jsxs(
1222
+ "div",
1223
+ {
1224
+ className: cn(
1225
+ "mx-auto flex max-w-3xl flex-col items-center gap-6",
1226
+ headerClassName
1227
+ ),
1228
+ children: [
1229
+ title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1230
+ "h2",
1231
+ {
1232
+ className: cn(
1233
+ "text-center text-3xl font-semibold lg:text-5xl",
1234
+ titleClassName
1235
+ ),
1236
+ children: title
1237
+ }
1238
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1239
+ "div",
1240
+ {
1241
+ className: cn(
1242
+ "text-center text-3xl font-semibold lg:text-5xl",
1243
+ titleClassName
1244
+ ),
1245
+ children: title
1246
+ }
1247
+ )),
1248
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1249
+ "p",
1250
+ {
1251
+ className: cn(
1252
+ "text-center text-balance text-muted-foreground lg:text-xl",
1253
+ descriptionClassName
1254
+ ),
1255
+ children: description
1256
+ }
1257
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1258
+ "div",
1259
+ {
1260
+ className: cn(
1261
+ "text-center text-balance text-muted-foreground lg:text-xl",
1262
+ descriptionClassName
1263
+ ),
1264
+ children: description
1265
+ }
1266
+ ))
1267
+ ]
1268
+ }
1269
+ ),
1138
1270
  (slidesSlot || slides && slides.length > 0) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mt-12", tabsWrapperClassName), children: /* @__PURE__ */ jsxRuntime.jsx(
1139
1271
  Tabs,
1140
1272
  {
1141
1273
  defaultValue: effectiveDefaultTab,
1142
- className: cn("mx-auto flex w-fit flex-col items-center gap-8 md:gap-12", tabsClassName),
1274
+ className: cn(
1275
+ "mx-auto flex w-fit flex-col items-center gap-8 md:gap-12",
1276
+ tabsClassName
1277
+ ),
1143
1278
  children: slidesContent
1144
1279
  }
1145
1280
  ) })
@@ -987,31 +987,57 @@ function FeatureTabbedContentImage({
987
987
  contentGridClassName,
988
988
  optixFlowConfig,
989
989
  background,
990
- spacing,
990
+ spacing = "py-6 md:py-32",
991
991
  pattern,
992
992
  patternOpacity,
993
993
  patternClassName
994
994
  }) {
995
- const renderFeatures = React.useCallback((slide) => {
996
- if (slide.featuresSlot) return slide.featuresSlot;
997
- if (!slide.features || slide.features.length === 0) return null;
998
- return slide.features.map((feature, index) => {
999
- const isString = typeof feature === "string";
1000
- const content = isString ? feature : feature.content;
1001
- const iconElement = isString ? /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/check-circle-2", size: 16 }) : feature.icon ?? (feature.iconName ? /* @__PURE__ */ jsx(DynamicIcon, { name: feature.iconName, size: 16 }) : /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/check-circle-2", size: 16 }));
1002
- const itemClassName = isString ? void 0 : feature.className;
1003
- return /* @__PURE__ */ jsxs("li", { className: cn("flex items-center gap-2", itemClassName), children: [
1004
- iconElement,
1005
- /* @__PURE__ */ jsx("span", { className: "font-medium", children: content })
1006
- ] }, index);
1007
- });
1008
- }, []);
1009
- const renderActions = React.useCallback((slide) => {
1010
- if (slide.actionsSlot) return slide.actionsSlot;
1011
- if (!slide.actions || slide.actions.length === 0) return null;
1012
- return slide.actions.map((action, index) => {
1013
- if (action.children) {
1014
- return /* @__PURE__ */ jsx(
995
+ const renderFeatures = React.useCallback(
996
+ (slide) => {
997
+ if (slide.featuresSlot) return slide.featuresSlot;
998
+ if (!slide.features || slide.features.length === 0) return null;
999
+ return slide.features.map((feature, index) => {
1000
+ const isString = typeof feature === "string";
1001
+ const content = isString ? feature : feature.content;
1002
+ const iconElement = isString ? /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/check-circle-2", size: 16 }) : feature.icon ?? (feature.iconName ? /* @__PURE__ */ jsx(DynamicIcon, { name: feature.iconName, size: 16 }) : /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/check-circle-2", size: 16 }));
1003
+ const itemClassName = isString ? void 0 : feature.className;
1004
+ return /* @__PURE__ */ jsxs(
1005
+ "li",
1006
+ {
1007
+ className: cn("flex items-center gap-2", itemClassName),
1008
+ children: [
1009
+ iconElement,
1010
+ /* @__PURE__ */ jsx("span", { className: "font-medium", children: content })
1011
+ ]
1012
+ },
1013
+ index
1014
+ );
1015
+ });
1016
+ },
1017
+ []
1018
+ );
1019
+ const renderActions = React.useCallback(
1020
+ (slide) => {
1021
+ if (slide.actionsSlot) return slide.actionsSlot;
1022
+ if (!slide.actions || slide.actions.length === 0) return null;
1023
+ return slide.actions.map((action, index) => {
1024
+ if (action.children) {
1025
+ return /* @__PURE__ */ jsx(
1026
+ Pressable,
1027
+ {
1028
+ href: action.href,
1029
+ onClick: action.onClick,
1030
+ variant: action.variant,
1031
+ size: action.size,
1032
+ className: cn("mt-8", action.className),
1033
+ "aria-label": action["aria-label"],
1034
+ asButton: true,
1035
+ children: action.children
1036
+ },
1037
+ index
1038
+ );
1039
+ }
1040
+ return /* @__PURE__ */ jsxs(
1015
1041
  Pressable,
1016
1042
  {
1017
1043
  href: action.href,
@@ -1021,46 +1047,39 @@ function FeatureTabbedContentImage({
1021
1047
  className: cn("mt-8", action.className),
1022
1048
  "aria-label": action["aria-label"],
1023
1049
  asButton: true,
1024
- children: action.children
1050
+ children: [
1051
+ action.icon,
1052
+ action.label,
1053
+ action.iconAfter
1054
+ ]
1025
1055
  },
1026
1056
  index
1027
1057
  );
1028
- }
1029
- return /* @__PURE__ */ jsxs(
1030
- Pressable,
1058
+ });
1059
+ },
1060
+ []
1061
+ );
1062
+ const renderImage = React.useCallback(
1063
+ (slide) => {
1064
+ if (slide.imageSlot) return slide.imageSlot;
1065
+ if (!slide.image) return null;
1066
+ const imageAlt = slide.imageAlt || (typeof slide.title === "string" ? slide.title : "Tab content image");
1067
+ return /* @__PURE__ */ jsx(
1068
+ Img,
1031
1069
  {
1032
- href: action.href,
1033
- onClick: action.onClick,
1034
- variant: action.variant,
1035
- size: action.size,
1036
- className: cn("mt-8", action.className),
1037
- "aria-label": action["aria-label"],
1038
- asButton: true,
1039
- children: [
1040
- action.icon,
1041
- action.label,
1042
- action.iconAfter
1043
- ]
1044
- },
1045
- index
1070
+ src: slide.image,
1071
+ alt: imageAlt,
1072
+ className: cn(
1073
+ "order-first max-h-[400px] w-full rounded-lg object-cover md:order-last",
1074
+ slide.imageClassName
1075
+ ),
1076
+ loading: "lazy",
1077
+ optixFlowConfig
1078
+ }
1046
1079
  );
1047
- });
1048
- }, []);
1049
- const renderImage = React.useCallback((slide) => {
1050
- if (slide.imageSlot) return slide.imageSlot;
1051
- if (!slide.image) return null;
1052
- const imageAlt = slide.imageAlt || (typeof slide.title === "string" ? slide.title : "Tab content image");
1053
- return /* @__PURE__ */ jsx(
1054
- Img,
1055
- {
1056
- src: slide.image,
1057
- alt: imageAlt,
1058
- className: cn("order-first max-h-[400px] w-full rounded-lg object-cover md:order-last", slide.imageClassName),
1059
- loading: "lazy",
1060
- optixFlowConfig
1061
- }
1062
- );
1063
- }, [optixFlowConfig]);
1080
+ },
1081
+ [optixFlowConfig]
1082
+ );
1064
1083
  const slidesContent = useMemo(() => {
1065
1084
  if (slidesSlot) return slidesSlot;
1066
1085
  if (!slides || slides.length === 0) return null;
@@ -1069,7 +1088,10 @@ function FeatureTabbedContentImage({
1069
1088
  TabsTrigger,
1070
1089
  {
1071
1090
  value: slide.id.toString(),
1072
- className: cn("text-sm hover:bg-background md:text-base", tabTriggerClassName),
1091
+ className: cn(
1092
+ "text-sm hover:bg-background md:text-base",
1093
+ tabTriggerClassName
1094
+ ),
1073
1095
  children: slide.tabName
1074
1096
  },
1075
1097
  slide.id
@@ -1079,20 +1101,85 @@ function FeatureTabbedContentImage({
1079
1101
  {
1080
1102
  value: slide.id.toString(),
1081
1103
  className: cn("max-w-5xl", tabContentClassName),
1082
- children: /* @__PURE__ */ jsxs("div", { className: cn("grid grid-cols-1 items-center gap-10 md:grid-cols-2", contentGridClassName, slide.className), children: [
1083
- /* @__PURE__ */ jsxs("div", { children: [
1084
- slide.title && (typeof slide.title === "string" ? /* @__PURE__ */ jsx("h2", { className: cn("mb-4 text-2xl font-semibold lg:text-4xl", slide.titleClassName), children: slide.title }) : /* @__PURE__ */ jsx("div", { className: cn("mb-4 text-2xl font-semibold lg:text-4xl", slide.titleClassName), children: slide.title })),
1085
- slide.description && (typeof slide.description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-muted-foreground lg:text-xl", slide.descriptionClassName), children: slide.description }) : /* @__PURE__ */ jsx("div", { className: cn("text-muted-foreground lg:text-xl", slide.descriptionClassName), children: slide.description })),
1086
- slide.features && slide.features.length > 0 || slide.featuresSlot ? /* @__PURE__ */ jsx("ul", { className: cn("mt-8 grid grid-cols-1 gap-2 lg:grid-cols-2", slide.featuresClassName), children: renderFeatures(slide) }) : null,
1087
- renderActions(slide)
1088
- ] }),
1089
- renderImage(slide)
1090
- ] })
1104
+ children: /* @__PURE__ */ jsxs(
1105
+ "div",
1106
+ {
1107
+ className: cn(
1108
+ "grid grid-cols-1 items-center gap-10 md:grid-cols-2",
1109
+ contentGridClassName,
1110
+ slide.className
1111
+ ),
1112
+ children: [
1113
+ /* @__PURE__ */ jsxs("div", { children: [
1114
+ slide.title && (typeof slide.title === "string" ? /* @__PURE__ */ jsx(
1115
+ "h2",
1116
+ {
1117
+ className: cn(
1118
+ "mb-4 text-2xl font-semibold lg:text-4xl",
1119
+ slide.titleClassName
1120
+ ),
1121
+ children: slide.title
1122
+ }
1123
+ ) : /* @__PURE__ */ jsx(
1124
+ "div",
1125
+ {
1126
+ className: cn(
1127
+ "mb-4 text-2xl font-semibold lg:text-4xl",
1128
+ slide.titleClassName
1129
+ ),
1130
+ children: slide.title
1131
+ }
1132
+ )),
1133
+ slide.description && (typeof slide.description === "string" ? /* @__PURE__ */ jsx(
1134
+ "p",
1135
+ {
1136
+ className: cn(
1137
+ "text-muted-foreground lg:text-xl",
1138
+ slide.descriptionClassName
1139
+ ),
1140
+ children: slide.description
1141
+ }
1142
+ ) : /* @__PURE__ */ jsx(
1143
+ "div",
1144
+ {
1145
+ className: cn(
1146
+ "text-muted-foreground lg:text-xl",
1147
+ slide.descriptionClassName
1148
+ ),
1149
+ children: slide.description
1150
+ }
1151
+ )),
1152
+ slide.features && slide.features.length > 0 || slide.featuresSlot ? /* @__PURE__ */ jsx(
1153
+ "ul",
1154
+ {
1155
+ className: cn(
1156
+ "mt-8 grid grid-cols-1 gap-2 lg:grid-cols-2",
1157
+ slide.featuresClassName
1158
+ ),
1159
+ children: renderFeatures(slide)
1160
+ }
1161
+ ) : null,
1162
+ renderActions(slide)
1163
+ ] }),
1164
+ renderImage(slide)
1165
+ ]
1166
+ }
1167
+ )
1091
1168
  },
1092
1169
  slide.id
1093
1170
  ))
1094
1171
  ] });
1095
- }, [slidesSlot, slides, tabsListClassName, tabTriggerClassName, tabContentClassName, contentGridClassName, renderFeatures, renderActions, renderImage]);
1172
+ }, [
1173
+ slidesSlot,
1174
+ slides,
1175
+ tabsListClassName,
1176
+ tabTriggerClassName,
1177
+ tabContentClassName,
1178
+ contentGridClassName,
1179
+ renderFeatures,
1180
+ renderActions,
1181
+ renderImage
1182
+ ]);
1096
1183
  const effectiveDefaultTab = useMemo(() => {
1097
1184
  if (defaultTab) return defaultTab;
1098
1185
  if (slides && slides.length > 0) return slides[0].id.toString();
@@ -1109,15 +1196,63 @@ function FeatureTabbedContentImage({
1109
1196
  className,
1110
1197
  containerClassName,
1111
1198
  children: [
1112
- /* @__PURE__ */ jsxs("div", { className: cn("mx-auto flex max-w-3xl flex-col items-center gap-6", headerClassName), children: [
1113
- title && (typeof title === "string" ? /* @__PURE__ */ jsx("h2", { className: cn("text-center text-3xl font-semibold lg:text-5xl", titleClassName), children: title }) : /* @__PURE__ */ jsx("div", { className: cn("text-center text-3xl font-semibold lg:text-5xl", titleClassName), children: title })),
1114
- description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-center text-balance text-muted-foreground lg:text-xl", descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: cn("text-center text-balance text-muted-foreground lg:text-xl", descriptionClassName), children: description }))
1115
- ] }),
1199
+ /* @__PURE__ */ jsxs(
1200
+ "div",
1201
+ {
1202
+ className: cn(
1203
+ "mx-auto flex max-w-3xl flex-col items-center gap-6",
1204
+ headerClassName
1205
+ ),
1206
+ children: [
1207
+ title && (typeof title === "string" ? /* @__PURE__ */ jsx(
1208
+ "h2",
1209
+ {
1210
+ className: cn(
1211
+ "text-center text-3xl font-semibold lg:text-5xl",
1212
+ titleClassName
1213
+ ),
1214
+ children: title
1215
+ }
1216
+ ) : /* @__PURE__ */ jsx(
1217
+ "div",
1218
+ {
1219
+ className: cn(
1220
+ "text-center text-3xl font-semibold lg:text-5xl",
1221
+ titleClassName
1222
+ ),
1223
+ children: title
1224
+ }
1225
+ )),
1226
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx(
1227
+ "p",
1228
+ {
1229
+ className: cn(
1230
+ "text-center text-balance text-muted-foreground lg:text-xl",
1231
+ descriptionClassName
1232
+ ),
1233
+ children: description
1234
+ }
1235
+ ) : /* @__PURE__ */ jsx(
1236
+ "div",
1237
+ {
1238
+ className: cn(
1239
+ "text-center text-balance text-muted-foreground lg:text-xl",
1240
+ descriptionClassName
1241
+ ),
1242
+ children: description
1243
+ }
1244
+ ))
1245
+ ]
1246
+ }
1247
+ ),
1116
1248
  (slidesSlot || slides && slides.length > 0) && /* @__PURE__ */ jsx("div", { className: cn("mt-12", tabsWrapperClassName), children: /* @__PURE__ */ jsx(
1117
1249
  Tabs,
1118
1250
  {
1119
1251
  defaultValue: effectiveDefaultTab,
1120
- className: cn("mx-auto flex w-fit flex-col items-center gap-8 md:gap-12", tabsClassName),
1252
+ className: cn(
1253
+ "mx-auto flex w-fit flex-col items-center gap-8 md:gap-12",
1254
+ tabsClassName
1255
+ ),
1121
1256
  children: slidesContent
1122
1257
  }
1123
1258
  ) })