@opensite/ui 0.8.4 → 0.8.6

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 (107) 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-badge-support.cjs +18 -5
  12. package/dist/faq-badge-support.js +18 -5
  13. package/dist/faq-bordered-badge.cjs +23 -7
  14. package/dist/faq-bordered-badge.js +23 -7
  15. package/dist/faq-card-categories.cjs +20 -4
  16. package/dist/faq-card-categories.js +20 -4
  17. package/dist/faq-categorized-sections.cjs +19 -4
  18. package/dist/faq-categorized-sections.js +19 -4
  19. package/dist/faq-centered-accordion.cjs +18 -5
  20. package/dist/faq-centered-accordion.js +18 -5
  21. package/dist/faq-gradient-categories.cjs +19 -4
  22. package/dist/faq-gradient-categories.js +19 -4
  23. package/dist/faq-icon-benefits.cjs +11 -2
  24. package/dist/faq-icon-benefits.js +11 -2
  25. package/dist/faq-muted-cards.cjs +19 -6
  26. package/dist/faq-muted-cards.js +19 -6
  27. package/dist/faq-numbered-grid.cjs +11 -3
  28. package/dist/faq-numbered-grid.js +11 -3
  29. package/dist/faq-numbered-list.cjs +11 -3
  30. package/dist/faq-numbered-list.js +11 -3
  31. package/dist/faq-profile-sidebar.cjs +57 -20
  32. package/dist/faq-profile-sidebar.js +57 -20
  33. package/dist/faq-rounded-cards.cjs +26 -19
  34. package/dist/faq-rounded-cards.js +26 -19
  35. package/dist/faq-sidebar-navigation.cjs +48 -28
  36. package/dist/faq-sidebar-navigation.js +48 -28
  37. package/dist/faq-simple-accordion.cjs +17 -4
  38. package/dist/faq-simple-accordion.js +17 -4
  39. package/dist/faq-split-help.cjs +25 -6
  40. package/dist/faq-split-help.js +25 -6
  41. package/dist/faq-split-hero.cjs +604 -0
  42. package/dist/faq-split-hero.d.cts +116 -0
  43. package/dist/faq-split-hero.d.ts +116 -0
  44. package/dist/faq-split-hero.js +582 -0
  45. package/dist/faq-static-list.cjs +9 -2
  46. package/dist/faq-static-list.js +9 -2
  47. package/dist/feature-accordion-image.cjs +8 -2
  48. package/dist/feature-accordion-image.js +8 -2
  49. package/dist/feature-badge-grid-six.cjs +1 -1
  50. package/dist/feature-badge-grid-six.js +1 -1
  51. package/dist/feature-card-grid-linked.cjs +92 -22
  52. package/dist/feature-card-grid-linked.js +92 -22
  53. package/dist/feature-carousel-progress.cjs +1 -1
  54. package/dist/feature-carousel-progress.js +1 -1
  55. package/dist/feature-checklist-image.cjs +88 -15
  56. package/dist/feature-checklist-image.js +88 -15
  57. package/dist/feature-checklist-three-column.cjs +1 -1
  58. package/dist/feature-checklist-three-column.js +1 -1
  59. package/dist/feature-icon-grid-accent.cjs +50 -8
  60. package/dist/feature-icon-grid-accent.js +50 -8
  61. package/dist/feature-icon-grid-bordered.cjs +84 -14
  62. package/dist/feature-icon-grid-bordered.js +84 -14
  63. package/dist/feature-icon-tabs-content.cjs +217 -84
  64. package/dist/feature-icon-tabs-content.js +217 -84
  65. package/dist/feature-image-overlay-badge.cjs +106 -33
  66. package/dist/feature-image-overlay-badge.js +106 -33
  67. package/dist/feature-numbered-cards.cjs +154 -35
  68. package/dist/feature-numbered-cards.js +154 -35
  69. package/dist/feature-showcase.cjs +66 -71
  70. package/dist/feature-showcase.d.cts +1 -5
  71. package/dist/feature-showcase.d.ts +1 -5
  72. package/dist/feature-showcase.js +67 -72
  73. package/dist/feature-split-image-reverse.cjs +84 -15
  74. package/dist/feature-split-image-reverse.js +84 -15
  75. package/dist/feature-split-image.cjs +87 -15
  76. package/dist/feature-split-image.js +87 -15
  77. package/dist/feature-stats-highlight.cjs +50 -13
  78. package/dist/feature-stats-highlight.js +50 -13
  79. package/dist/feature-tabbed-content-image.cjs +198 -72
  80. package/dist/feature-tabbed-content-image.js +198 -72
  81. package/dist/feature-three-column-values.cjs +67 -14
  82. package/dist/feature-three-column-values.js +67 -14
  83. package/dist/feature-utility-cards-grid.cjs +83 -36
  84. package/dist/feature-utility-cards-grid.js +83 -36
  85. package/dist/navbar-animated-preview.cjs +8 -2
  86. package/dist/navbar-animated-preview.js +8 -2
  87. package/dist/navbar-centered-menu.cjs +8 -2
  88. package/dist/navbar-centered-menu.js +8 -2
  89. package/dist/navbar-dark-icons.cjs +8 -2
  90. package/dist/navbar-dark-icons.js +8 -2
  91. package/dist/navbar-dropdown-menu.cjs +8 -2
  92. package/dist/navbar-dropdown-menu.js +8 -2
  93. package/dist/navbar-education-platform.cjs +8 -2
  94. package/dist/navbar-education-platform.js +8 -2
  95. package/dist/navbar-enterprise-mega.cjs +8 -2
  96. package/dist/navbar-enterprise-mega.js +8 -2
  97. package/dist/navbar-feature-grid.cjs +8 -2
  98. package/dist/navbar-feature-grid.js +8 -2
  99. package/dist/navbar-multi-column-groups.cjs +8 -2
  100. package/dist/navbar-multi-column-groups.js +8 -2
  101. package/dist/navbar-platform-resources.cjs +8 -2
  102. package/dist/navbar-platform-resources.js +8 -2
  103. package/dist/navbar-sidebar-mobile.cjs +8 -2
  104. package/dist/navbar-sidebar-mobile.js +8 -2
  105. package/dist/registry.cjs +1873 -680
  106. package/dist/registry.js +1873 -680
  107. 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,7 @@ 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("text-sm md:text-base", tabTriggerClassName),
1095
1114
  children: slide.tabName
1096
1115
  },
1097
1116
  slide.id
@@ -1101,20 +1120,79 @@ function FeatureTabbedContentImage({
1101
1120
  {
1102
1121
  value: slide.id.toString(),
1103
1122
  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
- ] })
1123
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
1124
+ "div",
1125
+ {
1126
+ className: cn(
1127
+ "grid grid-cols-1 items-center gap-10 md:grid-cols-2",
1128
+ contentGridClassName,
1129
+ slide.className
1130
+ ),
1131
+ children: [
1132
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1133
+ slide.title && (typeof slide.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1134
+ "h2",
1135
+ {
1136
+ className: cn(
1137
+ "mb-4 text-2xl font-semibold lg:text-4xl",
1138
+ slide.titleClassName
1139
+ ),
1140
+ children: slide.title
1141
+ }
1142
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1143
+ "div",
1144
+ {
1145
+ className: cn(
1146
+ "mb-4 text-2xl font-semibold lg:text-4xl",
1147
+ slide.titleClassName
1148
+ ),
1149
+ children: slide.title
1150
+ }
1151
+ )),
1152
+ slide.description && (typeof slide.description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1153
+ "p",
1154
+ {
1155
+ className: cn(" lg:text-xl", slide.descriptionClassName),
1156
+ children: slide.description
1157
+ }
1158
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1159
+ "div",
1160
+ {
1161
+ className: cn("lg:text-xl", slide.descriptionClassName),
1162
+ children: slide.description
1163
+ }
1164
+ )),
1165
+ slide.features && slide.features.length > 0 || slide.featuresSlot ? /* @__PURE__ */ jsxRuntime.jsx(
1166
+ "ul",
1167
+ {
1168
+ className: cn(
1169
+ "mt-8 grid grid-cols-1 gap-2 lg:grid-cols-2",
1170
+ slide.featuresClassName
1171
+ ),
1172
+ children: renderFeatures(slide)
1173
+ }
1174
+ ) : null,
1175
+ renderActions(slide)
1176
+ ] }),
1177
+ renderImage(slide)
1178
+ ]
1179
+ }
1180
+ )
1113
1181
  },
1114
1182
  slide.id
1115
1183
  ))
1116
1184
  ] });
1117
- }, [slidesSlot, slides, tabsListClassName, tabTriggerClassName, tabContentClassName, contentGridClassName, renderFeatures, renderActions, renderImage]);
1185
+ }, [
1186
+ slidesSlot,
1187
+ slides,
1188
+ tabsListClassName,
1189
+ tabTriggerClassName,
1190
+ tabContentClassName,
1191
+ contentGridClassName,
1192
+ renderFeatures,
1193
+ renderActions,
1194
+ renderImage
1195
+ ]);
1118
1196
  const effectiveDefaultTab = React.useMemo(() => {
1119
1197
  if (defaultTab) return defaultTab;
1120
1198
  if (slides && slides.length > 0) return slides[0].id.toString();
@@ -1131,15 +1209,63 @@ function FeatureTabbedContentImage({
1131
1209
  className,
1132
1210
  containerClassName,
1133
1211
  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
- ] }),
1212
+ /* @__PURE__ */ jsxRuntime.jsxs(
1213
+ "div",
1214
+ {
1215
+ className: cn(
1216
+ "mx-auto flex max-w-3xl flex-col items-center gap-6",
1217
+ headerClassName
1218
+ ),
1219
+ children: [
1220
+ title && (typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1221
+ "h2",
1222
+ {
1223
+ className: cn(
1224
+ "text-center text-3xl font-semibold lg:text-5xl",
1225
+ titleClassName
1226
+ ),
1227
+ children: title
1228
+ }
1229
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1230
+ "div",
1231
+ {
1232
+ className: cn(
1233
+ "text-center text-3xl font-semibold lg:text-5xl",
1234
+ titleClassName
1235
+ ),
1236
+ children: title
1237
+ }
1238
+ )),
1239
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1240
+ "p",
1241
+ {
1242
+ className: cn(
1243
+ "text-center text-balance lg:text-xl",
1244
+ descriptionClassName
1245
+ ),
1246
+ children: description
1247
+ }
1248
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1249
+ "div",
1250
+ {
1251
+ className: cn(
1252
+ "text-center text-balance lg:text-xl",
1253
+ descriptionClassName
1254
+ ),
1255
+ children: description
1256
+ }
1257
+ ))
1258
+ ]
1259
+ }
1260
+ ),
1138
1261
  (slidesSlot || slides && slides.length > 0) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mt-12", tabsWrapperClassName), children: /* @__PURE__ */ jsxRuntime.jsx(
1139
1262
  Tabs,
1140
1263
  {
1141
1264
  defaultValue: effectiveDefaultTab,
1142
- className: cn("mx-auto flex w-fit flex-col items-center gap-8 md:gap-12", tabsClassName),
1265
+ className: cn(
1266
+ "mx-auto flex w-fit flex-col items-center gap-8 md:gap-12",
1267
+ tabsClassName
1268
+ ),
1143
1269
  children: slidesContent
1144
1270
  }
1145
1271
  ) })
@@ -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,7 @@ 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("text-sm md:text-base", tabTriggerClassName),
1073
1092
  children: slide.tabName
1074
1093
  },
1075
1094
  slide.id
@@ -1079,20 +1098,79 @@ function FeatureTabbedContentImage({
1079
1098
  {
1080
1099
  value: slide.id.toString(),
1081
1100
  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
- ] })
1101
+ children: /* @__PURE__ */ jsxs(
1102
+ "div",
1103
+ {
1104
+ className: cn(
1105
+ "grid grid-cols-1 items-center gap-10 md:grid-cols-2",
1106
+ contentGridClassName,
1107
+ slide.className
1108
+ ),
1109
+ children: [
1110
+ /* @__PURE__ */ jsxs("div", { children: [
1111
+ slide.title && (typeof slide.title === "string" ? /* @__PURE__ */ jsx(
1112
+ "h2",
1113
+ {
1114
+ className: cn(
1115
+ "mb-4 text-2xl font-semibold lg:text-4xl",
1116
+ slide.titleClassName
1117
+ ),
1118
+ children: slide.title
1119
+ }
1120
+ ) : /* @__PURE__ */ jsx(
1121
+ "div",
1122
+ {
1123
+ className: cn(
1124
+ "mb-4 text-2xl font-semibold lg:text-4xl",
1125
+ slide.titleClassName
1126
+ ),
1127
+ children: slide.title
1128
+ }
1129
+ )),
1130
+ slide.description && (typeof slide.description === "string" ? /* @__PURE__ */ jsx(
1131
+ "p",
1132
+ {
1133
+ className: cn(" lg:text-xl", slide.descriptionClassName),
1134
+ children: slide.description
1135
+ }
1136
+ ) : /* @__PURE__ */ jsx(
1137
+ "div",
1138
+ {
1139
+ className: cn("lg:text-xl", slide.descriptionClassName),
1140
+ children: slide.description
1141
+ }
1142
+ )),
1143
+ slide.features && slide.features.length > 0 || slide.featuresSlot ? /* @__PURE__ */ jsx(
1144
+ "ul",
1145
+ {
1146
+ className: cn(
1147
+ "mt-8 grid grid-cols-1 gap-2 lg:grid-cols-2",
1148
+ slide.featuresClassName
1149
+ ),
1150
+ children: renderFeatures(slide)
1151
+ }
1152
+ ) : null,
1153
+ renderActions(slide)
1154
+ ] }),
1155
+ renderImage(slide)
1156
+ ]
1157
+ }
1158
+ )
1091
1159
  },
1092
1160
  slide.id
1093
1161
  ))
1094
1162
  ] });
1095
- }, [slidesSlot, slides, tabsListClassName, tabTriggerClassName, tabContentClassName, contentGridClassName, renderFeatures, renderActions, renderImage]);
1163
+ }, [
1164
+ slidesSlot,
1165
+ slides,
1166
+ tabsListClassName,
1167
+ tabTriggerClassName,
1168
+ tabContentClassName,
1169
+ contentGridClassName,
1170
+ renderFeatures,
1171
+ renderActions,
1172
+ renderImage
1173
+ ]);
1096
1174
  const effectiveDefaultTab = useMemo(() => {
1097
1175
  if (defaultTab) return defaultTab;
1098
1176
  if (slides && slides.length > 0) return slides[0].id.toString();
@@ -1109,15 +1187,63 @@ function FeatureTabbedContentImage({
1109
1187
  className,
1110
1188
  containerClassName,
1111
1189
  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
- ] }),
1190
+ /* @__PURE__ */ jsxs(
1191
+ "div",
1192
+ {
1193
+ className: cn(
1194
+ "mx-auto flex max-w-3xl flex-col items-center gap-6",
1195
+ headerClassName
1196
+ ),
1197
+ children: [
1198
+ title && (typeof title === "string" ? /* @__PURE__ */ jsx(
1199
+ "h2",
1200
+ {
1201
+ className: cn(
1202
+ "text-center text-3xl font-semibold lg:text-5xl",
1203
+ titleClassName
1204
+ ),
1205
+ children: title
1206
+ }
1207
+ ) : /* @__PURE__ */ jsx(
1208
+ "div",
1209
+ {
1210
+ className: cn(
1211
+ "text-center text-3xl font-semibold lg:text-5xl",
1212
+ titleClassName
1213
+ ),
1214
+ children: title
1215
+ }
1216
+ )),
1217
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx(
1218
+ "p",
1219
+ {
1220
+ className: cn(
1221
+ "text-center text-balance lg:text-xl",
1222
+ descriptionClassName
1223
+ ),
1224
+ children: description
1225
+ }
1226
+ ) : /* @__PURE__ */ jsx(
1227
+ "div",
1228
+ {
1229
+ className: cn(
1230
+ "text-center text-balance lg:text-xl",
1231
+ descriptionClassName
1232
+ ),
1233
+ children: description
1234
+ }
1235
+ ))
1236
+ ]
1237
+ }
1238
+ ),
1116
1239
  (slidesSlot || slides && slides.length > 0) && /* @__PURE__ */ jsx("div", { className: cn("mt-12", tabsWrapperClassName), children: /* @__PURE__ */ jsx(
1117
1240
  Tabs,
1118
1241
  {
1119
1242
  defaultValue: effectiveDefaultTab,
1120
- className: cn("mx-auto flex w-fit flex-col items-center gap-8 md:gap-12", tabsClassName),
1243
+ className: cn(
1244
+ "mx-auto flex w-fit flex-col items-center gap-8 md:gap-12",
1245
+ tabsClassName
1246
+ ),
1121
1247
  children: slidesContent
1122
1248
  }
1123
1249
  ) })