@opensite/ui 2.0.2 → 2.0.4

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 (75) hide show
  1. package/dist/hero-ai-powered-carousel.cjs +152 -77
  2. package/dist/hero-ai-powered-carousel.d.cts +5 -13
  3. package/dist/hero-ai-powered-carousel.d.ts +5 -13
  4. package/dist/hero-ai-powered-carousel.js +152 -77
  5. package/dist/hero-announcement-badge.cjs +679 -665
  6. package/dist/hero-announcement-badge.d.cts +1 -1
  7. package/dist/hero-announcement-badge.d.ts +1 -1
  8. package/dist/hero-announcement-badge.js +689 -675
  9. package/dist/hero-badge-shadow-overlay.cjs +79 -32
  10. package/dist/hero-badge-shadow-overlay.js +80 -33
  11. package/dist/hero-centered-image-grid.cjs +106 -95
  12. package/dist/hero-centered-image-grid.d.cts +2 -14
  13. package/dist/hero-centered-image-grid.d.ts +2 -14
  14. package/dist/hero-centered-image-grid.js +106 -95
  15. package/dist/hero-community-survey-cta.cjs +149 -58
  16. package/dist/hero-community-survey-cta.d.cts +1 -1
  17. package/dist/hero-community-survey-cta.d.ts +1 -1
  18. package/dist/hero-community-survey-cta.js +149 -58
  19. package/dist/hero-design-carousel-portfolio.cjs +158 -66
  20. package/dist/hero-design-carousel-portfolio.d.cts +7 -11
  21. package/dist/hero-design-carousel-portfolio.d.ts +7 -11
  22. package/dist/hero-design-carousel-portfolio.js +158 -66
  23. package/dist/hero-event-registration.cjs +765 -718
  24. package/dist/hero-event-registration.js +761 -714
  25. package/dist/hero-fullscreen-background-image.cjs +746 -649
  26. package/dist/hero-fullscreen-background-image.d.cts +12 -4
  27. package/dist/hero-fullscreen-background-image.d.ts +12 -4
  28. package/dist/hero-fullscreen-background-image.js +746 -649
  29. package/dist/hero-fullscreen-logo-cta.cjs +89 -31
  30. package/dist/hero-fullscreen-logo-cta.js +89 -31
  31. package/dist/hero-gradient-avatars-rating.cjs +847 -816
  32. package/dist/hero-gradient-avatars-rating.d.cts +1 -13
  33. package/dist/hero-gradient-avatars-rating.d.ts +1 -13
  34. package/dist/hero-gradient-avatars-rating.js +844 -813
  35. package/dist/hero-gradient-client-focused.cjs +690 -629
  36. package/dist/hero-gradient-client-focused.d.cts +1 -1
  37. package/dist/hero-gradient-client-focused.d.ts +1 -1
  38. package/dist/hero-gradient-client-focused.js +689 -628
  39. package/dist/hero-grid-pattern-efficiency.cjs +59 -47
  40. package/dist/hero-grid-pattern-efficiency.d.cts +1 -8
  41. package/dist/hero-grid-pattern-efficiency.d.ts +1 -8
  42. package/dist/hero-grid-pattern-efficiency.js +59 -47
  43. package/dist/hero-logo-centered-screenshot.cjs +1 -1
  44. package/dist/hero-logo-centered-screenshot.js +1 -1
  45. package/dist/hero-marketplace-scattered-images.cjs +2 -6
  46. package/dist/hero-marketplace-scattered-images.d.cts +1 -4
  47. package/dist/hero-marketplace-scattered-images.d.ts +1 -4
  48. package/dist/hero-marketplace-scattered-images.js +2 -6
  49. package/dist/hero-pattern-logo-tech-stack.cjs +1 -1
  50. package/dist/hero-pattern-logo-tech-stack.js +1 -1
  51. package/dist/hero-platform-features-grid.cjs +5 -5
  52. package/dist/hero-platform-features-grid.js +5 -5
  53. package/dist/hero-simple-centered-image.cjs +140 -44
  54. package/dist/hero-simple-centered-image.d.cts +1 -1
  55. package/dist/hero-simple-centered-image.d.ts +1 -1
  56. package/dist/hero-simple-centered-image.js +140 -44
  57. package/dist/hero-spiral-pattern-cards.cjs +857 -809
  58. package/dist/hero-spiral-pattern-cards.d.cts +5 -1
  59. package/dist/hero-spiral-pattern-cards.d.ts +5 -1
  60. package/dist/hero-spiral-pattern-cards.js +856 -808
  61. package/dist/hero-split-geometric-shapes.cjs +754 -723
  62. package/dist/hero-split-geometric-shapes.d.cts +5 -1
  63. package/dist/hero-split-geometric-shapes.d.ts +5 -1
  64. package/dist/hero-split-geometric-shapes.js +748 -717
  65. package/dist/hero-task-timer-animated.cjs +698 -650
  66. package/dist/hero-task-timer-animated.d.cts +5 -1
  67. package/dist/hero-task-timer-animated.d.ts +5 -1
  68. package/dist/hero-task-timer-animated.js +697 -649
  69. package/dist/hero-ui-library-showcase.cjs +734 -719
  70. package/dist/hero-ui-library-showcase.d.cts +5 -1
  71. package/dist/hero-ui-library-showcase.d.ts +5 -1
  72. package/dist/hero-ui-library-showcase.js +732 -717
  73. package/dist/registry.cjs +1035 -788
  74. package/dist/registry.js +1035 -788
  75. package/package.json +1 -1
@@ -5,8 +5,8 @@ import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { cva } from 'class-variance-authority';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
- import { Icon } from '@page-speed/icon';
9
8
  import { Img } from '@page-speed/img';
9
+ import { Slot } from '@radix-ui/react-slot';
10
10
 
11
11
  // components/blocks/hero/hero-community-survey-cta.tsx
12
12
  function cn(...inputs) {
@@ -430,10 +430,6 @@ var Pressable = React.forwardRef(
430
430
  }
431
431
  );
432
432
  Pressable.displayName = "Pressable";
433
- var DEFAULT_ICON_API_KEY = "au382bi7fsh96w9h9xlrnat2jglx";
434
- function DynamicIcon({ apiKey, ...props }) {
435
- return /* @__PURE__ */ jsx(Icon, { ...props, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
436
- }
437
433
  var maxWidthStyles = {
438
434
  sm: "max-w-screen-sm",
439
435
  md: "max-w-screen-md",
@@ -809,6 +805,38 @@ var Section = React__default.forwardRef(
809
805
  }
810
806
  );
811
807
  Section.displayName = "Section";
808
+ var badgeVariants = cva(
809
+ "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
810
+ {
811
+ variants: {
812
+ variant: {
813
+ default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
814
+ secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
815
+ destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
816
+ outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
817
+ }
818
+ },
819
+ defaultVariants: {
820
+ variant: "default"
821
+ }
822
+ }
823
+ );
824
+ function Badge({
825
+ className,
826
+ variant,
827
+ asChild = false,
828
+ ...props
829
+ }) {
830
+ const Comp = asChild ? Slot : "span";
831
+ return /* @__PURE__ */ jsx(
832
+ Comp,
833
+ {
834
+ "data-slot": "badge",
835
+ className: cn(badgeVariants({ variant }), className),
836
+ ...props
837
+ }
838
+ );
839
+ }
812
840
  var MOBILE_CLASSES = {
813
841
  "fit-left": "items-start md:items-center",
814
842
  "fit-center": "items-center",
@@ -892,11 +920,11 @@ function HeroCommunitySurveyCta({
892
920
  rightOverlayImage,
893
921
  imagesSlot,
894
922
  background,
895
- spacing,
923
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
924
+ spacing = "pt-32 pb-8 md:pt-32 md:pb-32",
896
925
  pattern,
897
926
  patternOpacity,
898
927
  className,
899
- containerClassName,
900
928
  announcementClassName,
901
929
  headingClassName,
902
930
  descriptionClassName,
@@ -906,29 +934,22 @@ function HeroCommunitySurveyCta({
906
934
  }) {
907
935
  const renderAnnouncement = useMemo(() => {
908
936
  if (announcementSlot) return announcementSlot;
909
- return /* @__PURE__ */ jsxs(
910
- Pressable,
937
+ return /* @__PURE__ */ jsx(Pressable, { href: announcementHref, children: /* @__PURE__ */ jsxs(
938
+ Badge,
911
939
  {
912
- href: announcementHref,
913
940
  className: cn(
914
- "group mx-auto mb-3 w-fit gap-3 rounded-full border px-5 py-2 text-sm",
941
+ "group mx-auto w-fit gap-3 px-5 py-2 text-sm h-fit",
915
942
  announcementClassName
916
943
  ),
917
944
  children: [
918
- /* @__PURE__ */ jsx("span", { className: "mr-1 font-medium", children: announcementPrimary }),
919
- announcementSecondary,
920
- /* @__PURE__ */ jsx(
921
- DynamicIcon,
922
- {
923
- name: "lucide/minus",
924
- size: 16,
925
- className: "mx-1 inline-block"
926
- }
927
- ),
928
- /* @__PURE__ */ jsx("span", { className: "font-semibold group-hover:underline", children: announcementLinkText })
945
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
946
+ /* @__PURE__ */ jsx("div", { className: "font-medium", children: announcementPrimary }),
947
+ announcementSecondary
948
+ ] }),
949
+ announcementLinkText ? /* @__PURE__ */ jsx("span", { className: "font-semibold pl-4 ml-4 border-l", children: announcementLinkText }) : null
929
950
  ]
930
951
  }
931
- );
952
+ ) });
932
953
  }, [
933
954
  announcementSlot,
934
955
  announcementHref,
@@ -937,46 +958,119 @@ function HeroCommunitySurveyCta({
937
958
  announcementSecondary,
938
959
  announcementLinkText
939
960
  ]);
961
+ const imageCount = useMemo(() => {
962
+ let count = 0;
963
+ if (mainImage) count++;
964
+ if (leftOverlayImage) count++;
965
+ if (rightOverlayImage) count++;
966
+ return count;
967
+ }, [mainImage, leftOverlayImage, rightOverlayImage]);
940
968
  const renderImages = useMemo(() => {
941
969
  if (imagesSlot) return imagesSlot;
942
- return /* @__PURE__ */ jsxs("div", { className: cn("relative mx-auto max-w-5xl", imagesClassName), children: [
943
- mainImage && /* @__PURE__ */ jsx(
944
- Img,
945
- {
946
- src: mainImage.src,
947
- alt: mainImage.alt,
948
- className: mainImage.className,
949
- optixFlowConfig
950
- }
951
- ),
952
- leftOverlayImage && /* @__PURE__ */ jsx(
953
- Img,
970
+ if (imageCount === 0) return null;
971
+ if (imageCount === 1) {
972
+ const img = mainImage || leftOverlayImage || rightOverlayImage;
973
+ return /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx(
974
+ "div",
954
975
  {
955
- src: leftOverlayImage.src,
956
- alt: leftOverlayImage.alt,
957
- className: leftOverlayImage.className,
958
- optixFlowConfig
976
+ className: cn(
977
+ "relative aspect-4/3 w-full max-w-lg overflow-hidden rounded-lg shadow-2xl",
978
+ imagesClassName
979
+ ),
980
+ children: /* @__PURE__ */ jsx(
981
+ Img,
982
+ {
983
+ src: img.src,
984
+ alt: img.alt,
985
+ className: "h-full w-full object-cover",
986
+ optixFlowConfig
987
+ }
988
+ )
959
989
  }
960
- ),
961
- rightOverlayImage && /* @__PURE__ */ jsx(
962
- Img,
990
+ ) });
991
+ }
992
+ if (imageCount === 2) {
993
+ const imgs = [mainImage, leftOverlayImage, rightOverlayImage].filter(
994
+ Boolean
995
+ );
996
+ return /* @__PURE__ */ jsxs(
997
+ "div",
963
998
  {
964
- src: rightOverlayImage.src,
965
- alt: rightOverlayImage.alt,
966
- className: rightOverlayImage.className,
967
- optixFlowConfig
999
+ className: cn(
1000
+ "relative min-h-[350px] md:min-h-[400px] lg:min-h-[450px]",
1001
+ imagesClassName
1002
+ ),
1003
+ children: [
1004
+ /* @__PURE__ */ jsx("div", { className: "absolute left-0 top-0 z-10 aspect-4/3 w-[70%] overflow-hidden rounded-lg shadow-2xl md:w-[65%]", children: /* @__PURE__ */ jsx(
1005
+ Img,
1006
+ {
1007
+ src: imgs[0].src,
1008
+ alt: imgs[0].alt,
1009
+ className: "h-full w-full object-cover",
1010
+ optixFlowConfig
1011
+ }
1012
+ ) }),
1013
+ /* @__PURE__ */ jsx("div", { className: "absolute bottom-0 right-0 z-20 aspect-3/4 w-[55%] overflow-hidden rounded-lg shadow-2xl md:w-[50%]", children: /* @__PURE__ */ jsx(
1014
+ Img,
1015
+ {
1016
+ src: imgs[1].src,
1017
+ alt: imgs[1].alt,
1018
+ className: "h-full w-full object-cover",
1019
+ optixFlowConfig
1020
+ }
1021
+ ) })
1022
+ ]
968
1023
  }
969
- )
970
- ] });
1024
+ );
1025
+ }
1026
+ return /* @__PURE__ */ jsxs(
1027
+ "div",
1028
+ {
1029
+ className: cn(
1030
+ "relative min-h-[380px] md:min-h-[430px] lg:min-h-[480px]",
1031
+ imagesClassName
1032
+ ),
1033
+ children: [
1034
+ /* @__PURE__ */ jsx("div", { className: "absolute left-0 top-0 z-10 aspect-4/3 w-[65%] overflow-hidden rounded-lg shadow-2xl", children: /* @__PURE__ */ jsx(
1035
+ Img,
1036
+ {
1037
+ src: mainImage.src,
1038
+ alt: mainImage.alt,
1039
+ className: "h-full w-full object-cover",
1040
+ optixFlowConfig
1041
+ }
1042
+ ) }),
1043
+ /* @__PURE__ */ jsx("div", { className: "absolute bottom-0 right-0 z-20 aspect-3/4 w-[50%] overflow-hidden rounded-lg shadow-2xl", children: /* @__PURE__ */ jsx(
1044
+ Img,
1045
+ {
1046
+ src: rightOverlayImage.src,
1047
+ alt: rightOverlayImage.alt,
1048
+ className: "h-full w-full object-cover",
1049
+ optixFlowConfig
1050
+ }
1051
+ ) }),
1052
+ /* @__PURE__ */ jsx("div", { className: "absolute bottom-4 left-[10%] z-30 aspect-square w-[35%] overflow-hidden rounded-lg shadow-2xl md:bottom-6 md:left-[15%]", children: /* @__PURE__ */ jsx(
1053
+ Img,
1054
+ {
1055
+ src: leftOverlayImage.src,
1056
+ alt: leftOverlayImage.alt,
1057
+ className: "h-full w-full object-cover",
1058
+ optixFlowConfig
1059
+ }
1060
+ ) })
1061
+ ]
1062
+ }
1063
+ );
971
1064
  }, [
972
1065
  imagesSlot,
973
1066
  imagesClassName,
1067
+ imageCount,
974
1068
  mainImage,
975
1069
  leftOverlayImage,
976
1070
  rightOverlayImage,
977
1071
  optixFlowConfig
978
1072
  ]);
979
- return /* @__PURE__ */ jsxs(
1073
+ return /* @__PURE__ */ jsx(
980
1074
  Section,
981
1075
  {
982
1076
  background,
@@ -985,14 +1079,14 @@ function HeroCommunitySurveyCta({
985
1079
  patternOpacity,
986
1080
  className,
987
1081
  containerClassName,
988
- children: [
989
- /* @__PURE__ */ jsxs("div", { className: "relative", children: [
1082
+ children: /* @__PURE__ */ jsxs("div", { className: "relative grid grid-cols-1 items-center gap-8 lg:grid-cols-2 lg:gap-12", children: [
1083
+ /* @__PURE__ */ jsxs("div", { children: [
990
1084
  renderAnnouncement,
991
1085
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
992
1086
  "h1",
993
1087
  {
994
1088
  className: cn(
995
- "mx-auto max-w-4xl text-4xl font-semibold text-balance lg:text-6xl",
1089
+ "max-w-4xl text-4xl font-semibold text-balance lg:text-6xl",
996
1090
  headingClassName
997
1091
  ),
998
1092
  children: heading
@@ -1002,7 +1096,7 @@ function HeroCommunitySurveyCta({
1002
1096
  "p",
1003
1097
  {
1004
1098
  className: cn(
1005
- "mx-auto max-w-4xl lg:text-xl",
1099
+ "max-w-4xl lg:text-xl text-balance",
1006
1100
  descriptionClassName
1007
1101
  ),
1008
1102
  children: description
@@ -1017,11 +1111,8 @@ function HeroCommunitySurveyCta({
1017
1111
  }
1018
1112
  )
1019
1113
  ] }),
1020
- /* @__PURE__ */ jsxs("div", { className: "relative px-8", children: [
1021
- /* @__PURE__ */ jsx("div", { className: "absolute inset-0 top-1/2 h-full w-full bg-linear-to-b from-muted to-transparent to-50%" }),
1022
- renderImages
1023
- ] })
1024
- ]
1114
+ /* @__PURE__ */ jsx("div", { className: "relative", children: renderImages })
1115
+ ] })
1025
1116
  }
1026
1117
  );
1027
1118
  }
@@ -6,11 +6,11 @@ var AutoScroll = require('embla-carousel-auto-scroll');
6
6
  var Autoplay = require('embla-carousel-autoplay');
7
7
  var clsx = require('clsx');
8
8
  var tailwindMerge = require('tailwind-merge');
9
- var classVarianceAuthority = require('class-variance-authority');
10
- var jsxRuntime = require('react/jsx-runtime');
11
9
  var icon = require('@page-speed/icon');
10
+ var jsxRuntime = require('react/jsx-runtime');
12
11
  var img = require('@page-speed/img');
13
12
  var useEmblaCarousel = require('embla-carousel-react');
13
+ var classVarianceAuthority = require('class-variance-authority');
14
14
 
15
15
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
16
 
@@ -41,6 +41,10 @@ var useEmblaCarousel__default = /*#__PURE__*/_interopDefault(useEmblaCarousel);
41
41
  function cn(...inputs) {
42
42
  return tailwindMerge.twMerge(clsx.clsx(inputs));
43
43
  }
44
+ var DEFAULT_ICON_API_KEY = "au382bi7fsh96w9h9xlrnat2jglx";
45
+ function DynamicIcon({ apiKey, ...props }) {
46
+ return /* @__PURE__ */ jsxRuntime.jsx(icon.Icon, { ...props, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
47
+ }
44
48
  function normalizePhoneNumber(input) {
45
49
  const trimmed = input.trim();
46
50
  if (trimmed.toLowerCase().startsWith("tel:")) {
@@ -459,10 +463,6 @@ var Pressable = React3__namespace.forwardRef(
459
463
  }
460
464
  );
461
465
  Pressable.displayName = "Pressable";
462
- var DEFAULT_ICON_API_KEY = "au382bi7fsh96w9h9xlrnat2jglx";
463
- function DynamicIcon({ apiKey, ...props }) {
464
- return /* @__PURE__ */ jsxRuntime.jsx(icon.Icon, { ...props, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
465
- }
466
466
  var CarouselContext = React3__namespace.createContext(null);
467
467
  function useCarousel() {
468
468
  const context = React3__namespace.useContext(CarouselContext);
@@ -967,6 +967,74 @@ var Section = React3__namespace.default.forwardRef(
967
967
  }
968
968
  );
969
969
  Section.displayName = "Section";
970
+ var MOBILE_CLASSES = {
971
+ "fit-left": "items-start md:items-center",
972
+ "fit-center": "items-center",
973
+ "fit-right": "items-end md:items-center",
974
+ "full-left": "items-stretch md:items-center",
975
+ "full-center": "items-stretch md:items-center",
976
+ "full-right": "items-stretch md:items-center"
977
+ };
978
+ function BlockActions({
979
+ mobileConfig,
980
+ actionsClassName,
981
+ verticalSpacing = "mt-4 md:mt-8",
982
+ actions,
983
+ actionsSlot
984
+ }) {
985
+ const renderAction = React3__namespace.useCallback(
986
+ (action, idx) => {
987
+ const {
988
+ label,
989
+ icon,
990
+ iconAfter,
991
+ children,
992
+ href,
993
+ onClick,
994
+ className: actionClassName,
995
+ ...pressableProps
996
+ } = action;
997
+ return /* @__PURE__ */ jsxRuntime.jsx(
998
+ Pressable,
999
+ {
1000
+ href,
1001
+ onClick,
1002
+ asButton: action.asButton || true,
1003
+ className: actionClassName,
1004
+ ...pressableProps,
1005
+ children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1006
+ icon,
1007
+ label,
1008
+ iconAfter
1009
+ ] })
1010
+ },
1011
+ idx
1012
+ );
1013
+ },
1014
+ []
1015
+ );
1016
+ const width = mobileConfig?.width ?? "full";
1017
+ const position = mobileConfig?.position ?? "center";
1018
+ const mobileLayoutClass = MOBILE_CLASSES[`${width}-${position}`];
1019
+ if (actionsSlot) {
1020
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { children: actionsSlot });
1021
+ } else if (actions && actions?.length > 0) {
1022
+ return /* @__PURE__ */ jsxRuntime.jsx(
1023
+ "div",
1024
+ {
1025
+ className: cn(
1026
+ "flex flex-col md:flex-row flex-wrap gap-4",
1027
+ mobileLayoutClass,
1028
+ actionsClassName,
1029
+ verticalSpacing
1030
+ ),
1031
+ children: actions.map((action, index) => renderAction(action, index))
1032
+ }
1033
+ );
1034
+ } else {
1035
+ return null;
1036
+ }
1037
+ }
970
1038
  function HeroDesignCarouselPortfolio({
971
1039
  logo,
972
1040
  logoSlot,
@@ -974,18 +1042,17 @@ function HeroDesignCarouselPortfolio({
974
1042
  featuresSlot,
975
1043
  heading,
976
1044
  description,
977
- primaryAction,
978
- primaryActionAvatar,
979
- secondaryAction,
1045
+ actions,
980
1046
  actionsSlot,
1047
+ actionsClassName,
981
1048
  carouselImages,
982
1049
  carouselSlot,
983
1050
  background,
984
- spacing,
1051
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
1052
+ spacing = "xl",
985
1053
  pattern,
986
1054
  patternOpacity,
987
1055
  className,
988
- containerClassName,
989
1056
  contentClassName,
990
1057
  headingClassName,
991
1058
  descriptionClassName,
@@ -1001,7 +1068,7 @@ function HeroDesignCarouselPortfolio({
1001
1068
  img.Img,
1002
1069
  {
1003
1070
  src: logoSrc,
1004
- className: cn("h-12 lg:h-16", logo.className),
1071
+ className: cn("object-contain w-auto h-12 lg:h-16", logo.className),
1005
1072
  alt: logo.alt,
1006
1073
  optixFlowConfig
1007
1074
  }
@@ -1010,53 +1077,23 @@ function HeroDesignCarouselPortfolio({
1010
1077
  const renderFeatures = React3.useMemo(() => {
1011
1078
  if (featuresSlot) return featuresSlot;
1012
1079
  if (!features || features.length === 0) return null;
1013
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("hidden items-center gap-6 lg:flex", featuresClassName), children: features.map((feature, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 ", children: [
1014
- feature.icon ?? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: feature.iconName || "lucide/check-circle", size: 24 }),
1015
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: feature.title })
1016
- ] }, index)) });
1017
- }, [featuresSlot, features, featuresClassName]);
1018
- const renderPrimaryAction = React3.useMemo(() => {
1019
- if (actionsSlot) return null;
1020
- if (!primaryAction) return null;
1021
- const { label, className: actionClassName, ...pressableProps } = primaryAction;
1022
- return /* @__PURE__ */ jsxRuntime.jsxs(
1023
- Pressable,
1080
+ return /* @__PURE__ */ jsxRuntime.jsx(
1081
+ "div",
1024
1082
  {
1025
- asButton: true,
1026
- className: actionClassName,
1027
- ...pressableProps,
1028
- children: [
1029
- /* @__PURE__ */ jsxRuntime.jsx(
1030
- img.Img,
1083
+ className: cn("hidden items-center gap-6 lg:flex", featuresClassName),
1084
+ children: features.map((feature, index) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5 ", children: [
1085
+ feature.icon ?? /* @__PURE__ */ jsxRuntime.jsx(
1086
+ DynamicIcon,
1031
1087
  {
1032
- src: primaryActionAvatar,
1033
- alt: "",
1034
- className: "size-9 rounded-full object-cover lg:size-11",
1035
- optixFlowConfig
1088
+ name: feature.iconName || "lucide/check-circle",
1089
+ size: 24
1036
1090
  }
1037
1091
  ),
1038
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: label })
1039
- ]
1040
- }
1041
- );
1042
- }, [actionsSlot, primaryAction, primaryActionAvatar, optixFlowConfig]);
1043
- const renderSecondaryAction = React3.useMemo(() => {
1044
- if (actionsSlot) return null;
1045
- if (!secondaryAction) return null;
1046
- const { label, iconAfter, className: actionClassName, ...pressableProps } = secondaryAction;
1047
- return /* @__PURE__ */ jsxRuntime.jsxs(
1048
- Pressable,
1049
- {
1050
- asButton: true,
1051
- className: actionClassName,
1052
- ...pressableProps,
1053
- children: [
1054
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: label }),
1055
- iconAfter
1056
- ]
1092
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: feature.title })
1093
+ ] }, index))
1057
1094
  }
1058
1095
  );
1059
- }, [actionsSlot, secondaryAction]);
1096
+ }, [featuresSlot, features, featuresClassName]);
1060
1097
  const renderCarousel = React3.useMemo(() => {
1061
1098
  if (carouselSlot) return carouselSlot;
1062
1099
  if (!carouselImages || carouselImages.length === 0) return null;
@@ -1076,7 +1113,10 @@ function HeroDesignCarouselPortfolio({
1076
1113
  delay: 1e3
1077
1114
  })
1078
1115
  ],
1079
- className: cn("relative mx-auto w-full max-w-full overflow-hidden from-white to-transparent before:absolute before:top-0 before:left-0 before:z-10 before:h-full before:w-[20%] before:bg-linear-to-r before:content-[''] after:absolute after:top-0 after:right-0 after:z-10 after:h-full after:w-[20%] after:bg-linear-to-l after:from-white after:to-transparent after:content-['']", carouselClassName),
1116
+ className: cn(
1117
+ "relative mx-auto w-full max-w-full overflow-hidden from-white to-transparent before:absolute before:top-0 before:left-0 before:z-10 before:h-full before:w-[20%] before:bg-linear-to-r before:content-[''] after:absolute after:top-0 after:right-0 after:z-10 after:h-full after:w-[20%] after:bg-linear-to-l after:from-white after:to-transparent after:content-['']",
1118
+ carouselClassName
1119
+ ),
1080
1120
  children: /* @__PURE__ */ jsxRuntime.jsx(CarouselContent, { className: "ml-5 flex gap-5 pl-4", children: carouselImages.map((image, index) => /* @__PURE__ */ jsxRuntime.jsx(CarouselItem, { className: "basis-[496px] bg-background", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-[380px] basis-[480px] overflow-hidden rounded-lg", children: /* @__PURE__ */ jsxRuntime.jsx(
1081
1121
  img.Img,
1082
1122
  {
@@ -1097,20 +1137,72 @@ function HeroDesignCarouselPortfolio({
1097
1137
  pattern,
1098
1138
  patternOpacity,
1099
1139
  className: cn("relative", className),
1140
+ containerClassName,
1100
1141
  children: [
1101
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative z-10 container mx-auto", containerClassName), children: [
1102
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-8", children: renderLogo }),
1103
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-10 py-10 lg:py-28", contentClassName), children: [
1104
- renderFeatures,
1105
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col gap-4", children: [
1106
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h1", { className: cn("max-w-6xl text-4xl tracking-tighter lg:text-7xl xl:text-9xl", headingClassName), children: heading }) : /* @__PURE__ */ jsxRuntime.jsx("h1", { className: cn("max-w-6xl text-4xl tracking-tighter lg:text-7xl xl:text-9xl", headingClassName), children: heading })),
1107
- description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-lg lg:text-2xl", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-lg lg:text-2xl", descriptionClassName), children: description }))
1108
- ] }) }),
1109
- actionsSlot || renderPrimaryAction
1110
- ] })
1142
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
1143
+ renderLogo ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pb-8", children: renderLogo }) : null,
1144
+ /* @__PURE__ */ jsxRuntime.jsxs(
1145
+ "div",
1146
+ {
1147
+ className: cn(
1148
+ "flex flex-col gap-10 pt-12 pb-8 lg:pt-24 lg:pb-12",
1149
+ contentClassName
1150
+ ),
1151
+ children: [
1152
+ renderFeatures,
1153
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col gap-4", children: [
1154
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1155
+ "h1",
1156
+ {
1157
+ className: cn(
1158
+ "max-w-6xl text-4xl tracking-tighter lg:text-7xl xl:text-9xl font-semibold",
1159
+ headingClassName
1160
+ ),
1161
+ children: heading
1162
+ }
1163
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1164
+ "h1",
1165
+ {
1166
+ className: cn(
1167
+ "max-w-6xl text-4xl tracking-tighter lg:text-7xl xl:text-9xl font-semibold",
1168
+ headingClassName
1169
+ ),
1170
+ children: heading
1171
+ }
1172
+ )),
1173
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1174
+ "p",
1175
+ {
1176
+ className: cn(
1177
+ "text-lg lg:text-2xl text-balance",
1178
+ descriptionClassName
1179
+ ),
1180
+ children: description
1181
+ }
1182
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1183
+ "p",
1184
+ {
1185
+ className: cn(
1186
+ "text-lg lg:text-2xl text-balance",
1187
+ descriptionClassName
1188
+ ),
1189
+ children: description
1190
+ }
1191
+ ))
1192
+ ] }) }),
1193
+ /* @__PURE__ */ jsxRuntime.jsx(
1194
+ BlockActions,
1195
+ {
1196
+ actions,
1197
+ actionsSlot,
1198
+ actionsClassName
1199
+ }
1200
+ )
1201
+ ]
1202
+ }
1203
+ )
1111
1204
  ] }),
1112
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative flex flex-col", children: renderCarousel }),
1113
- actionsSlot || renderSecondaryAction
1205
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative flex flex-col", children: renderCarousel })
1114
1206
  ]
1115
1207
  }
1116
1208
  );
@@ -34,21 +34,17 @@ interface HeroDesignCarouselPortfolioProps {
34
34
  */
35
35
  description?: React.ReactNode;
36
36
  /**
37
- * Primary action configuration (schedule chat button)
37
+ * Array of action configurations for CTA buttons
38
38
  */
39
- primaryAction?: ActionConfig;
40
- /**
41
- * Avatar image for primary action button
42
- */
43
- primaryActionAvatar?: string;
44
- /**
45
- * Secondary action configuration (portfolio button)
46
- */
47
- secondaryAction?: ActionConfig;
39
+ actions?: ActionConfig[];
48
40
  /**
49
41
  * Custom slot for actions (overrides action props)
50
42
  */
51
43
  actionsSlot?: React.ReactNode;
44
+ /**
45
+ * Additional CSS classes for the actions container
46
+ */
47
+ actionsClassName?: string;
52
48
  /**
53
49
  * Array of carousel images
54
50
  */
@@ -106,6 +102,6 @@ interface HeroDesignCarouselPortfolioProps {
106
102
  */
107
103
  optixFlowConfig?: OptixFlowConfig;
108
104
  }
109
- declare function HeroDesignCarouselPortfolio({ logo, logoSlot, features, featuresSlot, heading, description, primaryAction, primaryActionAvatar, secondaryAction, actionsSlot, carouselImages, carouselSlot, background, spacing, pattern, patternOpacity, className, containerClassName, contentClassName, headingClassName, descriptionClassName, featuresClassName, carouselClassName, optixFlowConfig, }: HeroDesignCarouselPortfolioProps): React.JSX.Element;
105
+ declare function HeroDesignCarouselPortfolio({ logo, logoSlot, features, featuresSlot, heading, description, actions, actionsSlot, actionsClassName, carouselImages, carouselSlot, background, containerClassName, spacing, pattern, patternOpacity, className, contentClassName, headingClassName, descriptionClassName, featuresClassName, carouselClassName, optixFlowConfig, }: HeroDesignCarouselPortfolioProps): React.JSX.Element;
110
106
 
111
107
  export { HeroDesignCarouselPortfolio, type HeroDesignCarouselPortfolioProps };
@@ -34,21 +34,17 @@ interface HeroDesignCarouselPortfolioProps {
34
34
  */
35
35
  description?: React.ReactNode;
36
36
  /**
37
- * Primary action configuration (schedule chat button)
37
+ * Array of action configurations for CTA buttons
38
38
  */
39
- primaryAction?: ActionConfig;
40
- /**
41
- * Avatar image for primary action button
42
- */
43
- primaryActionAvatar?: string;
44
- /**
45
- * Secondary action configuration (portfolio button)
46
- */
47
- secondaryAction?: ActionConfig;
39
+ actions?: ActionConfig[];
48
40
  /**
49
41
  * Custom slot for actions (overrides action props)
50
42
  */
51
43
  actionsSlot?: React.ReactNode;
44
+ /**
45
+ * Additional CSS classes for the actions container
46
+ */
47
+ actionsClassName?: string;
52
48
  /**
53
49
  * Array of carousel images
54
50
  */
@@ -106,6 +102,6 @@ interface HeroDesignCarouselPortfolioProps {
106
102
  */
107
103
  optixFlowConfig?: OptixFlowConfig;
108
104
  }
109
- declare function HeroDesignCarouselPortfolio({ logo, logoSlot, features, featuresSlot, heading, description, primaryAction, primaryActionAvatar, secondaryAction, actionsSlot, carouselImages, carouselSlot, background, spacing, pattern, patternOpacity, className, containerClassName, contentClassName, headingClassName, descriptionClassName, featuresClassName, carouselClassName, optixFlowConfig, }: HeroDesignCarouselPortfolioProps): React.JSX.Element;
105
+ declare function HeroDesignCarouselPortfolio({ logo, logoSlot, features, featuresSlot, heading, description, actions, actionsSlot, actionsClassName, carouselImages, carouselSlot, background, containerClassName, spacing, pattern, patternOpacity, className, contentClassName, headingClassName, descriptionClassName, featuresClassName, carouselClassName, optixFlowConfig, }: HeroDesignCarouselPortfolioProps): React.JSX.Element;
110
106
 
111
107
  export { HeroDesignCarouselPortfolio, type HeroDesignCarouselPortfolioProps };