@opensite/ui 2.8.5 → 2.8.7

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 (141) hide show
  1. package/dist/about-developer-profile.cjs +17 -10
  2. package/dist/about-developer-profile.js +17 -10
  3. package/dist/article-chapters-author.cjs +17 -10
  4. package/dist/article-chapters-author.js +17 -10
  5. package/dist/carousel-animated-sections.cjs +79 -25
  6. package/dist/carousel-animated-sections.d.cts +7 -2
  7. package/dist/carousel-animated-sections.d.ts +7 -2
  8. package/dist/carousel-animated-sections.js +79 -25
  9. package/dist/carousel-gallery-thumbnails.cjs +79 -25
  10. package/dist/carousel-gallery-thumbnails.d.cts +7 -2
  11. package/dist/carousel-gallery-thumbnails.d.ts +7 -2
  12. package/dist/carousel-gallery-thumbnails.js +79 -25
  13. package/dist/carousel-portfolio-hero.cjs +79 -25
  14. package/dist/carousel-portfolio-hero.d.cts +7 -2
  15. package/dist/carousel-portfolio-hero.d.ts +7 -2
  16. package/dist/carousel-portfolio-hero.js +79 -25
  17. package/dist/components.cjs +35 -10
  18. package/dist/components.d.cts +29 -2
  19. package/dist/components.d.ts +29 -2
  20. package/dist/components.js +35 -11
  21. package/dist/footer-accordion-social.cjs +17 -10
  22. package/dist/footer-accordion-social.js +17 -10
  23. package/dist/footer-animated-social.cjs +17 -10
  24. package/dist/footer-animated-social.js +17 -10
  25. package/dist/footer-brand-description.cjs +17 -10
  26. package/dist/footer-brand-description.js +17 -10
  27. package/dist/footer-brand-links-contact.cjs +17 -10
  28. package/dist/footer-brand-links-contact.js +17 -10
  29. package/dist/footer-comprehensive-links.cjs +17 -10
  30. package/dist/footer-comprehensive-links.js +17 -10
  31. package/dist/footer-contact-card.cjs +17 -10
  32. package/dist/footer-contact-card.js +17 -10
  33. package/dist/footer-cta-banner.cjs +17 -10
  34. package/dist/footer-cta-banner.js +17 -10
  35. package/dist/footer-cta-social.cjs +17 -10
  36. package/dist/footer-cta-social.js +17 -10
  37. package/dist/footer-info-cards-accordion.cjs +17 -10
  38. package/dist/footer-info-cards-accordion.js +17 -10
  39. package/dist/footer-nav-social.cjs +17 -10
  40. package/dist/footer-nav-social.js +17 -10
  41. package/dist/footer-newsletter-contact.cjs +17 -10
  42. package/dist/footer-newsletter-contact.js +17 -10
  43. package/dist/footer-newsletter-grid.cjs +17 -10
  44. package/dist/footer-newsletter-grid.js +17 -10
  45. package/dist/footer-newsletter-minimal.cjs +17 -10
  46. package/dist/footer-newsletter-minimal.js +17 -10
  47. package/dist/footer-social-apps.cjs +17 -10
  48. package/dist/footer-social-apps.js +17 -10
  49. package/dist/footer-social-newsletter.cjs +17 -10
  50. package/dist/footer-social-newsletter.js +17 -10
  51. package/dist/footer-split-image-accordion.cjs +17 -10
  52. package/dist/footer-split-image-accordion.js +17 -10
  53. package/dist/hero-badge-shadow-overlay.cjs +1 -1
  54. package/dist/hero-badge-shadow-overlay.js +1 -1
  55. package/dist/hero-coming-soon-countdown.cjs +17 -10
  56. package/dist/hero-coming-soon-countdown.js +17 -10
  57. package/dist/hero-video-background-dark.cjs +78 -16
  58. package/dist/hero-video-background-dark.d.cts +7 -2
  59. package/dist/hero-video-background-dark.d.ts +7 -2
  60. package/dist/hero-video-background-dark.js +78 -16
  61. package/dist/index.cjs +35 -10
  62. package/dist/index.d.cts +1 -0
  63. package/dist/index.d.ts +1 -0
  64. package/dist/index.js +35 -11
  65. package/dist/link-page-bento-layout.cjs +17 -10
  66. package/dist/link-page-bento-layout.js +17 -10
  67. package/dist/link-page-grid-cards.cjs +17 -10
  68. package/dist/link-page-grid-cards.js +17 -10
  69. package/dist/link-page-minimal-profile.cjs +17 -10
  70. package/dist/link-page-minimal-profile.js +17 -10
  71. package/dist/link-page-newsletter-social.cjs +17 -10
  72. package/dist/link-page-newsletter-social.js +17 -10
  73. package/dist/link-tree-block.cjs +17 -10
  74. package/dist/link-tree-block.js +17 -10
  75. package/dist/navbar-fullscreen-menu.cjs +17 -10
  76. package/dist/navbar-fullscreen-menu.js +17 -10
  77. package/dist/navbar-transparent-overlay.cjs +17 -10
  78. package/dist/navbar-transparent-overlay.js +17 -10
  79. package/dist/registry.cjs +1398 -851
  80. package/dist/registry.js +1398 -851
  81. package/dist/social-link-icon.cjs +17 -10
  82. package/dist/social-link-icon.d.cts +5 -0
  83. package/dist/social-link-icon.d.ts +5 -0
  84. package/dist/social-link-icon.js +17 -10
  85. package/dist/testimonials-animated-split.cjs +5 -5
  86. package/dist/testimonials-animated-split.js +5 -5
  87. package/dist/testimonials-bento-grid.cjs +48 -56
  88. package/dist/testimonials-bento-grid.js +48 -56
  89. package/dist/testimonials-carousel-image.cjs +608 -96
  90. package/dist/testimonials-carousel-image.d.cts +26 -2
  91. package/dist/testimonials-carousel-image.d.ts +26 -2
  92. package/dist/testimonials-carousel-image.js +609 -97
  93. package/dist/testimonials-centered-avatars.cjs +89 -62
  94. package/dist/testimonials-centered-avatars.d.cts +5 -1
  95. package/dist/testimonials-centered-avatars.d.ts +5 -1
  96. package/dist/testimonials-centered-avatars.js +89 -62
  97. package/dist/testimonials-company-logo.cjs +6 -6
  98. package/dist/testimonials-company-logo.js +6 -6
  99. package/dist/testimonials-grid-add-review.cjs +51 -29
  100. package/dist/testimonials-grid-add-review.js +51 -29
  101. package/dist/testimonials-images-helpful.cjs +181 -160
  102. package/dist/testimonials-images-helpful.d.cts +9 -1
  103. package/dist/testimonials-images-helpful.d.ts +9 -1
  104. package/dist/testimonials-images-helpful.js +181 -159
  105. package/dist/testimonials-list-verified.cjs +63 -44
  106. package/dist/testimonials-list-verified.d.cts +5 -1
  107. package/dist/testimonials-list-verified.d.ts +5 -1
  108. package/dist/testimonials-list-verified.js +64 -45
  109. package/dist/testimonials-logo-cards.cjs +53 -29
  110. package/dist/testimonials-logo-cards.d.cts +5 -1
  111. package/dist/testimonials-logo-cards.d.ts +5 -1
  112. package/dist/testimonials-logo-cards.js +53 -29
  113. package/dist/testimonials-marquee.cjs +524 -102
  114. package/dist/testimonials-marquee.d.cts +5 -1
  115. package/dist/testimonials-marquee.d.ts +5 -1
  116. package/dist/testimonials-marquee.js +525 -100
  117. package/dist/testimonials-mini-dividers.cjs +120 -83
  118. package/dist/testimonials-mini-dividers.d.cts +10 -6
  119. package/dist/testimonials-mini-dividers.d.ts +10 -6
  120. package/dist/testimonials-mini-dividers.js +120 -83
  121. package/dist/testimonials-minimal-numbered.cjs +7 -6
  122. package/dist/testimonials-minimal-numbered.d.cts +5 -1
  123. package/dist/testimonials-minimal-numbered.d.ts +5 -1
  124. package/dist/testimonials-minimal-numbered.js +7 -6
  125. package/dist/testimonials-parallax-number.cjs +14 -8
  126. package/dist/testimonials-parallax-number.js +14 -8
  127. package/dist/testimonials-scrolling-columns.cjs +97 -13
  128. package/dist/testimonials-scrolling-columns.js +97 -13
  129. package/dist/testimonials-simple-grid.cjs +513 -68
  130. package/dist/testimonials-simple-grid.d.cts +9 -5
  131. package/dist/testimonials-simple-grid.d.ts +9 -5
  132. package/dist/testimonials-simple-grid.js +510 -62
  133. package/dist/testimonials-slider-minimal.cjs +604 -90
  134. package/dist/testimonials-slider-minimal.d.cts +17 -1
  135. package/dist/testimonials-slider-minimal.d.ts +17 -1
  136. package/dist/testimonials-slider-minimal.js +598 -81
  137. package/dist/testimonials-split-image.cjs +452 -17
  138. package/dist/testimonials-split-image.js +448 -13
  139. package/dist/testimonials-twitter-cards.cjs +26 -14
  140. package/dist/testimonials-twitter-cards.js +26 -14
  141. package/package.json +11 -1
package/dist/registry.js CHANGED
@@ -40,16 +40,6 @@ import { TextInput as TextInput$1 } from '@page-speed/forms/inputs';
40
40
  function cn(...inputs) {
41
41
  return twMerge(clsx(inputs));
42
42
  }
43
- var BRIGHTNESS_CLASS_MAP = {
44
- "10": "brightness-[.1]",
45
- "20": "brightness-[.2]",
46
- "25": "brightness-[.25]",
47
- "30": "brightness-[.3]",
48
- "40": "brightness-[.4]",
49
- "50": "brightness-50",
50
- "75": "brightness-75",
51
- "100": "brightness-100"
52
- };
53
43
  function getNestedCardBg(parentBg, variant = "muted", options) {
54
44
  const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
55
45
  if (isDark) {
@@ -2030,6 +2020,23 @@ function PopoverContent({
2030
2020
  }
2031
2021
  ) });
2032
2022
  }
2023
+ function StarRating({
2024
+ rating,
2025
+ size = 18,
2026
+ className
2027
+ }) {
2028
+ return /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-0.5", className), children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsx(
2029
+ DynamicIcon,
2030
+ {
2031
+ name: "icon-park-solid/star",
2032
+ size,
2033
+ className: cn(
2034
+ star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
2035
+ )
2036
+ },
2037
+ star
2038
+ )) });
2039
+ }
2033
2040
  var BUTTON_SIZES = {
2034
2041
  sm: { buttonSize: "size-8", iconSize: 16 },
2035
2042
  md: { buttonSize: "size-10", iconSize: 20 },
@@ -2131,6 +2138,7 @@ var SocialLinkIcon = React8.forwardRef(
2131
2138
  iconClassName,
2132
2139
  className,
2133
2140
  iconNameOverride,
2141
+ iconOnly = false,
2134
2142
  ...pressableProps
2135
2143
  }, ref) => {
2136
2144
  const platform = usePlatformFromUrl(href);
@@ -2143,6 +2151,21 @@ var SocialLinkIcon = React8.forwardRef(
2143
2151
  const accessibleLabel = React8.useMemo(() => {
2144
2152
  return label || platformName;
2145
2153
  }, [label, platformName]);
2154
+ const icon = React8.useMemo(() => {
2155
+ return /* @__PURE__ */ jsx(
2156
+ DynamicIcon,
2157
+ {
2158
+ name: iconName,
2159
+ size: iconSize,
2160
+ color: iconColor,
2161
+ className: iconClassName,
2162
+ alt: accessibleLabel
2163
+ }
2164
+ );
2165
+ }, [iconName, iconSize, iconColor, iconClassName, accessibleLabel]);
2166
+ if (iconOnly) {
2167
+ return icon;
2168
+ }
2146
2169
  return /* @__PURE__ */ jsx(
2147
2170
  Pressable,
2148
2171
  {
@@ -2154,16 +2177,7 @@ var SocialLinkIcon = React8.forwardRef(
2154
2177
  className
2155
2178
  ),
2156
2179
  ...pressableProps,
2157
- children: /* @__PURE__ */ jsx(
2158
- DynamicIcon,
2159
- {
2160
- name: iconName,
2161
- size: iconSize,
2162
- color: iconColor,
2163
- className: iconClassName,
2164
- alt: accessibleLabel
2165
- }
2166
- )
2180
+ children: icon
2167
2181
  }
2168
2182
  );
2169
2183
  }
@@ -19721,6 +19735,67 @@ function ContactHelpCenter({
19721
19735
  }
19722
19736
  );
19723
19737
  }
19738
+ var DIRECTION_STYLES = {
19739
+ "bottom-to-top": "bg-linear-to-t",
19740
+ "top-to-bottom": "bg-linear-to-b",
19741
+ "left-to-right": "bg-linear-to-r",
19742
+ "right-to-left": "bg-linear-to-l",
19743
+ "bottom-left-to-top-right": "bg-linear-to-tr",
19744
+ "bottom-right-to-top-left": "bg-linear-to-tl",
19745
+ "top-left-to-bottom-right": "bg-linear-to-br",
19746
+ "top-right-to-bottom-left": "bg-linear-to-bl"
19747
+ };
19748
+ var INTENSITY_STOPS = {
19749
+ low: "from-black/40 via-black/20 to-transparent",
19750
+ default: "from-black/70 via-black/35 to-transparent",
19751
+ high: "from-black/85 via-black/50 to-transparent",
19752
+ "very-high": "from-black/95 via-black/60 to-black/20"
19753
+ };
19754
+ var RADIAL_INTENSITY = {
19755
+ low: {
19756
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.40) 0%, rgba(0,0,0,0.20) 50%, transparent 100%)"
19757
+ },
19758
+ default: {
19759
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.70) 0%, rgba(0,0,0,0.35) 50%, transparent 100%)"
19760
+ },
19761
+ high: {
19762
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.50) 50%, transparent 100%)"
19763
+ },
19764
+ "very-high": {
19765
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.95) 0%, rgba(0,0,0,0.60) 50%, rgba(0,0,0,0.20) 100%)"
19766
+ }
19767
+ };
19768
+ function GradientOverlay({
19769
+ direction = "bottom-to-top",
19770
+ intensity = "default",
19771
+ className,
19772
+ style,
19773
+ ...props
19774
+ }) {
19775
+ if (direction === "radial-center") {
19776
+ return /* @__PURE__ */ jsx(
19777
+ "div",
19778
+ {
19779
+ className: cn("absolute inset-0", className),
19780
+ style: { ...RADIAL_INTENSITY[intensity], ...style },
19781
+ ...props
19782
+ }
19783
+ );
19784
+ }
19785
+ return /* @__PURE__ */ jsx(
19786
+ "div",
19787
+ {
19788
+ className: cn(
19789
+ "absolute inset-0",
19790
+ DIRECTION_STYLES[direction],
19791
+ INTENSITY_STOPS[intensity],
19792
+ className
19793
+ ),
19794
+ style,
19795
+ ...props
19796
+ }
19797
+ );
19798
+ }
19724
19799
  function CarouselAnimatedSections({
19725
19800
  sections,
19726
19801
  sectionsSlot,
@@ -19736,7 +19811,8 @@ function CarouselAnimatedSections({
19736
19811
  navigationClassName,
19737
19812
  arrowsClassName,
19738
19813
  counterClassName,
19739
- slideMediaBrightness = "50",
19814
+ slideMediaBrightness,
19815
+ slideMediaOverlayIntensity = "high",
19740
19816
  optixFlowConfig,
19741
19817
  background = "dark",
19742
19818
  spacing = "py-0",
@@ -19825,7 +19901,7 @@ function CarouselAnimatedSections({
19825
19901
  containerMaxWidth,
19826
19902
  containerClassName,
19827
19903
  children: [
19828
- sectionsSlot ? sectionsSlot : currentSection ? /* @__PURE__ */ jsx(AnimatePresence, { initial: false, custom: direction, mode: "wait", children: /* @__PURE__ */ jsx(
19904
+ sectionsSlot ? sectionsSlot : currentSection ? /* @__PURE__ */ jsx(AnimatePresence, { initial: false, custom: direction, mode: "wait", children: /* @__PURE__ */ jsxs(
19829
19905
  motion.div,
19830
19906
  {
19831
19907
  custom: direction,
@@ -19836,19 +19912,21 @@ function CarouselAnimatedSections({
19836
19912
  transition: { duration: 0.6, ease: [0.4, 0, 0.2, 1] },
19837
19913
  onAnimationComplete: () => setIsAnimating(false),
19838
19914
  className: cn("absolute inset-0", currentSection?.className),
19839
- children: /* @__PURE__ */ jsx(
19840
- Img,
19841
- {
19842
- src: currentSection?.image,
19843
- alt: typeof currentSection?.title === "string" ? currentSection?.title : `Section ${currentSection?.id}`,
19844
- className: cn(
19845
- "h-full w-full object-cover",
19846
- BRIGHTNESS_CLASS_MAP[slideMediaBrightness],
19847
- currentSection?.imageClassName
19848
- ),
19849
- optixFlowConfig
19850
- }
19851
- )
19915
+ children: [
19916
+ /* @__PURE__ */ jsx(
19917
+ Img,
19918
+ {
19919
+ src: currentSection?.image,
19920
+ alt: typeof currentSection?.title === "string" ? currentSection?.title : `Section ${currentSection?.id}`,
19921
+ className: cn(
19922
+ "h-full w-full object-cover",
19923
+ currentSection?.imageClassName
19924
+ ),
19925
+ optixFlowConfig
19926
+ }
19927
+ ),
19928
+ /* @__PURE__ */ jsx(GradientOverlay, { intensity: slideMediaOverlayIntensity })
19929
+ ]
19852
19930
  },
19853
19931
  currentIndex
19854
19932
  ) }) : null,
@@ -20813,7 +20891,8 @@ function CarouselGalleryThumbnails({
20813
20891
  spacing = "sm",
20814
20892
  pattern,
20815
20893
  patternOpacity,
20816
- slideMediaBrightness = "100"
20894
+ slideMediaBrightness,
20895
+ slideMediaOverlayIntensity = "default"
20817
20896
  }) {
20818
20897
  const [currentIndex, setCurrentIndex] = React8.useState(0);
20819
20898
  const prevSlide = React8.useCallback(() => {
@@ -20862,7 +20941,7 @@ function CarouselGalleryThumbnails({
20862
20941
  "relative aspect-video w-full overflow-hidden",
20863
20942
  slideClassName
20864
20943
  ),
20865
- children: imagesSlot ? imagesSlot : images?.map((image, index) => /* @__PURE__ */ jsx(
20944
+ children: imagesSlot ? imagesSlot : images?.map((image, index) => /* @__PURE__ */ jsxs(
20866
20945
  "div",
20867
20946
  {
20868
20947
  className: cn(
@@ -20870,19 +20949,21 @@ function CarouselGalleryThumbnails({
20870
20949
  index === currentIndex ? "translate-x-0 opacity-100" : index < currentIndex ? "-translate-x-full opacity-0" : "translate-x-full opacity-0",
20871
20950
  image.className
20872
20951
  ),
20873
- children: /* @__PURE__ */ jsx(
20874
- Img,
20875
- {
20876
- src: image.src,
20877
- alt: typeof image.alt === "string" ? image.alt : `Image ${index + 1}`,
20878
- className: cn(
20879
- "h-full w-full object-cover",
20880
- BRIGHTNESS_CLASS_MAP[slideMediaBrightness],
20881
- image.imageClassName
20882
- ),
20883
- optixFlowConfig
20884
- }
20885
- )
20952
+ children: [
20953
+ /* @__PURE__ */ jsx(
20954
+ Img,
20955
+ {
20956
+ src: image.src,
20957
+ alt: typeof image.alt === "string" ? image.alt : `Image ${index + 1}`,
20958
+ className: cn(
20959
+ "h-full w-full object-cover",
20960
+ image.imageClassName
20961
+ ),
20962
+ optixFlowConfig
20963
+ }
20964
+ ),
20965
+ /* @__PURE__ */ jsx(GradientOverlay, { intensity: slideMediaOverlayIntensity })
20966
+ ]
20886
20967
  },
20887
20968
  `slide-${index}`
20888
20969
  ))
@@ -21699,7 +21780,8 @@ function CarouselPortfolioHero({
21699
21780
  spacing = "none",
21700
21781
  pattern,
21701
21782
  patternOpacity,
21702
- slideMediaBrightness = "50"
21783
+ slideMediaBrightness,
21784
+ slideMediaOverlayIntensity = "high"
21703
21785
  }) {
21704
21786
  const [currentIndex, setCurrentIndex] = React8.useState(0);
21705
21787
  const intervalRef = React8.useRef(null);
@@ -21740,7 +21822,7 @@ function CarouselPortfolioHero({
21740
21822
  patternOpacity,
21741
21823
  containerClassName,
21742
21824
  children: [
21743
- slidesSlot ? slidesSlot : slides?.map((slide, index) => /* @__PURE__ */ jsx(
21825
+ slidesSlot ? slidesSlot : slides?.map((slide, index) => /* @__PURE__ */ jsxs(
21744
21826
  "div",
21745
21827
  {
21746
21828
  className: cn(
@@ -21748,19 +21830,21 @@ function CarouselPortfolioHero({
21748
21830
  index === currentIndex ? "opacity-100" : "opacity-0",
21749
21831
  slide.className
21750
21832
  ),
21751
- children: /* @__PURE__ */ jsx(
21752
- Img,
21753
- {
21754
- src: slide.image,
21755
- alt: typeof slide.title === "string" ? slide.title : `Slide ${index + 1}`,
21756
- className: cn(
21757
- "h-full w-full object-cover",
21758
- BRIGHTNESS_CLASS_MAP[slideMediaBrightness],
21759
- slide.imageClassName
21760
- ),
21761
- optixFlowConfig
21762
- }
21763
- )
21833
+ children: [
21834
+ /* @__PURE__ */ jsx(
21835
+ Img,
21836
+ {
21837
+ src: slide.image,
21838
+ alt: typeof slide.title === "string" ? slide.title : `Slide ${index + 1}`,
21839
+ className: cn(
21840
+ "h-full w-full object-cover",
21841
+ slide.imageClassName
21842
+ ),
21843
+ optixFlowConfig
21844
+ }
21845
+ ),
21846
+ /* @__PURE__ */ jsx(GradientOverlay, { intensity: slideMediaOverlayIntensity })
21847
+ ]
21764
21848
  },
21765
21849
  slide.id
21766
21850
  )),
@@ -43809,19 +43893,6 @@ function CaseStudiesTestimonialStats({
43809
43893
  }
43810
43894
  );
43811
43895
  }
43812
- function StarRating({ rating, size = 16 }) {
43813
- return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-0.5", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsx(
43814
- DynamicIcon,
43815
- {
43816
- name: "lucide/star",
43817
- size,
43818
- className: cn(
43819
- star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
43820
- )
43821
- },
43822
- star
43823
- )) });
43824
- }
43825
43896
  function TestimonialsListVerified({
43826
43897
  reviews,
43827
43898
  reviewsSlot,
@@ -43834,7 +43905,8 @@ function TestimonialsListVerified({
43834
43905
  contentClassName,
43835
43906
  authorClassName,
43836
43907
  background,
43837
- spacing,
43908
+ spacing = "lg",
43909
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
43838
43910
  pattern,
43839
43911
  patternOpacity
43840
43912
  }) {
@@ -43853,35 +43925,49 @@ function TestimonialsListVerified({
43853
43925
  return /* @__PURE__ */ jsx("div", { className: "space-y-0", children: reviews.map((review, index) => {
43854
43926
  const authorName = getAuthorName(review);
43855
43927
  return /* @__PURE__ */ jsxs("div", { className: reviewClassName, children: [
43856
- index > 0 && /* @__PURE__ */ jsx(Separator, { className: "my-6" }),
43857
- /* @__PURE__ */ jsxs("div", { className: cn("space-y-3", contentClassName), children: [
43858
- /* @__PURE__ */ jsxs("div", { children: [
43859
- /* @__PURE__ */ jsx(StarRating, { rating: review.rating, size: 16 }),
43860
- review.title && (typeof review.title === "string" ? /* @__PURE__ */ jsx("h3", { className: "mt-2 font-medium", children: review.title }) : /* @__PURE__ */ jsx("div", { className: "mt-2", children: review.title }))
43928
+ index > 0 && /* @__PURE__ */ jsx(Separator, { className: "bg-border/50 shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px my-12 md:my-16" }),
43929
+ /* @__PURE__ */ jsxs("div", { className: cn("space-y-6 md:space-y-12", contentClassName), children: [
43930
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
43931
+ /* @__PURE__ */ jsx(StarRating, { rating: review.rating, size: 22 }),
43932
+ review.title && (typeof review.title === "string" ? /* @__PURE__ */ jsx("h3", { className: "font-medium", children: review.title }) : review.title)
43861
43933
  ] }),
43862
- review.content && (typeof review.content === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm leading-relaxed text-muted-foreground", children: review.content }) : review.content),
43863
- /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-3", authorClassName), children: [
43864
- /* @__PURE__ */ jsxs(Avatar, { className: "size-8", children: [
43865
- /* @__PURE__ */ jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
43866
- /* @__PURE__ */ jsx(AvatarFallback, { className: "text-xs", children: getInitials(authorName) })
43867
- ] }),
43868
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
43869
- review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsx("span", { className: "font-medium", children: review.author }) : review.author),
43870
- review.verified && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-emerald-600", children: [
43871
- /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/badge-check", size: 16 }),
43872
- verifiedPurchaseLabel && (typeof verifiedPurchaseLabel === "string" ? /* @__PURE__ */ jsx("span", { className: "text-xs", children: verifiedPurchaseLabel }) : verifiedPurchaseLabel),
43873
- !verifiedPurchaseLabel && /* @__PURE__ */ jsx("span", { className: "text-xs", children: "Verified Purchase" })
43874
- ] }),
43875
- review.date && /* @__PURE__ */ jsxs(Fragment$1, { children: [
43876
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "\xB7" }),
43877
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: review.date })
43878
- ] })
43879
- ] })
43934
+ review.content && (typeof review.content === "string" ? /* @__PURE__ */ jsx("p", { className: "text-base md:text-lg leading-relaxed font-light", children: review.content }) : review.content),
43935
+ /* @__PURE__ */ jsxs("div", { className: cn("flex items-center justify-between w-full"), children: [
43936
+ /* @__PURE__ */ jsxs(
43937
+ "div",
43938
+ {
43939
+ className: cn("flex items-center gap-5", authorClassName),
43940
+ children: [
43941
+ /* @__PURE__ */ jsxs(Avatar, { className: "size-12 ring-4 ring-primary shadow-lg", children: [
43942
+ /* @__PURE__ */ jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
43943
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "text-md", children: getInitials(authorName) })
43944
+ ] }),
43945
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-base flex-col items-start", children: [
43946
+ review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsx("span", { className: "font-medium", children: review.author }) : review.author),
43947
+ review.verified && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
43948
+ /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/badge-check", size: 18 }),
43949
+ verifiedPurchaseLabel && (typeof verifiedPurchaseLabel === "string" ? /* @__PURE__ */ jsx("span", { className: "text-sm", children: verifiedPurchaseLabel }) : verifiedPurchaseLabel),
43950
+ !verifiedPurchaseLabel && /* @__PURE__ */ jsx("span", { className: "text-sm", children: "Verified Purchase" })
43951
+ ] })
43952
+ ] })
43953
+ ]
43954
+ }
43955
+ ),
43956
+ review.date && /* @__PURE__ */ jsx("span", { className: "relative", children: review.date })
43880
43957
  ] })
43881
43958
  ] })
43882
43959
  ] }, index);
43883
43960
  }) });
43884
- }, [reviewsSlot, reviews, reviewClassName, contentClassName, authorClassName, verifiedPurchaseLabel, getAuthorName, getInitials]);
43961
+ }, [
43962
+ reviewsSlot,
43963
+ reviews,
43964
+ reviewClassName,
43965
+ contentClassName,
43966
+ authorClassName,
43967
+ verifiedPurchaseLabel,
43968
+ getAuthorName,
43969
+ getInitials
43970
+ ]);
43885
43971
  return /* @__PURE__ */ jsx(
43886
43972
  Section,
43887
43973
  {
@@ -43890,21 +43976,21 @@ function TestimonialsListVerified({
43890
43976
  pattern,
43891
43977
  patternOpacity,
43892
43978
  className,
43893
- children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-3xl", children: [
43894
- /* @__PURE__ */ jsxs("div", { className: cn("mb-8", headerClassName), children: [
43979
+ children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-full md:max-w-3xl", children: [
43980
+ /* @__PURE__ */ jsxs("div", { className: cn("mb-12 md:mb-24 space-y-6", headerClassName), children: [
43895
43981
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
43896
43982
  "h2",
43897
43983
  {
43898
43984
  className: cn(
43899
- "text-2xl font-semibold tracking-tight md:text-3xl",
43985
+ "text-2xl font-semibold tracking-tight md:text-3xl lg:text-4xl",
43900
43986
  headingClassName
43901
43987
  ),
43902
43988
  children: heading
43903
43989
  }
43904
- ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
43990
+ ) : heading),
43905
43991
  totalReviews > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center gap-3", children: [
43906
- /* @__PURE__ */ jsx(StarRating, { rating: Math.round(averageRating), size: 20 }),
43907
- /* @__PURE__ */ jsxs("span", { className: "text-sm text-muted-foreground", children: [
43992
+ /* @__PURE__ */ jsx(StarRating, { rating: Math.round(averageRating), size: 22 }),
43993
+ /* @__PURE__ */ jsxs("span", { className: "text-sm", children: [
43908
43994
  averageRating.toFixed(1),
43909
43995
  " out of 5 \xB7 ",
43910
43996
  totalReviews,
@@ -43917,23 +44003,11 @@ function TestimonialsListVerified({
43917
44003
  }
43918
44004
  );
43919
44005
  }
43920
- function StarRating2({ rating, size = 16 }) {
43921
- return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-0.5", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsx(
43922
- DynamicIcon,
43923
- {
43924
- name: "lucide/star",
43925
- size,
43926
- className: cn(
43927
- star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
43928
- )
43929
- },
43930
- star
43931
- )) });
43932
- }
43933
44006
  function TestimonialsImagesHelpful({
43934
44007
  reviews,
43935
44008
  reviewsSlot,
43936
44009
  heading,
44010
+ verifiedPurchaseLabel,
43937
44011
  writeReviewLabel,
43938
44012
  reportButtonLabel,
43939
44013
  className,
@@ -43945,12 +44019,16 @@ function TestimonialsImagesHelpful({
43945
44019
  imagesClassName,
43946
44020
  onWriteReview,
43947
44021
  background,
43948
- spacing = "py-6 md:py-32",
44022
+ spacing = "lg",
44023
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
43949
44024
  pattern,
43950
44025
  patternOpacity,
43951
44026
  optixFlowConfig
43952
44027
  }) {
43953
44028
  const [helpfulClicked, setHelpfulClicked] = useState(/* @__PURE__ */ new Set());
44029
+ const [lightboxOpen, setLightboxOpen] = useState(false);
44030
+ const [lightboxItems, setLightboxItems] = useState([]);
44031
+ const [lightboxIndex, setLightboxIndex] = useState(0);
43954
44032
  const totalReviews = reviews?.length ?? 0;
43955
44033
  const averageRating = totalReviews > 0 ? (reviews?.reduce((sum, review) => sum + review.rating, 0) ?? 0) / totalReviews : 0;
43956
44034
  const handleHelpful = useCallback((reviewIndex) => {
@@ -43964,6 +44042,25 @@ function TestimonialsImagesHelpful({
43964
44042
  return newSet;
43965
44043
  });
43966
44044
  }, []);
44045
+ const handleImageClick = useCallback(
44046
+ (reviewImages, imageIndex) => {
44047
+ const items = reviewImages.map((src, i) => ({
44048
+ id: `review-image-${i}`,
44049
+ type: "image",
44050
+ src,
44051
+ alt: `Review image ${i + 1}`,
44052
+ download: true,
44053
+ share: true
44054
+ }));
44055
+ setLightboxItems(items);
44056
+ setLightboxIndex(imageIndex);
44057
+ setLightboxOpen(true);
44058
+ },
44059
+ []
44060
+ );
44061
+ const handleLightboxClose = useCallback(() => {
44062
+ setLightboxOpen(false);
44063
+ }, []);
43967
44064
  const getAuthorName = useCallback((review) => {
43968
44065
  if (typeof review.author === "string") return review.author;
43969
44066
  return "";
@@ -43977,54 +44074,28 @@ function TestimonialsImagesHelpful({
43977
44074
  return /* @__PURE__ */ jsx("div", { className: "space-y-0", children: reviews.map((review, index) => {
43978
44075
  const authorName = getAuthorName(review);
43979
44076
  return /* @__PURE__ */ jsxs("div", { className: reviewClassName, children: [
43980
- index > 0 && /* @__PURE__ */ jsx(Separator, { className: "my-6" }),
43981
- /* @__PURE__ */ jsx(Card, { className: "border-0 p-0 shadow-none", children: /* @__PURE__ */ jsxs(CardContent, { className: cn("space-y-4 p-0", contentClassName), children: [
43982
- /* @__PURE__ */ jsxs(
43983
- "div",
43984
- {
43985
- className: cn(
43986
- "flex items-start justify-between gap-4",
43987
- authorClassName
43988
- ),
43989
- children: [
43990
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
43991
- /* @__PURE__ */ jsxs(Avatar, { className: "size-10", children: [
43992
- /* @__PURE__ */ jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
43993
- /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(authorName) })
43994
- ] }),
43995
- /* @__PURE__ */ jsxs("div", { children: [
43996
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
43997
- review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsx("span", { className: "font-medium", children: review.author }) : review.author),
43998
- review.verified && /* @__PURE__ */ jsx("span", { className: "flex items-center gap-1 text-emerald-600", children: /* @__PURE__ */ jsx(
43999
- DynamicIcon,
44000
- {
44001
- name: "lucide/badge-check",
44002
- size: 16
44003
- }
44004
- ) })
44005
- ] }),
44006
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
44007
- review.date && /* @__PURE__ */ jsx("span", { children: review.date }),
44008
- review.variant && /* @__PURE__ */ jsxs(Fragment$1, { children: [
44009
- /* @__PURE__ */ jsx("span", { children: "\xB7" }),
44010
- /* @__PURE__ */ jsx("span", { children: review.variant })
44011
- ] })
44012
- ] })
44013
- ] })
44014
- ] }),
44015
- /* @__PURE__ */ jsx(StarRating2, { rating: review.rating, size: 16 })
44016
- ]
44017
- }
44018
- ),
44019
- /* @__PURE__ */ jsxs("div", { children: [
44020
- review.title && (typeof review.title === "string" ? /* @__PURE__ */ jsx("h3", { className: "font-medium", children: review.title }) : review.title),
44021
- review.content && (typeof review.content === "string" ? /* @__PURE__ */ jsx("p", { className: "mt-2 text-sm leading-relaxed text-muted-foreground", children: review.content }) : /* @__PURE__ */ jsx("div", { className: "mt-2", children: review.content }))
44077
+ index > 0 && /* @__PURE__ */ jsx(Separator, { className: "bg-border/50 shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px my-12 md:my-16" }),
44078
+ /* @__PURE__ */ jsxs("div", { className: cn("space-y-6 md:space-y-12", contentClassName), children: [
44079
+ /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
44080
+ /* @__PURE__ */ jsx(StarRating, { rating: review.rating, size: 22 }),
44081
+ review.title && (typeof review.title === "string" ? /* @__PURE__ */ jsx("h3", { className: "font-medium", children: review.title }) : review.title)
44022
44082
  ] }),
44023
- review.images && review.images.length > 0 && /* @__PURE__ */ jsx("div", { className: cn("flex gap-2", imagesClassName), children: review.images.map((image, imgIndex) => /* @__PURE__ */ jsx(
44083
+ review.content && (typeof review.content === "string" ? /* @__PURE__ */ jsx("p", { className: "text-base md:text-lg leading-relaxed font-light", children: review.content }) : review.content),
44084
+ review.images && review.images.length > 0 && /* @__PURE__ */ jsx("div", { className: cn("flex gap-3", imagesClassName), children: review.images.map((image, imgIndex) => /* @__PURE__ */ jsx(
44024
44085
  "div",
44025
44086
  {
44026
- className: "size-20 overflow-hidden rounded-lg sm:size-24",
44027
- children: /* @__PURE__ */ jsx(AspectRatio, { ratio: 1, children: /* @__PURE__ */ jsx(
44087
+ className: "size-20 cursor-pointer overflow-hidden rounded-lg sm:size-24 transition-transform duration-300 hover:scale-[1.03] shadow-sm hover:shadow-lg",
44088
+ onClick: () => handleImageClick(review.images, imgIndex),
44089
+ role: "button",
44090
+ tabIndex: 0,
44091
+ onKeyDown: (e) => {
44092
+ if (e.key === "Enter" || e.key === " ") {
44093
+ e.preventDefault();
44094
+ handleImageClick(review.images, imgIndex);
44095
+ }
44096
+ },
44097
+ "aria-label": `View review image ${imgIndex + 1} in lightbox`,
44098
+ children: /* @__PURE__ */ jsx(
44028
44099
  Img,
44029
44100
  {
44030
44101
  src: image,
@@ -44032,54 +44103,85 @@ function TestimonialsImagesHelpful({
44032
44103
  className: "size-full object-cover",
44033
44104
  optixFlowConfig
44034
44105
  }
44035
- ) })
44106
+ )
44036
44107
  },
44037
44108
  imgIndex
44038
44109
  )) }),
44039
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
44110
+ /* @__PURE__ */ jsxs("div", { className: cn("flex items-center justify-between w-full"), children: [
44040
44111
  /* @__PURE__ */ jsxs(
44041
- Pressable,
44112
+ "div",
44042
44113
  {
44043
- asButton: true,
44044
- variant: "ghost",
44045
- size: "sm",
44046
- className: cn(
44047
- "h-8 gap-1.5 text-muted-foreground",
44048
- helpfulClicked.has(index) && "text-foreground"
44049
- ),
44050
- onClick: () => handleHelpful(index),
44114
+ className: cn("flex items-center gap-5", authorClassName),
44051
44115
  children: [
44052
- /* @__PURE__ */ jsx(
44053
- DynamicIcon,
44054
- {
44055
- name: "lucide/thumbs-up",
44056
- size: 16,
44057
- className: cn(
44058
- helpfulClicked.has(index) && "fill-current"
44059
- )
44060
- }
44061
- ),
44062
- "Helpful",
44063
- review.helpful !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
44064
- "(",
44065
- review.helpful + (helpfulClicked.has(index) ? 1 : 0),
44066
- ")"
44116
+ /* @__PURE__ */ jsxs(Avatar, { className: "size-12 ring-4 ring-primary shadow-lg", children: [
44117
+ /* @__PURE__ */ jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
44118
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "text-md", children: getInitials(authorName) })
44119
+ ] }),
44120
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-start gap-0", children: [
44121
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
44122
+ review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsx("span", { className: "font-medium", children: review.author }) : review.author),
44123
+ review.verified && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
44124
+ /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/badge-check", size: 18 }),
44125
+ verifiedPurchaseLabel && (typeof verifiedPurchaseLabel === "string" ? /* @__PURE__ */ jsx("span", { className: "text-sm", children: verifiedPurchaseLabel }) : verifiedPurchaseLabel),
44126
+ !verifiedPurchaseLabel && /* @__PURE__ */ jsx("span", { className: "text-sm", children: "Verified Purchase" })
44127
+ ] })
44128
+ ] }),
44129
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
44130
+ review.date && /* @__PURE__ */ jsx("span", { children: review.date }),
44131
+ review.variant && /* @__PURE__ */ jsxs(Fragment$1, { children: [
44132
+ /* @__PURE__ */ jsx("span", { children: "\xB7" }),
44133
+ /* @__PURE__ */ jsx("span", { children: review.variant })
44134
+ ] })
44135
+ ] })
44067
44136
  ] })
44068
44137
  ]
44069
44138
  }
44070
44139
  ),
44071
- /* @__PURE__ */ jsx(
44072
- Pressable,
44073
- {
44074
- asButton: true,
44075
- variant: "ghost",
44076
- size: "sm",
44077
- className: "h-8 text-muted-foreground",
44078
- children: reportButtonLabel ?? "Report"
44079
- }
44080
- )
44140
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
44141
+ /* @__PURE__ */ jsxs(
44142
+ Pressable,
44143
+ {
44144
+ asButton: true,
44145
+ variant: "ghost",
44146
+ size: "sm",
44147
+ className: cn(
44148
+ "h-8 gap-1.5",
44149
+ helpfulClicked.has(index) ? "text-foreground" : "text-muted-foreground"
44150
+ ),
44151
+ onClick: () => handleHelpful(index),
44152
+ children: [
44153
+ /* @__PURE__ */ jsx(
44154
+ DynamicIcon,
44155
+ {
44156
+ name: "lucide/thumbs-up",
44157
+ size: 16,
44158
+ className: cn(
44159
+ helpfulClicked.has(index) && "fill-current"
44160
+ )
44161
+ }
44162
+ ),
44163
+ "Helpful",
44164
+ review.helpful !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
44165
+ "(",
44166
+ review.helpful + (helpfulClicked.has(index) ? 1 : 0),
44167
+ ")"
44168
+ ] })
44169
+ ]
44170
+ }
44171
+ ),
44172
+ /* @__PURE__ */ jsx(
44173
+ Pressable,
44174
+ {
44175
+ asButton: true,
44176
+ variant: "ghost",
44177
+ size: "sm",
44178
+ className: "h-8 text-muted-foreground",
44179
+ children: reportButtonLabel ?? "Report"
44180
+ }
44181
+ )
44182
+ ] })
44081
44183
  ] })
44082
- ] }) })
44184
+ ] })
44083
44185
  ] }, index);
44084
44186
  }) });
44085
44187
  }, [
@@ -44092,11 +44194,13 @@ function TestimonialsImagesHelpful({
44092
44194
  helpfulClicked,
44093
44195
  optixFlowConfig,
44094
44196
  reportButtonLabel,
44197
+ verifiedPurchaseLabel,
44095
44198
  getAuthorName,
44096
44199
  getInitials,
44097
- handleHelpful
44200
+ handleHelpful,
44201
+ handleImageClick
44098
44202
  ]);
44099
- return /* @__PURE__ */ jsx(
44203
+ return /* @__PURE__ */ jsxs(
44100
44204
  Section,
44101
44205
  {
44102
44206
  background,
@@ -44104,42 +44208,57 @@ function TestimonialsImagesHelpful({
44104
44208
  pattern,
44105
44209
  patternOpacity,
44106
44210
  className,
44107
- children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-3xl", children: [
44108
- /* @__PURE__ */ jsxs(
44109
- "div",
44110
- {
44111
- className: cn(
44112
- "mb-8 flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between",
44113
- headerClassName
44114
- ),
44115
- children: [
44116
- /* @__PURE__ */ jsxs("div", { children: [
44117
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
44118
- "h2",
44119
- {
44120
- className: cn(
44121
- "text-2xl font-semibold tracking-tight md:text-3xl",
44122
- headingClassName
44123
- ),
44124
- children: heading
44125
- }
44126
- ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
44127
- totalReviews > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center gap-2", children: [
44128
- /* @__PURE__ */ jsx(StarRating2, { rating: Math.round(averageRating), size: 20 }),
44129
- /* @__PURE__ */ jsx("span", { className: "text-lg font-semibold", children: averageRating.toFixed(1) }),
44130
- /* @__PURE__ */ jsxs("span", { className: "text-sm text-muted-foreground", children: [
44131
- "(",
44132
- totalReviews,
44133
- " reviews)"
44134
- ] })
44135
- ] })
44136
- ] }),
44211
+ containerClassName,
44212
+ children: [
44213
+ /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-full md:max-w-3xl", children: [
44214
+ /* @__PURE__ */ jsxs("div", { className: cn("mb-12 md:mb-24 space-y-6", headerClassName), children: [
44215
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between", children: [
44216
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
44217
+ "h2",
44218
+ {
44219
+ className: cn(
44220
+ "text-2xl font-semibold tracking-tight md:text-3xl lg:text-4xl",
44221
+ headingClassName
44222
+ ),
44223
+ children: heading
44224
+ }
44225
+ ) : heading),
44137
44226
  (writeReviewLabel || onWriteReview) && /* @__PURE__ */ jsx(Pressable, { asButton: true, variant: "outline", onClick: onWriteReview, children: writeReviewLabel })
44138
- ]
44227
+ ] }),
44228
+ totalReviews > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center gap-3", children: [
44229
+ /* @__PURE__ */ jsx(StarRating, { rating: Math.round(averageRating), size: 22 }),
44230
+ /* @__PURE__ */ jsxs("span", { className: "text-sm", children: [
44231
+ averageRating.toFixed(1),
44232
+ " out of 5 \xB7 ",
44233
+ totalReviews,
44234
+ " reviews"
44235
+ ] })
44236
+ ] })
44237
+ ] }),
44238
+ renderedReviews
44239
+ ] }),
44240
+ lightboxOpen && /* @__PURE__ */ jsx(
44241
+ Lightbox,
44242
+ {
44243
+ items: lightboxItems,
44244
+ initialIndex: lightboxIndex,
44245
+ layout: "horizontal",
44246
+ controls: {
44247
+ navigation: true,
44248
+ thumbnails: true,
44249
+ download: true,
44250
+ share: true,
44251
+ fullscreen: true,
44252
+ captions: true,
44253
+ counter: true
44254
+ },
44255
+ onClose: handleLightboxClose,
44256
+ enableKeyboardShortcuts: true,
44257
+ closeOnEscape: true,
44258
+ closeOnBackdropClick: true
44139
44259
  }
44140
- ),
44141
- renderedReviews
44142
- ] })
44260
+ )
44261
+ ]
44143
44262
  }
44144
44263
  );
44145
44264
  }
@@ -44195,10 +44314,13 @@ function TestimonialsBentoGrid({
44195
44314
  ),
44196
44315
  children: [
44197
44316
  /* @__PURE__ */ jsx(
44198
- Card,
44317
+ "div",
44199
44318
  {
44200
- className: cn("md:col-span-2 lg:row-span-2", featuredCardClassName),
44201
- children: /* @__PURE__ */ jsxs(CardContent, { className: "flex h-full flex-col justify-between p-6 md:p-8", children: [
44319
+ className: cn(
44320
+ "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border shadow-sm md:col-span-2 lg:row-span-2",
44321
+ featuredCardClassName
44322
+ ),
44323
+ children: /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col justify-between p-6 md:p-8 gap-8 md:gap-12", children: [
44202
44324
  /* @__PURE__ */ jsxs("div", { children: [
44203
44325
  /* @__PURE__ */ jsx(
44204
44326
  DynamicIcon,
@@ -44228,11 +44350,11 @@ function TestimonialsBentoGrid({
44228
44350
  {
44229
44351
  className: cn("mt-6 flex items-center gap-4", authorClassName),
44230
44352
  children: [
44231
- /* @__PURE__ */ jsxs(Avatar, { className: "size-12", children: [
44353
+ /* @__PURE__ */ jsxs(Avatar, { className: "relative flex shrink-0 overflow-hidden rounded-full size-12 ring-4 ring-primary shadow-lg", children: [
44232
44354
  /* @__PURE__ */ jsx(AvatarImage, { src: featuredAvatarSrc, alt: featuredAuthorName }),
44233
44355
  /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(featuredAuthorName) })
44234
44356
  ] }),
44235
- /* @__PURE__ */ jsxs("div", { children: [
44357
+ /* @__PURE__ */ jsxs("div", { className: "space-y-0 leading-tight", children: [
44236
44358
  featured.author && (typeof featured.author === "string" ? /* @__PURE__ */ jsx("p", { className: "font-semibold", children: featured.author }) : featured.author),
44237
44359
  (featured.role || featured.company) && /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
44238
44360
  featured.role && (typeof featured.role === "string" ? featured.role : featured.role),
@@ -44243,7 +44365,8 @@ function TestimonialsBentoGrid({
44243
44365
  {
44244
44366
  href: featured.linkConfig.href,
44245
44367
  className: cn(
44246
- "text-sm text-muted-foreground underline underline-offset-2 hover:text-foreground transition-colors",
44368
+ "text-sm transition-all duration-300",
44369
+ "underline underline-offset-4",
44247
44370
  featured.linkConfig.className
44248
44371
  ),
44249
44372
  children: featured.linkConfig.label
@@ -44259,34 +44382,45 @@ function TestimonialsBentoGrid({
44259
44382
  others.slice(0, 5).map((testimonial, index) => {
44260
44383
  const authorName = getAuthorName(testimonial);
44261
44384
  const avatarSrc = getAvatarSrc(testimonial);
44262
- return /* @__PURE__ */ jsx(Card, { className: cardClassName, children: /* @__PURE__ */ jsxs(CardContent, { className: "flex h-full flex-col justify-between p-6", children: [
44263
- testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxs("blockquote", { className: "text-sm leading-relaxed line-clamp-3", children: [
44264
- "\u201C",
44265
- testimonial.quote,
44266
- "\u201D"
44267
- ] }) : /* @__PURE__ */ jsx("div", { className: "line-clamp-3", children: testimonial.quote })),
44268
- /* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-center gap-3", children: [
44269
- /* @__PURE__ */ jsxs(Avatar, { className: "size-9", children: [
44270
- /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
44271
- /* @__PURE__ */ jsx(AvatarFallback, { className: "text-xs", children: getInitials(authorName) })
44272
- ] }),
44273
- /* @__PURE__ */ jsxs("div", { children: [
44274
- testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: testimonial.author }) : testimonial.author),
44275
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: testimonial.role }) : testimonial.role),
44276
- testimonial.linkConfig?.href && /* @__PURE__ */ jsx(
44277
- Pressable,
44278
- {
44279
- href: testimonial.linkConfig.href,
44280
- className: cn(
44281
- "text-xs text-muted-foreground underline underline-offset-2 hover:text-foreground transition-colors",
44282
- testimonial.linkConfig.className
44283
- ),
44284
- children: testimonial.linkConfig.label
44285
- }
44286
- )
44385
+ return /* @__PURE__ */ jsx(
44386
+ "div",
44387
+ {
44388
+ className: cn(
44389
+ cardClassName,
44390
+ "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border shadow-sm"
44391
+ ),
44392
+ children: /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col justify-between p-6 gap-8", children: [
44393
+ testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxs("blockquote", { className: "text-sm leading-relaxed line-clamp-3", children: [
44394
+ "\u201C",
44395
+ testimonial.quote,
44396
+ "\u201D"
44397
+ ] }) : /* @__PURE__ */ jsx("div", { className: "line-clamp-3", children: testimonial.quote })),
44398
+ /* @__PURE__ */ jsxs("div", { className: "mt-4 flex items-center gap-3", children: [
44399
+ /* @__PURE__ */ jsxs(Avatar, { className: "relative flex shrink-0 overflow-hidden rounded-full size-12 ring-4 ring-primary shadow-lg", children: [
44400
+ /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
44401
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "text-xs", children: getInitials(authorName) })
44402
+ ] }),
44403
+ /* @__PURE__ */ jsxs("div", { className: "space-y-0 leading-tight", children: [
44404
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: testimonial.author }) : testimonial.author),
44405
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-xs", children: testimonial.role }) : testimonial.role),
44406
+ testimonial.linkConfig?.href && /* @__PURE__ */ jsx(
44407
+ Pressable,
44408
+ {
44409
+ href: testimonial.linkConfig.href,
44410
+ className: cn(
44411
+ "text-sm transition-all duration-300",
44412
+ "underline underline-offset-4",
44413
+ testimonial.linkConfig.className
44414
+ ),
44415
+ children: testimonial.linkConfig.label
44416
+ }
44417
+ )
44418
+ ] })
44419
+ ] })
44287
44420
  ] })
44288
- ] })
44289
- ] }) }, index);
44421
+ },
44422
+ index
44423
+ );
44290
44424
  })
44291
44425
  ]
44292
44426
  }
@@ -44383,7 +44517,7 @@ function TestimonialsTwitterCards({
44383
44517
  "div",
44384
44518
  {
44385
44519
  className: cn(
44386
- "grid gap-4 md:gap-6 lg:gap-8 md:grid-cols-2 lg:grid-cols-3",
44520
+ "grid gap-6 lg:gap-8 md:grid-cols-2 lg:grid-cols-3",
44387
44521
  gridClassName
44388
44522
  ),
44389
44523
  children: testimonials.map((testimonial, index) => {
@@ -44393,14 +44527,18 @@ function TestimonialsTwitterCards({
44393
44527
  {
44394
44528
  href: testimonial.linkConfig?.href,
44395
44529
  className: cn(
44396
- "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-xl group hover:bg-primary hover:text-primary-foreground transition-all duration-500",
44530
+ "bg-card text-card-foreground",
44531
+ "flex flex-col gap-6",
44532
+ testimonial.linkConfig?.href ? "cursor-pointer hover:bg-primary hover:text-primary-foreground transition-all duration-500" : "",
44533
+ "rounded-2xl py-6 shadow-xl group",
44534
+ "ring-4 ring-primary",
44397
44535
  cardClassName
44398
44536
  ),
44399
44537
  children: /* @__PURE__ */ jsxs(
44400
44538
  CardContent,
44401
44539
  {
44402
44540
  className: cn(
44403
- "px-6 h-full flex flex-col-reverse items-stretch justify-between",
44541
+ "px-6 h-full flex flex-col-reverse items-stretch justify-between gap-12",
44404
44542
  cardContentClassName
44405
44543
  ),
44406
44544
  children: [
@@ -44432,7 +44570,8 @@ function TestimonialsTwitterCards({
44432
44570
  SocialLinkIcon,
44433
44571
  {
44434
44572
  href: testimonial.linkConfig.href,
44435
- iconSize: 18
44573
+ iconSize: 24,
44574
+ iconOnly: true
44436
44575
  }
44437
44576
  )
44438
44577
  ]
@@ -44505,122 +44644,257 @@ function TestimonialsTwitterCards({
44505
44644
  function TestimonialsCarouselImage({
44506
44645
  testimonials,
44507
44646
  testimonialsSlot,
44508
- height,
44509
- overlayOpacity,
44647
+ autoPlayInterval,
44648
+ height = "h-70dvh lg:h-60dvh",
44649
+ overlayOpacity = 0.6,
44510
44650
  previousButtonAriaLabel,
44511
44651
  nextButtonAriaLabel,
44512
44652
  className,
44513
44653
  contentClassName,
44514
44654
  quoteIconClassName,
44655
+ logoClassName,
44515
44656
  quoteClassName,
44516
44657
  authorClassName,
44517
44658
  navigationClassName,
44518
44659
  navButtonClassName,
44519
44660
  dotsClassName,
44520
- optixFlowConfig
44661
+ optixFlowConfig,
44662
+ background,
44663
+ containerClassName = "mx-0 w-screen px-0 sm:px-0 lg:px-0 max-w-screen relative z-10 h-full",
44664
+ spacing = "none",
44665
+ pattern,
44666
+ patternOpacity
44521
44667
  }) {
44522
44668
  const [currentIndex, setCurrentIndex] = useState(0);
44523
44669
  const totalTestimonials = testimonials?.length ?? 0;
44524
- const goToPrevious = useCallback(() => {
44525
- if (totalTestimonials === 0) return;
44526
- setCurrentIndex(
44527
- (prev) => prev === 0 ? totalTestimonials - 1 : prev - 1
44528
- );
44529
- }, [totalTestimonials]);
44670
+ const autoPlayTimerRef = React8.useRef(
44671
+ null
44672
+ );
44673
+ const resetAutoPlay = useCallback(() => {
44674
+ if (autoPlayTimerRef.current) {
44675
+ clearInterval(autoPlayTimerRef.current);
44676
+ autoPlayTimerRef.current = null;
44677
+ }
44678
+ if (!autoPlayInterval || autoPlayInterval <= 0 || totalTestimonials === 0)
44679
+ return;
44680
+ autoPlayTimerRef.current = setInterval(() => {
44681
+ setCurrentIndex((prev) => (prev + 1) % totalTestimonials);
44682
+ }, autoPlayInterval);
44683
+ }, [autoPlayInterval, totalTestimonials]);
44530
44684
  const goToNext = useCallback(() => {
44531
44685
  if (totalTestimonials === 0) return;
44532
- setCurrentIndex(
44533
- (prev) => prev === totalTestimonials - 1 ? 0 : prev + 1
44534
- );
44535
- }, [totalTestimonials]);
44686
+ setCurrentIndex((prev) => prev === totalTestimonials - 1 ? 0 : prev + 1);
44687
+ resetAutoPlay();
44688
+ }, [totalTestimonials, resetAutoPlay]);
44689
+ const goToPrevious = useCallback(() => {
44690
+ if (totalTestimonials === 0) return;
44691
+ setCurrentIndex((prev) => prev === 0 ? totalTestimonials - 1 : prev - 1);
44692
+ resetAutoPlay();
44693
+ }, [totalTestimonials, resetAutoPlay]);
44694
+ const goToIndex = useCallback(
44695
+ (index) => {
44696
+ setCurrentIndex(index);
44697
+ resetAutoPlay();
44698
+ },
44699
+ [resetAutoPlay]
44700
+ );
44701
+ useEffect(() => {
44702
+ resetAutoPlay();
44703
+ return () => {
44704
+ if (autoPlayTimerRef.current) {
44705
+ clearInterval(autoPlayTimerRef.current);
44706
+ }
44707
+ };
44708
+ }, [resetAutoPlay]);
44536
44709
  const current = testimonials?.[currentIndex];
44537
44710
  const renderedTestimonialContent = useMemo(() => {
44538
44711
  if (testimonialsSlot) return testimonialsSlot;
44539
44712
  if (!current) return null;
44540
- return /* @__PURE__ */ jsxs("div", { className: cn("mx-auto max-w-4xl text-center text-background", contentClassName), children: [
44541
- /* @__PURE__ */ jsx(
44542
- DynamicIcon,
44543
- {
44544
- name: "lucide/quote",
44545
- size: 48,
44546
- className: cn("mx-auto mb-6 opacity-50", quoteIconClassName)
44547
- }
44548
- ),
44549
- current.quote && (typeof current.quote === "string" ? /* @__PURE__ */ jsxs("blockquote", { className: cn("text-2xl font-light leading-relaxed md:text-4xl", quoteClassName), children: [
44550
- "\u201C",
44551
- current.quote,
44552
- "\u201D"
44553
- ] }) : /* @__PURE__ */ jsx("div", { className: quoteClassName, children: current.quote })),
44554
- /* @__PURE__ */ jsxs("div", { className: cn("mt-8", authorClassName), children: [
44555
- current.author && (typeof current.author === "string" ? /* @__PURE__ */ jsx("p", { className: "text-lg font-semibold", children: current.author }) : current.author),
44556
- (current.role || current.company) && /* @__PURE__ */ jsxs("p", { className: "text-sm opacity-80", children: [
44557
- current.role && (typeof current.role === "string" ? current.role : current.role),
44558
- current.company && (typeof current.company === "string" ? `, ${current.company}` : current.company)
44559
- ] })
44560
- ] })
44561
- ] });
44562
- }, [testimonialsSlot, contentClassName, quoteIconClassName, current, quoteClassName, authorClassName]);
44563
- return /* @__PURE__ */ jsxs("section", { className: cn("relative", height, className), children: [
44564
- /* @__PURE__ */ jsxs("div", { className: "absolute inset-0", children: [
44565
- current?.backgroundImage && /* @__PURE__ */ jsx(
44566
- Img,
44567
- {
44568
- src: current.backgroundImage,
44569
- alt: "",
44570
- className: "size-full object-cover",
44571
- optixFlowConfig
44572
- }
44573
- ),
44574
- /* @__PURE__ */ jsx(
44575
- "div",
44576
- {
44577
- className: "absolute inset-0 bg-foreground",
44578
- style: { opacity: overlayOpacity }
44579
- }
44580
- )
44581
- ] }),
44582
- /* @__PURE__ */ jsxs("div", { className: "relative z-10 flex h-full flex-col items-center justify-center px-4", children: [
44583
- renderedTestimonialContent,
44584
- /* @__PURE__ */ jsxs("div", { className: cn("absolute bottom-8 left-0 right-0 flex items-center justify-center gap-4", navigationClassName), children: [
44585
- /* @__PURE__ */ jsx(
44586
- Pressable,
44587
- {
44588
- asButton: true,
44589
- variant: "ghost",
44590
- size: "icon",
44591
- className: cn("size-10 rounded-full bg-white/10 text-white backdrop-blur-sm hover:bg-white/20", navButtonClassName),
44592
- onClick: goToPrevious,
44593
- "aria-label": previousButtonAriaLabel ?? "Previous testimonial",
44594
- children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-left", size: 24 })
44595
- }
44713
+ return /* @__PURE__ */ jsxs(
44714
+ "div",
44715
+ {
44716
+ className: cn(
44717
+ "mx-auto max-w-full md:max-w-md text-center text-shadow-lg text-white pb-32 pt-20",
44718
+ contentClassName
44596
44719
  ),
44597
- /* @__PURE__ */ jsx("div", { className: cn("flex gap-2", dotsClassName), children: testimonials?.map((_, index) => /* @__PURE__ */ jsx(
44598
- "button",
44599
- {
44600
- onClick: () => setCurrentIndex(index),
44601
- className: cn(
44602
- "size-2 rounded-full transition-all",
44603
- index === currentIndex ? "w-6 bg-white" : "bg-white/40 hover:bg-white/60"
44604
- ),
44605
- "aria-label": `Go to testimonial ${index + 1}`
44606
- },
44607
- index
44608
- )) }),
44609
- /* @__PURE__ */ jsx(
44610
- Pressable,
44611
- {
44612
- asButton: true,
44613
- variant: "ghost",
44614
- size: "icon",
44615
- className: cn("size-10 rounded-full bg-white/10 text-white backdrop-blur-sm hover:bg-white/20", navButtonClassName),
44616
- onClick: goToNext,
44617
- "aria-label": nextButtonAriaLabel ?? "Next testimonial",
44618
- children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-right", size: 24 })
44619
- }
44620
- )
44621
- ] })
44622
- ] })
44623
- ] });
44720
+ children: [
44721
+ current?.logoSrc ? /* @__PURE__ */ jsx(
44722
+ Img,
44723
+ {
44724
+ src: current.logoSrc,
44725
+ alt: typeof current.company === "string" ? `${current.company} logo` : typeof current.author === "string" ? `${current.author} company logo` : "Company logo",
44726
+ className: cn(
44727
+ "mx-auto mb-6 max-h-12 max-w-32 object-contain md:max-h-16 md:max-w-48",
44728
+ logoClassName
44729
+ ),
44730
+ optixFlowConfig
44731
+ }
44732
+ ) : /* @__PURE__ */ jsx(
44733
+ DynamicIcon,
44734
+ {
44735
+ name: "mdi/comment-quote-outline",
44736
+ size: 48,
44737
+ className: cn("mx-auto mb-6 opacity-50", quoteIconClassName)
44738
+ }
44739
+ ),
44740
+ current.quote && (typeof current.quote === "string" ? /* @__PURE__ */ jsxs(
44741
+ "blockquote",
44742
+ {
44743
+ className: cn(
44744
+ "text-xl font-light leading-relaxed md:text-2xl text-balance",
44745
+ quoteClassName
44746
+ ),
44747
+ children: [
44748
+ "\u201C",
44749
+ current.quote,
44750
+ "\u201D"
44751
+ ]
44752
+ }
44753
+ ) : /* @__PURE__ */ jsx("div", { className: quoteClassName, children: current.quote })),
44754
+ /* @__PURE__ */ jsxs(
44755
+ "div",
44756
+ {
44757
+ className: cn(
44758
+ "mt-8 text-balance flex flex-col items-center",
44759
+ authorClassName
44760
+ ),
44761
+ children: [
44762
+ current.author && (typeof current.author === "string" ? /* @__PURE__ */ jsx("p", { className: "text-lg font-semibold", children: current.author }) : current.author),
44763
+ (current.role || current.company) && /* @__PURE__ */ jsxs("p", { className: "text-sm opacity-80", children: [
44764
+ current.role && (typeof current.role === "string" ? current.role : current.role),
44765
+ current.company && (typeof current.company === "string" ? `, ${current.company}` : current.company)
44766
+ ] }),
44767
+ current.linkConfig?.href && /* @__PURE__ */ jsx(
44768
+ Pressable,
44769
+ {
44770
+ href: current.linkConfig.href,
44771
+ className: cn(
44772
+ "transition-all duration-500",
44773
+ "hover:underline hover:underline-offset-4",
44774
+ "text-sm",
44775
+ current.linkConfig.className
44776
+ ),
44777
+ children: current.linkConfig.label
44778
+ }
44779
+ )
44780
+ ]
44781
+ }
44782
+ )
44783
+ ]
44784
+ }
44785
+ );
44786
+ }, [
44787
+ testimonialsSlot,
44788
+ contentClassName,
44789
+ quoteIconClassName,
44790
+ logoClassName,
44791
+ optixFlowConfig,
44792
+ current,
44793
+ quoteClassName,
44794
+ authorClassName
44795
+ ]);
44796
+ return /* @__PURE__ */ jsxs(
44797
+ Section,
44798
+ {
44799
+ background,
44800
+ spacing,
44801
+ pattern,
44802
+ patternOpacity,
44803
+ className: cn("relative", height, className),
44804
+ containerClassName,
44805
+ children: [
44806
+ /* @__PURE__ */ jsxs("div", { className: "absolute inset-0", children: [
44807
+ /* @__PURE__ */ jsx(AnimatePresence, { initial: false, children: current?.backgroundImage && /* @__PURE__ */ jsx(
44808
+ motion.div,
44809
+ {
44810
+ initial: { opacity: 0 },
44811
+ animate: { opacity: 1 },
44812
+ exit: { opacity: 0 },
44813
+ transition: { duration: 0.6, ease: "easeInOut" },
44814
+ className: "absolute inset-0",
44815
+ children: /* @__PURE__ */ jsx(
44816
+ Img,
44817
+ {
44818
+ src: current.backgroundImage,
44819
+ alt: "Testimonial background image",
44820
+ className: "size-full object-cover",
44821
+ optixFlowConfig
44822
+ }
44823
+ )
44824
+ },
44825
+ currentIndex
44826
+ ) }),
44827
+ /* @__PURE__ */ jsx(
44828
+ "div",
44829
+ {
44830
+ className: "absolute inset-0 bg-black",
44831
+ style: { opacity: overlayOpacity }
44832
+ }
44833
+ )
44834
+ ] }),
44835
+ /* @__PURE__ */ jsxs("div", { className: "relative z-10 flex h-full flex-col items-center justify-center px-4", children: [
44836
+ /* @__PURE__ */ jsx(AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsx(
44837
+ motion.div,
44838
+ {
44839
+ initial: { opacity: 0, y: 10 },
44840
+ animate: { opacity: 1, y: 0 },
44841
+ exit: { opacity: 0, y: -10 },
44842
+ transition: { duration: 0.4, ease: "easeInOut" },
44843
+ children: renderedTestimonialContent
44844
+ },
44845
+ currentIndex
44846
+ ) }),
44847
+ /* @__PURE__ */ jsxs(
44848
+ "div",
44849
+ {
44850
+ className: cn(
44851
+ "absolute bottom-8 left-0 right-0 flex items-center justify-center gap-4",
44852
+ navigationClassName
44853
+ ),
44854
+ children: [
44855
+ /* @__PURE__ */ jsx(
44856
+ Pressable,
44857
+ {
44858
+ asButton: true,
44859
+ variant: "default",
44860
+ size: "icon",
44861
+ className: cn("size-10 rounded-full", navButtonClassName),
44862
+ onClick: goToPrevious,
44863
+ "aria-label": previousButtonAriaLabel ?? "Previous testimonial",
44864
+ children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-left", size: 24 })
44865
+ }
44866
+ ),
44867
+ /* @__PURE__ */ jsx("div", { className: cn("flex gap-2", dotsClassName), children: testimonials?.map((_, index) => /* @__PURE__ */ jsx(
44868
+ "button",
44869
+ {
44870
+ onClick: () => goToIndex(index),
44871
+ className: cn(
44872
+ "size-2 rounded-full transition-all",
44873
+ index === currentIndex ? "w-6 bg-primary" : "bg-white/40 hover:bg-white/60"
44874
+ ),
44875
+ "aria-label": `Go to testimonial ${index + 1}`
44876
+ },
44877
+ index
44878
+ )) }),
44879
+ /* @__PURE__ */ jsx(
44880
+ Pressable,
44881
+ {
44882
+ asButton: true,
44883
+ variant: "default",
44884
+ size: "icon",
44885
+ className: cn("size-10 rounded-full", navButtonClassName),
44886
+ onClick: goToNext,
44887
+ "aria-label": nextButtonAriaLabel ?? "Next testimonial",
44888
+ children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-right", size: 24 })
44889
+ }
44890
+ )
44891
+ ]
44892
+ }
44893
+ )
44894
+ ] })
44895
+ ]
44896
+ }
44897
+ );
44624
44898
  }
44625
44899
  function TestimonialsCenteredAvatars({
44626
44900
  testimonials,
@@ -44637,7 +44911,8 @@ function TestimonialsCenteredAvatars({
44637
44911
  quoteClassName,
44638
44912
  authorClassName,
44639
44913
  background,
44640
- spacing,
44914
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
44915
+ spacing = "xl",
44641
44916
  pattern,
44642
44917
  patternOpacity
44643
44918
  }) {
@@ -44645,46 +44920,62 @@ function TestimonialsCenteredAvatars({
44645
44920
  if (typeof testimonial.author === "string") return testimonial.author;
44646
44921
  return "";
44647
44922
  }, []);
44648
- const getAvatarSrc = useCallback((testimonial) => {
44649
- return testimonial.avatarSrc || testimonial.avatar?.src;
44650
- }, []);
44923
+ const getAvatarSrc = useCallback(
44924
+ (testimonial) => {
44925
+ return testimonial.avatarSrc || testimonial.avatar?.src;
44926
+ },
44927
+ []
44928
+ );
44651
44929
  const getInitials = useCallback((name) => {
44652
44930
  return name.split(" ").map((n) => n[0]).join("");
44653
44931
  }, []);
44654
44932
  const renderedTestimonials = useMemo(() => {
44655
44933
  if (testimonialsSlot) return testimonialsSlot;
44656
44934
  if (!testimonials || testimonials.length === 0) return null;
44657
- return /* @__PURE__ */ jsx("div", { className: cn("mt-12 space-y-8", testimonialsClassName), children: testimonials.map((testimonial, index) => /* @__PURE__ */ jsxs(
44935
+ return /* @__PURE__ */ jsx(
44658
44936
  "div",
44659
44937
  {
44660
- className: cn("space-y-4", testimonialItemClassName),
44661
- children: [
44662
- testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxs(
44663
- "blockquote",
44664
- {
44665
- className: cn(
44666
- "text-lg leading-relaxed text-muted-foreground md:text-xl",
44667
- quoteClassName
44668
- ),
44669
- children: [
44670
- "\u201C",
44671
- testimonial.quote,
44672
- "\u201D"
44673
- ]
44674
- }
44675
- ) : /* @__PURE__ */ jsx("div", { className: quoteClassName, children: testimonial.quote })),
44676
- /* @__PURE__ */ jsxs("div", { className: authorClassName, children: [
44677
- testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("p", { className: "font-semibold", children: testimonial.author }) : testimonial.author),
44678
- (testimonial.role || testimonial.company) && /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
44679
- testimonial.role && (typeof testimonial.role === "string" ? testimonial.role : testimonial.role),
44680
- testimonial.company && (typeof testimonial.company === "string" ? ` at ${testimonial.company}` : testimonial.company)
44681
- ] })
44682
- ] })
44683
- ]
44684
- },
44685
- index
44686
- )) });
44687
- }, [testimonialsSlot, testimonialsClassName, testimonials, testimonialItemClassName, quoteClassName, authorClassName]);
44938
+ className: cn("mt-12 space-y-8 md:space-y-12", testimonialsClassName),
44939
+ children: testimonials.map((testimonial, index) => /* @__PURE__ */ jsxs(
44940
+ "div",
44941
+ {
44942
+ className: cn("space-y-4", testimonialItemClassName),
44943
+ children: [
44944
+ testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxs(
44945
+ "blockquote",
44946
+ {
44947
+ className: cn(
44948
+ "text-lg leading-relaxed md:text-xl text-balance",
44949
+ quoteClassName
44950
+ ),
44951
+ children: [
44952
+ "\u201C",
44953
+ testimonial.quote,
44954
+ "\u201D"
44955
+ ]
44956
+ }
44957
+ ) : /* @__PURE__ */ jsx("div", { className: quoteClassName, children: testimonial.quote })),
44958
+ /* @__PURE__ */ jsxs("div", { className: authorClassName, children: [
44959
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("p", { className: "font-semibold", children: testimonial.author }) : testimonial.author),
44960
+ (testimonial.role || testimonial.company) && /* @__PURE__ */ jsxs("p", { className: "text-sm opacity-75", children: [
44961
+ testimonial.role && (typeof testimonial.role === "string" ? testimonial.role : testimonial.role),
44962
+ testimonial.company && (typeof testimonial.company === "string" ? ` at ${testimonial.company}` : testimonial.company)
44963
+ ] })
44964
+ ] })
44965
+ ]
44966
+ },
44967
+ index
44968
+ ))
44969
+ }
44970
+ );
44971
+ }, [
44972
+ testimonialsSlot,
44973
+ testimonialsClassName,
44974
+ testimonials,
44975
+ testimonialItemClassName,
44976
+ quoteClassName,
44977
+ authorClassName
44978
+ ]);
44688
44979
  return /* @__PURE__ */ jsx(
44689
44980
  Section,
44690
44981
  {
@@ -44693,35 +44984,45 @@ function TestimonialsCenteredAvatars({
44693
44984
  pattern,
44694
44985
  patternOpacity,
44695
44986
  className,
44696
- children: /* @__PURE__ */ jsxs("div", { className: cn("mx-auto max-w-3xl text-center", contentClassName), children: [
44697
- badge && (typeof badge === "string" ? /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: cn("mb-4", badgeClassName), children: badge }) : /* @__PURE__ */ jsx("div", { className: cn("mb-4", badgeClassName), children: badge })),
44698
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
44699
- "h2",
44700
- {
44701
- className: cn(
44702
- "text-3xl font-semibold tracking-tight md:text-4xl",
44703
- headingClassName
44704
- ),
44705
- children: heading
44706
- }
44707
- ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
44708
- testimonials && testimonials.length > 0 && /* @__PURE__ */ jsx("div", { className: cn("mt-8 flex justify-center", avatarsClassName), children: /* @__PURE__ */ jsx("div", { className: "flex -space-x-4", children: testimonials.map((testimonial, index) => {
44709
- const authorName = getAuthorName(testimonial);
44710
- const avatarSrc = getAvatarSrc(testimonial);
44711
- return /* @__PURE__ */ jsxs(
44712
- Avatar,
44713
- {
44714
- className: "size-16 border-4 border-background ring-2 ring-border md:size-20",
44715
- children: [
44716
- /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
44717
- /* @__PURE__ */ jsx(AvatarFallback, { className: "text-lg", children: getInitials(authorName) })
44718
- ]
44719
- },
44720
- index
44721
- );
44722
- }) }) }),
44723
- renderedTestimonials
44724
- ] })
44987
+ containerClassName,
44988
+ children: /* @__PURE__ */ jsxs(
44989
+ "div",
44990
+ {
44991
+ className: cn(
44992
+ "mx-auto max-w-full md:max-w-md text-center flex flex-col items-center gap-6 bg-card/50 px-10 py-20 shadow-xl border border-border/50 rounded-3xl backdrop-blur-md",
44993
+ contentClassName
44994
+ ),
44995
+ children: [
44996
+ badge && (typeof badge === "string" ? /* @__PURE__ */ jsx(Badge, { className: badgeClassName, children: badge }) : badge),
44997
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
44998
+ "h2",
44999
+ {
45000
+ className: cn(
45001
+ "text-2xl font-semibold tracking-tight md:text-4xl lg:text-6xl text-balance",
45002
+ headingClassName
45003
+ ),
45004
+ children: heading
45005
+ }
45006
+ ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
45007
+ testimonials && testimonials.length > 0 && /* @__PURE__ */ jsx("div", { className: cn("mt-8 flex justify-center", avatarsClassName), children: /* @__PURE__ */ jsx("div", { className: "flex -space-x-4", children: testimonials.map((testimonial, index) => {
45008
+ const authorName = getAuthorName(testimonial);
45009
+ const avatarSrc = getAvatarSrc(testimonial);
45010
+ return /* @__PURE__ */ jsxs(
45011
+ Avatar,
45012
+ {
45013
+ className: "relative flex shrink-0 overflow-hidden rounded-full size-16 ring-4 ring-primary md:size-20 shadow-xl",
45014
+ children: [
45015
+ /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
45016
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "text-lg", children: getInitials(authorName) })
45017
+ ]
45018
+ },
45019
+ index
45020
+ );
45021
+ }) }) }),
45022
+ renderedTestimonials
45023
+ ]
45024
+ }
45025
+ )
44725
45026
  }
44726
45027
  );
44727
45028
  }
@@ -44749,14 +45050,14 @@ function TestimonialsCompanyLogo({
44749
45050
  const renderedTestimonial = useMemo(() => {
44750
45051
  if (testimonialSlot) return testimonialSlot;
44751
45052
  if (!testimonial) return null;
44752
- return /* @__PURE__ */ jsxs("div", { className: cn("space-y-8", contentClassName), children: [
45053
+ return /* @__PURE__ */ jsxs("div", { className: cn("space-y-12 md:space-y-16", contentClassName), children: [
44753
45054
  /* @__PURE__ */ jsxs("div", { className: "relative", children: [
44754
45055
  /* @__PURE__ */ jsx(DynamicIcon, { name: "mdi/comment-quote-outline", size: 48 }),
44755
45056
  testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsx(
44756
45057
  "blockquote",
44757
45058
  {
44758
45059
  className: cn(
44759
- "relative text-xl font-medium leading-relaxed md:text-2xl",
45060
+ "relative text-lg font-light leading-relaxed md:text-2xl",
44760
45061
  quoteClassName
44761
45062
  ),
44762
45063
  children: testimonial.quote
@@ -44774,15 +45075,15 @@ function TestimonialsCompanyLogo({
44774
45075
  }
44775
45076
  ),
44776
45077
  /* @__PURE__ */ jsxs("div", { className: cn("space-y-1 text-right", authorClassName), children: [
44777
- /* @__PURE__ */ jsxs("div", { className: "space-x-2", children: [
45078
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-end", children: [
44778
45079
  testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("span", { className: "font-semibold", children: testimonial.author }) : testimonial.author),
44779
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("span", { className: "text-sm", children: testimonial.role }) : testimonial.role)
45080
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("span", { className: "text-sm opacity-75", children: testimonial.role }) : testimonial.role)
44780
45081
  ] }),
44781
45082
  /* @__PURE__ */ jsx(
44782
45083
  Pressable,
44783
45084
  {
44784
45085
  href: testimonial.linkConfig?.href,
44785
- className: "text-sm font-bold uppercase transition-all duration-300 hover:underline hover:underline-offset-4",
45086
+ className: "cursor-pointer text-sm font-bold uppercase transition-all duration-500 hover:underline hover:underline-offset-4",
44786
45087
  children: testimonial.linkConfig?.label || "Learn more"
44787
45088
  }
44788
45089
  )
@@ -44813,7 +45114,7 @@ function TestimonialsCompanyLogo({
44813
45114
  "div",
44814
45115
  {
44815
45116
  className: cn(
44816
- "grid items-center gap-12 lg:gap-24 grid-cols-1 lg:grid-cols-2",
45117
+ "grid items-center gap-16 lg:gap-24 grid-cols-1 lg:grid-cols-2",
44817
45118
  gridClassName
44818
45119
  ),
44819
45120
  children: [
@@ -44844,19 +45145,6 @@ function TestimonialsCompanyLogo({
44844
45145
  }
44845
45146
  );
44846
45147
  }
44847
- function StarRating3({ rating, size = 16 }) {
44848
- return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-0.5", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsx(
44849
- DynamicIcon,
44850
- {
44851
- name: "lucide/star",
44852
- size,
44853
- className: cn(
44854
- star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
44855
- )
44856
- },
44857
- star
44858
- )) });
44859
- }
44860
45148
  function TestimonialsGridAddReview({
44861
45149
  reviews,
44862
45150
  reviewsSlot,
@@ -44903,27 +45191,33 @@ function TestimonialsGridAddReview({
44903
45191
  addReviewCardClassName
44904
45192
  ),
44905
45193
  onClick: onAddReview,
44906
- children: /* @__PURE__ */ jsxs(CardContent, { className: cn(
44907
- "flex flex-col items-center gap-3 py-12 text-center",
44908
- getNestedCardTextColor(background)
44909
- ), children: [
44910
- /* @__PURE__ */ jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(
44911
- DynamicIcon,
44912
- {
44913
- name: "lucide/plus",
44914
- size: 24,
44915
- className: "text-primary"
44916
- }
44917
- ) }),
44918
- addReviewText && (typeof addReviewText === "string" ? /* @__PURE__ */ jsx("p", { className: "font-medium", children: addReviewText }) : addReviewText),
44919
- addReviewSubtext && (typeof addReviewSubtext === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: addReviewSubtext }) : addReviewSubtext)
44920
- ] })
45194
+ children: /* @__PURE__ */ jsxs(
45195
+ CardContent,
45196
+ {
45197
+ className: cn(
45198
+ "flex flex-col items-center gap-3 py-12 text-center",
45199
+ getNestedCardTextColor(background)
45200
+ ),
45201
+ children: [
45202
+ /* @__PURE__ */ jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsx(
45203
+ DynamicIcon,
45204
+ {
45205
+ name: "lucide/plus",
45206
+ size: 24,
45207
+ className: "text-primary"
45208
+ }
45209
+ ) }),
45210
+ addReviewText && (typeof addReviewText === "string" ? /* @__PURE__ */ jsx("p", { className: "font-medium", children: addReviewText }) : addReviewText),
45211
+ addReviewSubtext && (typeof addReviewSubtext === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: addReviewSubtext }) : addReviewSubtext)
45212
+ ]
45213
+ }
45214
+ )
44921
45215
  }
44922
45216
  ),
44923
45217
  reviews?.map((review, index) => {
44924
45218
  const authorName = getAuthorName(review);
44925
45219
  return /* @__PURE__ */ jsx(Card, { className: cardClassName, children: /* @__PURE__ */ jsxs(CardContent, { className: "space-y-4 p-6", children: [
44926
- /* @__PURE__ */ jsx(StarRating3, { rating: review.rating }),
45220
+ /* @__PURE__ */ jsx(StarRating, { rating: review.rating }),
44927
45221
  review.content && (typeof review.content === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm leading-relaxed", children: review.content }) : review.content),
44928
45222
  /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-3", authorClassName), children: [
44929
45223
  /* @__PURE__ */ jsxs(Avatar, { className: "size-8", children: [
@@ -44937,7 +45231,19 @@ function TestimonialsGridAddReview({
44937
45231
  ]
44938
45232
  }
44939
45233
  );
44940
- }, [reviewsSlot, gridClassName, addReviewCardClassName, onAddReview, addReviewText, addReviewSubtext, reviews, cardClassName, authorClassName, getAuthorName, getInitials]);
45234
+ }, [
45235
+ reviewsSlot,
45236
+ gridClassName,
45237
+ addReviewCardClassName,
45238
+ onAddReview,
45239
+ addReviewText,
45240
+ addReviewSubtext,
45241
+ reviews,
45242
+ cardClassName,
45243
+ authorClassName,
45244
+ getAuthorName,
45245
+ getInitials
45246
+ ]);
44941
45247
  return /* @__PURE__ */ jsxs(
44942
45248
  Section,
44943
45249
  {
@@ -45001,7 +45307,8 @@ function TestimonialsMarquee({
45001
45307
  quoteClassName,
45002
45308
  authorClassName,
45003
45309
  background,
45004
- spacing,
45310
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
45311
+ spacing = "xl",
45005
45312
  pattern,
45006
45313
  patternOpacity
45007
45314
  }) {
@@ -45011,81 +45318,102 @@ function TestimonialsMarquee({
45011
45318
  if (typeof testimonial.author === "string") return testimonial.author;
45012
45319
  return "";
45013
45320
  }, []);
45014
- const getAvatarSrc = useCallback((testimonial) => {
45015
- return testimonial.avatarSrc || testimonial.avatar?.src;
45016
- }, []);
45321
+ const getAvatarSrc = useCallback(
45322
+ (testimonial) => {
45323
+ return testimonial.avatarSrc || testimonial.avatar?.src;
45324
+ },
45325
+ []
45326
+ );
45017
45327
  const getInitials = useCallback((name) => {
45018
45328
  return name.split(" ").map((n) => n[0]).join("");
45019
45329
  }, []);
45020
45330
  const renderedTestimonials = useMemo(() => {
45021
45331
  if (testimonialsSlot) return testimonialsSlot;
45022
45332
  if (!testimonials || testimonials.length === 0) return null;
45023
- return /* @__PURE__ */ jsxs("div", { className: cn("relative", marqueeClassName), children: [
45024
- /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute left-0 top-0 z-10 h-full w-24 bg-gradient-to-r from-background to-transparent" }),
45025
- /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute right-0 top-0 z-10 h-full w-24 bg-gradient-to-l from-background to-transparent" }),
45026
- /* @__PURE__ */ jsx(
45027
- "div",
45028
- {
45029
- className: cn(
45030
- "flex gap-4",
45031
- pauseOnHover !== false && "[&:hover_.marquee-content]:pause"
45032
- ),
45033
- children: /* @__PURE__ */ jsx(
45034
- "div",
45035
- {
45036
- className: "marquee-content flex shrink-0 animate-marquee gap-4",
45037
- style: {
45038
- animationDuration: speedMap[effectiveSpeed]
45039
- },
45040
- children: duplicatedTestimonials.map((testimonial, index) => {
45041
- const authorName = getAuthorName(testimonial);
45042
- const avatarSrc = getAvatarSrc(testimonial);
45043
- return /* @__PURE__ */ jsx(
45044
- Card,
45045
- {
45046
- className: cn("w-80 shrink-0", cardClassName),
45047
- children: /* @__PURE__ */ jsxs(CardContent, { className: "p-6", children: [
45048
- testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxs(
45049
- "p",
45050
- {
45051
- className: cn(
45052
- "mb-4 text-sm leading-relaxed",
45053
- quoteClassName
45054
- ),
45055
- children: [
45056
- "\u201C",
45057
- testimonial.quote,
45058
- "\u201D"
45059
- ]
45060
- }
45061
- ) : /* @__PURE__ */ jsx("div", { className: cn("mb-4", quoteClassName), children: testimonial.quote })),
45062
- /* @__PURE__ */ jsxs(
45063
- "div",
45064
- {
45065
- className: cn("flex items-center gap-3", authorClassName),
45066
- children: [
45067
- /* @__PURE__ */ jsxs(Avatar, { className: "size-9", children: [
45068
- /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
45069
- /* @__PURE__ */ jsx(AvatarFallback, { className: "text-xs", children: getInitials(authorName) })
45070
- ] }),
45071
- /* @__PURE__ */ jsxs("div", { children: [
45072
- testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: testimonial.author }) : testimonial.author),
45073
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: testimonial.role }) : testimonial.role)
45074
- ] })
45075
- ]
45076
- }
45077
- )
45078
- ] })
45079
- },
45080
- index
45081
- );
45082
- })
45083
- }
45084
- )
45085
- }
45086
- )
45087
- ] });
45088
- }, [testimonialsSlot, marqueeClassName, pauseOnHover, effectiveSpeed, duplicatedTestimonials, cardClassName, quoteClassName, authorClassName, testimonials, getAuthorName, getAvatarSrc, getInitials]);
45333
+ return /* @__PURE__ */ jsx(
45334
+ "div",
45335
+ {
45336
+ className: cn(
45337
+ "relative marquee-fade",
45338
+ pauseOnHover && "marquee-pause-on-hover",
45339
+ marqueeClassName
45340
+ ),
45341
+ children: /* @__PURE__ */ jsx("div", { className: "flex gap-4", children: /* @__PURE__ */ jsx(
45342
+ "div",
45343
+ {
45344
+ className: "marquee-content flex shrink-0 animate-marquee gap-4",
45345
+ style: {
45346
+ animationDuration: speedMap[effectiveSpeed]
45347
+ },
45348
+ children: duplicatedTestimonials.map((testimonial, index) => {
45349
+ const authorName = getAuthorName(testimonial);
45350
+ const avatarSrc = getAvatarSrc(testimonial);
45351
+ return /* @__PURE__ */ jsx(
45352
+ Pressable,
45353
+ {
45354
+ href: testimonial?.linkConfig?.href,
45355
+ className: cn(
45356
+ "bg-card text-card-foreground",
45357
+ "rounded-2xl border shadow-xl",
45358
+ "cursor-pointer transition-all duration-500",
45359
+ "hover:bg-primary hover:text-primary-foreground",
45360
+ "flex flex-col gap-6 w-80 shrink-0",
45361
+ cardClassName
45362
+ ),
45363
+ children: /* @__PURE__ */ jsxs(CardContent, { className: "p-6 h-full flex flex-col justify-between gap-12", children: [
45364
+ testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxs(
45365
+ "p",
45366
+ {
45367
+ className: cn(
45368
+ "mb-4 text-sm leading-relaxed",
45369
+ quoteClassName
45370
+ ),
45371
+ children: [
45372
+ "\u201C",
45373
+ testimonial.quote,
45374
+ "\u201D"
45375
+ ]
45376
+ }
45377
+ ) : /* @__PURE__ */ jsx("div", { className: cn("mb-4", quoteClassName), children: testimonial.quote })),
45378
+ /* @__PURE__ */ jsxs(
45379
+ "div",
45380
+ {
45381
+ className: cn("flex items-center gap-4", authorClassName),
45382
+ children: [
45383
+ /* @__PURE__ */ jsxs(Avatar, { className: "relative flex shrink-0 overflow-hidden rounded-full size-10 ring-4 ring-primary shadow-lg", children: [
45384
+ /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
45385
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "text-xs", children: getInitials(authorName) })
45386
+ ] }),
45387
+ /* @__PURE__ */ jsxs("div", { children: [
45388
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("p", { className: "text-base font-medium", children: testimonial.author }) : testimonial.author),
45389
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm", children: testimonial.role }) : testimonial.role)
45390
+ ] })
45391
+ ]
45392
+ }
45393
+ )
45394
+ ] })
45395
+ },
45396
+ index
45397
+ );
45398
+ })
45399
+ }
45400
+ ) })
45401
+ }
45402
+ );
45403
+ }, [
45404
+ testimonialsSlot,
45405
+ marqueeClassName,
45406
+ pauseOnHover,
45407
+ effectiveSpeed,
45408
+ duplicatedTestimonials,
45409
+ cardClassName,
45410
+ quoteClassName,
45411
+ authorClassName,
45412
+ testimonials,
45413
+ getAuthorName,
45414
+ getAvatarSrc,
45415
+ getInitials
45416
+ ]);
45089
45417
  return /* @__PURE__ */ jsxs(
45090
45418
  Section,
45091
45419
  {
@@ -45094,28 +45422,20 @@ function TestimonialsMarquee({
45094
45422
  pattern,
45095
45423
  patternOpacity,
45096
45424
  className: cn("overflow-hidden", className),
45425
+ containerClassName,
45097
45426
  children: [
45098
- /* @__PURE__ */ jsx("div", { className: cn("mb-12", headerClassName), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-2xl text-center", children: [
45427
+ /* @__PURE__ */ jsx("div", { className: cn("mb-12", headerClassName), children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-full md:max-w-2xl text-center space-y-2", children: [
45099
45428
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
45100
45429
  "h2",
45101
45430
  {
45102
45431
  className: cn(
45103
- "text-3xl font-semibold tracking-tight md:text-4xl",
45432
+ "text-3xl font-semibold tracking-tight md:text-4xl lg:text-6xl text-pretty",
45104
45433
  headingClassName
45105
45434
  ),
45106
45435
  children: heading
45107
45436
  }
45108
- ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
45109
- description && (typeof description === "string" ? /* @__PURE__ */ jsx(
45110
- "p",
45111
- {
45112
- className: cn(
45113
- "mt-4 text-lg text-muted-foreground",
45114
- descriptionClassName
45115
- ),
45116
- children: description
45117
- }
45118
- ) : /* @__PURE__ */ jsx("div", { className: cn("mt-4", descriptionClassName), children: description }))
45437
+ ) : heading),
45438
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-lg text-balance", descriptionClassName), children: description }) : description)
45119
45439
  ] }) }),
45120
45440
  renderedTestimonials,
45121
45441
  /* @__PURE__ */ jsx("style", { children: `
@@ -45130,9 +45450,13 @@ function TestimonialsMarquee({
45130
45450
  .animate-marquee {
45131
45451
  animation: marquee linear infinite;
45132
45452
  }
45133
- .pause {
45453
+ .marquee-pause-on-hover:hover .marquee-content {
45134
45454
  animation-play-state: paused;
45135
45455
  }
45456
+ .marquee-fade {
45457
+ -webkit-mask-image: linear-gradient(to right, transparent, black 8%, black 92%, transparent);
45458
+ mask-image: linear-gradient(to right, transparent, black 8%, black 92%, transparent);
45459
+ }
45136
45460
  ` })
45137
45461
  ]
45138
45462
  }
@@ -45148,6 +45472,7 @@ function TestimonialsSimpleGrid({
45148
45472
  headerClassName,
45149
45473
  headingClassName,
45150
45474
  descriptionClassName,
45475
+ cardContentClassName,
45151
45476
  gridClassName,
45152
45477
  cardClassName,
45153
45478
  quoteClassName,
@@ -45158,17 +45483,11 @@ function TestimonialsSimpleGrid({
45158
45483
  pattern,
45159
45484
  patternOpacity
45160
45485
  }) {
45161
- const gridCols = {
45162
- 2: "sm:grid-cols-2",
45163
- 3: "sm:grid-cols-2 lg:grid-cols-3",
45164
- 4: "sm:grid-cols-2 lg:grid-cols-4"
45165
- };
45166
- const effectiveColumns = columns || 3;
45167
45486
  const getAuthorName = useCallback((testimonial) => {
45168
45487
  if (typeof testimonial.author === "string") return testimonial.author;
45169
45488
  return "";
45170
45489
  }, []);
45171
- const getAvatarSrc = useCallback(
45490
+ useCallback(
45172
45491
  (testimonial) => {
45173
45492
  return testimonial.avatarSrc || testimonial.avatar?.src;
45174
45493
  },
@@ -45183,53 +45502,89 @@ function TestimonialsSimpleGrid({
45183
45502
  return /* @__PURE__ */ jsx(
45184
45503
  "div",
45185
45504
  {
45186
- className: cn("grid gap-6", gridCols[effectiveColumns], gridClassName),
45505
+ className: cn(
45506
+ "grid gap-4 md:gap-6 lg:gap-8 md:grid-cols-2 lg:grid-cols-3",
45507
+ gridClassName
45508
+ ),
45187
45509
  children: testimonials.map((testimonial, index) => {
45188
45510
  const authorName = getAuthorName(testimonial);
45189
- const avatarSrc = getAvatarSrc(testimonial);
45190
- return /* @__PURE__ */ jsx(Card, { className: cardClassName, children: /* @__PURE__ */ jsxs(CardContent, { className: "p-6", children: [
45191
- testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxs(
45192
- "p",
45193
- {
45194
- className: cn(
45195
- "mb-6 text-sm leading-relaxed ",
45196
- quoteClassName
45197
- ),
45198
- children: [
45199
- "\u201C",
45200
- testimonial.quote,
45201
- "\u201D"
45202
- ]
45203
- }
45204
- ) : /* @__PURE__ */ jsx("div", { className: cn("mb-6", quoteClassName), children: testimonial.quote })),
45205
- /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-3", authorClassName), children: [
45206
- /* @__PURE__ */ jsxs(Avatar, { className: "size-10", children: [
45207
- /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
45208
- /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(authorName) })
45209
- ] }),
45210
- /* @__PURE__ */ jsxs("div", { children: [
45211
- testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: testimonial.author }) : testimonial.author),
45212
- /* @__PURE__ */ jsxs("p", { className: "text-xs ", children: [
45213
- testimonial.role && (typeof testimonial.role === "string" ? testimonial.role : null),
45214
- testimonial.company && (typeof testimonial.company === "string" ? `, ${testimonial.company}` : null)
45215
- ] })
45216
- ] })
45217
- ] })
45218
- ] }) }, index);
45511
+ return /* @__PURE__ */ jsx(
45512
+ Pressable,
45513
+ {
45514
+ href: testimonial.linkConfig?.href,
45515
+ className: cn(
45516
+ "bg-card text-card-foreground",
45517
+ "flex flex-col gap-6",
45518
+ testimonial.linkConfig?.href ? "cursor-pointer hover:bg-black hover:text-white transition-all duration-500" : "",
45519
+ "rounded-2xl py-0 shadow-xl group",
45520
+ "ring-4 ring-ring",
45521
+ cardClassName
45522
+ ),
45523
+ children: /* @__PURE__ */ jsxs(
45524
+ CardContent,
45525
+ {
45526
+ className: cn(
45527
+ "px-0 h-full flex flex-col-reverse items-stretch justify-between gap-12",
45528
+ cardContentClassName
45529
+ ),
45530
+ children: [
45531
+ /* @__PURE__ */ jsx(
45532
+ "div",
45533
+ {
45534
+ className: cn(
45535
+ "flex items-center justify-between",
45536
+ authorClassName
45537
+ ),
45538
+ children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
45539
+ /* @__PURE__ */ jsxs(Avatar, { className: "relative flex shrink-0 size-24 border-t-4 border-r-4 border-primary rounded-tr-xl rounded-tl-none rounded-br-none rounded-bl-none shadow-xl", children: [
45540
+ /* @__PURE__ */ jsx(
45541
+ AvatarImage,
45542
+ {
45543
+ src: testimonial.avatarSrc,
45544
+ alt: authorName
45545
+ }
45546
+ ),
45547
+ /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(authorName) })
45548
+ ] }),
45549
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1 pt-2 pr-6 pb-2", children: [
45550
+ /* @__PURE__ */ jsxs("div", { className: "space-y-0", children: [
45551
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("p", { className: "text-lg font-semibold leading-relaxed", children: testimonial.author }) : testimonial.author),
45552
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-base", children: testimonial.role }) : testimonial.role)
45553
+ ] }),
45554
+ testimonial.linkConfig?.href && /* @__PURE__ */ jsx(
45555
+ Pressable,
45556
+ {
45557
+ href: testimonial.linkConfig.href,
45558
+ className: cn(
45559
+ "text-base transition-all duration-300",
45560
+ "underline underline-offset-4",
45561
+ testimonial.linkConfig.className
45562
+ ),
45563
+ children: testimonial.linkConfig.label
45564
+ }
45565
+ )
45566
+ ] })
45567
+ ] })
45568
+ }
45569
+ ),
45570
+ /* @__PURE__ */ jsx("div", { className: "pt-6 md: pt-8 px-6 md:px-8", children: testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm leading-relaxed", children: testimonial.quote }) : testimonial.quote) })
45571
+ ]
45572
+ }
45573
+ )
45574
+ },
45575
+ index
45576
+ );
45219
45577
  })
45220
45578
  }
45221
45579
  );
45222
45580
  }, [
45223
45581
  testimonialsSlot,
45224
- gridCols,
45225
- effectiveColumns,
45226
45582
  gridClassName,
45227
45583
  testimonials,
45228
45584
  cardClassName,
45229
- quoteClassName,
45585
+ cardContentClassName,
45230
45586
  authorClassName,
45231
45587
  getAuthorName,
45232
- getAvatarSrc,
45233
45588
  getInitials
45234
45589
  ]);
45235
45590
  return /* @__PURE__ */ jsxs(
@@ -45245,19 +45600,29 @@ function TestimonialsSimpleGrid({
45245
45600
  /* @__PURE__ */ jsxs(
45246
45601
  "div",
45247
45602
  {
45248
- className: cn("mx-auto mb-12 max-w-2xl text-center", headerClassName),
45603
+ className: cn(
45604
+ "mx-auto mb-12 max-w-full md:max-w-2xl text-center",
45605
+ headerClassName
45606
+ ),
45249
45607
  children: [
45250
45608
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
45251
45609
  "h2",
45252
45610
  {
45253
45611
  className: cn(
45254
- "text-3xl font-semibold tracking-tight md:text-4xl",
45612
+ "text-pretty text-3xl md:text-4xl lg:text-6xl",
45613
+ "font-semibold tracking-tight",
45255
45614
  headingClassName
45256
45615
  ),
45257
45616
  children: heading
45258
45617
  }
45259
- ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
45260
- description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("mt-4 text-lg ", descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: cn("mt-4", descriptionClassName), children: description }))
45618
+ ) : heading),
45619
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx(
45620
+ "p",
45621
+ {
45622
+ className: cn("mt-4 text-lg text-balance", descriptionClassName),
45623
+ children: description
45624
+ }
45625
+ ) : description)
45261
45626
  ]
45262
45627
  }
45263
45628
  ),
@@ -45275,36 +45640,58 @@ function TestimonialsSliderMinimal({
45275
45640
  quoteClassName,
45276
45641
  authorClassName,
45277
45642
  avatarClassName,
45643
+ navButtonClassName,
45278
45644
  dotsClassName,
45279
45645
  background,
45280
45646
  containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
45281
- spacing = "xl",
45647
+ spacing = "none",
45282
45648
  pattern,
45283
- patternOpacity
45649
+ patternOpacity,
45650
+ previousButtonAriaLabel,
45651
+ nextButtonAriaLabel,
45652
+ navigationClassName
45284
45653
  }) {
45285
45654
  const [currentIndex, setCurrentIndex] = useState(0);
45286
- const [isTransitioning, setIsTransitioning] = useState(false);
45287
45655
  const totalTestimonials = testimonials?.length ?? 0;
45288
- const effectiveAutoPlayInterval = autoPlayInterval ?? 5e3;
45289
- const goToSlide = useCallback(
45656
+ const autoPlayTimerRef = React8.useRef(
45657
+ null
45658
+ );
45659
+ const resetAutoPlay = useCallback(() => {
45660
+ if (autoPlayTimerRef.current) {
45661
+ clearInterval(autoPlayTimerRef.current);
45662
+ autoPlayTimerRef.current = null;
45663
+ }
45664
+ if (!autoPlayInterval || autoPlayInterval <= 0 || totalTestimonials === 0)
45665
+ return;
45666
+ autoPlayTimerRef.current = setInterval(() => {
45667
+ setCurrentIndex((prev) => (prev + 1) % totalTestimonials);
45668
+ }, autoPlayInterval);
45669
+ }, [autoPlayInterval, totalTestimonials]);
45670
+ const goToNext = useCallback(() => {
45671
+ if (totalTestimonials === 0) return;
45672
+ setCurrentIndex((prev) => prev === totalTestimonials - 1 ? 0 : prev + 1);
45673
+ resetAutoPlay();
45674
+ }, [totalTestimonials, resetAutoPlay]);
45675
+ const goToPrevious = useCallback(() => {
45676
+ if (totalTestimonials === 0) return;
45677
+ setCurrentIndex((prev) => prev === 0 ? totalTestimonials - 1 : prev - 1);
45678
+ resetAutoPlay();
45679
+ }, [totalTestimonials, resetAutoPlay]);
45680
+ const goToIndex = useCallback(
45290
45681
  (index) => {
45291
- if (index === currentIndex) return;
45292
- setIsTransitioning(true);
45293
- setTimeout(() => {
45294
- setCurrentIndex(index);
45295
- setIsTransitioning(false);
45296
- }, 300);
45682
+ setCurrentIndex(index);
45683
+ resetAutoPlay();
45297
45684
  },
45298
- [currentIndex]
45685
+ [resetAutoPlay]
45299
45686
  );
45300
45687
  useEffect(() => {
45301
- if (effectiveAutoPlayInterval <= 0 || totalTestimonials === 0) return;
45302
- const interval = setInterval(() => {
45303
- const nextIndex = (currentIndex + 1) % totalTestimonials;
45304
- goToSlide(nextIndex);
45305
- }, effectiveAutoPlayInterval);
45306
- return () => clearInterval(interval);
45307
- }, [currentIndex, effectiveAutoPlayInterval, totalTestimonials, goToSlide]);
45688
+ resetAutoPlay();
45689
+ return () => {
45690
+ if (autoPlayTimerRef.current) {
45691
+ clearInterval(autoPlayTimerRef.current);
45692
+ }
45693
+ };
45694
+ }, [resetAutoPlay]);
45308
45695
  const current = testimonials?.[currentIndex];
45309
45696
  const getAuthorName = useCallback((testimonial) => {
45310
45697
  if (typeof testimonial.author === "string") return testimonial.author;
@@ -45324,53 +45711,64 @@ function TestimonialsSliderMinimal({
45324
45711
  if (!current) return null;
45325
45712
  const authorName = getAuthorName(current);
45326
45713
  const avatarSrc = getAvatarSrc(current);
45327
- return /* @__PURE__ */ jsxs(
45328
- "div",
45329
- {
45330
- className: cn(
45331
- "transition-opacity duration-300",
45332
- isTransitioning ? "opacity-0" : "opacity-100"
45333
- ),
45334
- children: [
45335
- current.quote && (typeof current.quote === "string" ? /* @__PURE__ */ jsxs(
45336
- "blockquote",
45337
- {
45338
- className: cn(
45339
- "text-xl font-medium leading-relaxed md:text-2xl lg:text-3xl",
45340
- quoteClassName
45341
- ),
45342
- children: [
45343
- "\u201C",
45344
- current.quote,
45345
- "\u201D"
45346
- ]
45347
- }
45348
- ) : /* @__PURE__ */ jsx("div", { className: quoteClassName, children: current.quote })),
45349
- /* @__PURE__ */ jsxs(
45350
- "div",
45351
- {
45352
- className: cn(
45353
- "mt-8 flex flex-col items-center gap-4",
45354
- authorClassName
45355
- ),
45356
- children: [
45357
- /* @__PURE__ */ jsxs(Avatar, { className: cn("size-14", avatarClassName), children: [
45714
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-12 md:space-y-24", children: [
45715
+ current.quote && (typeof current.quote === "string" ? /* @__PURE__ */ jsxs(
45716
+ "blockquote",
45717
+ {
45718
+ className: cn(
45719
+ "text-xl font-thin leading-relaxed md:text-2xl text-balance line-clamp-6",
45720
+ quoteClassName
45721
+ ),
45722
+ children: [
45723
+ "\u201C",
45724
+ current.quote,
45725
+ "\u201D"
45726
+ ]
45727
+ }
45728
+ ) : current.quote),
45729
+ /* @__PURE__ */ jsxs(
45730
+ "div",
45731
+ {
45732
+ className: cn(
45733
+ "mt-8 flex flex-col items-center gap-6 md:gap-12",
45734
+ authorClassName
45735
+ ),
45736
+ children: [
45737
+ /* @__PURE__ */ jsxs(
45738
+ Avatar,
45739
+ {
45740
+ className: cn(
45741
+ "relative flex shrink-0 overflow-hidden rounded-full ring-4 ring-primary shadow-xl size-12",
45742
+ avatarClassName
45743
+ ),
45744
+ children: [
45358
45745
  /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
45359
45746
  /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(authorName) })
45360
- ] }),
45361
- /* @__PURE__ */ jsxs("div", { children: [
45362
- current.author && (typeof current.author === "string" ? /* @__PURE__ */ jsx("p", { className: "font-semibold", children: current.author }) : current.author),
45363
- current.role && (typeof current.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm ", children: current.role }) : current.role)
45364
- ] })
45365
- ]
45366
- }
45367
- )
45368
- ]
45369
- }
45370
- );
45747
+ ]
45748
+ }
45749
+ ),
45750
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-0", children: [
45751
+ current.author && (typeof current.author === "string" ? /* @__PURE__ */ jsx("p", { className: "font-semibold", children: current.author }) : current.author),
45752
+ current.role && (typeof current.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm ", children: current.role }) : current.role)
45753
+ ] }),
45754
+ current.linkConfig?.href && /* @__PURE__ */ jsx(
45755
+ Pressable,
45756
+ {
45757
+ href: current.linkConfig.href,
45758
+ className: cn(
45759
+ current.linkConfig.className,
45760
+ "text-sm font-bold tracking-wide uppercase",
45761
+ "hover:underline hover:underline-offset-2"
45762
+ ),
45763
+ children: current.linkConfig.label
45764
+ }
45765
+ )
45766
+ ]
45767
+ }
45768
+ )
45769
+ ] });
45371
45770
  }, [
45372
45771
  testimonialsSlot,
45373
- isTransitioning,
45374
45772
  current,
45375
45773
  quoteClassName,
45376
45774
  authorClassName,
@@ -45388,21 +45786,75 @@ function TestimonialsSliderMinimal({
45388
45786
  patternOpacity,
45389
45787
  className,
45390
45788
  containerClassName,
45391
- children: /* @__PURE__ */ jsxs("div", { className: cn("mx-auto max-w-3xl text-center", contentClassName), children: [
45392
- renderedTestimonial,
45393
- testimonials && testimonials.length > 0 && /* @__PURE__ */ jsx("div", { className: cn("mt-8 flex justify-center gap-2", dotsClassName), children: testimonials.map((_, index) => /* @__PURE__ */ jsx(
45394
- "button",
45395
- {
45396
- onClick: () => goToSlide(index),
45397
- className: cn(
45398
- "size-2 rounded-full transition-all",
45399
- index === currentIndex ? "w-6 bg-primary text-primary-foreground" : ""
45400
- ),
45401
- "aria-label": `Go to testimonial ${index + 1}`
45402
- },
45403
- index
45404
- )) })
45405
- ] })
45789
+ children: /* @__PURE__ */ jsxs(
45790
+ "div",
45791
+ {
45792
+ className: cn(
45793
+ "mx-auto max-w-3xl text-center min-h-[700px] flex flex-col items-center justify-center",
45794
+ contentClassName
45795
+ ),
45796
+ children: [
45797
+ /* @__PURE__ */ jsx(AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsx(
45798
+ motion.div,
45799
+ {
45800
+ initial: { opacity: 0, y: 10 },
45801
+ animate: { opacity: 1, y: 0 },
45802
+ exit: { opacity: 0, y: -10 },
45803
+ transition: { duration: 0.4, ease: "easeInOut" },
45804
+ children: renderedTestimonial
45805
+ },
45806
+ currentIndex
45807
+ ) }),
45808
+ testimonials && testimonials.length > 1 && /* @__PURE__ */ jsxs(
45809
+ "div",
45810
+ {
45811
+ className: cn(
45812
+ "mt-8 flex items-center justify-center gap-4",
45813
+ navigationClassName
45814
+ ),
45815
+ children: [
45816
+ /* @__PURE__ */ jsx(
45817
+ Pressable,
45818
+ {
45819
+ asButton: true,
45820
+ variant: "default",
45821
+ size: "icon",
45822
+ className: cn("size-10 rounded-full", navButtonClassName),
45823
+ onClick: goToPrevious,
45824
+ "aria-label": previousButtonAriaLabel ?? "Previous testimonial",
45825
+ children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-left", size: 24 })
45826
+ }
45827
+ ),
45828
+ /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-2", dotsClassName), children: testimonials.map((_, index) => /* @__PURE__ */ jsx(
45829
+ "button",
45830
+ {
45831
+ onClick: () => goToIndex(index),
45832
+ className: cn(
45833
+ "size-2 rounded-full transition-all",
45834
+ index === currentIndex ? "w-6 bg-primary text-primary-foreground" : "bg-card text-card-foreground"
45835
+ ),
45836
+ "aria-label": `Go to testimonial ${index + 1}`
45837
+ },
45838
+ index
45839
+ )) }),
45840
+ /* @__PURE__ */ jsx(
45841
+ Pressable,
45842
+ {
45843
+ asButton: true,
45844
+ variant: "default",
45845
+ size: "icon",
45846
+ className: cn("size-10 rounded-full", navButtonClassName),
45847
+ onClick: goToNext,
45848
+ "aria-label": nextButtonAriaLabel ?? "Next testimonial",
45849
+ children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-right", size: 24 })
45850
+ }
45851
+ )
45852
+ ]
45853
+ }
45854
+ )
45855
+ ]
45856
+ }
45857
+ )
45406
45858
  }
45407
45859
  );
45408
45860
  }
@@ -45454,32 +45906,44 @@ function TestimonialsSplitImage({
45454
45906
  /* @__PURE__ */ jsx(
45455
45907
  DynamicIcon,
45456
45908
  {
45457
- name: "lucide/quote",
45909
+ name: "mdi/comment-quote-outline",
45458
45910
  size: 48,
45459
- className: cn("text-primary/20", quoteIconClassName)
45911
+ className: quoteIconClassName
45460
45912
  }
45461
45913
  ),
45462
45914
  testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsx(
45463
45915
  "blockquote",
45464
45916
  {
45465
45917
  className: cn(
45466
- "text-xl font-medium leading-relaxed md:text-2xl",
45918
+ "text-lg font-light leading-relaxed md:text-2xl lg:text-3xl",
45467
45919
  quoteClassName
45468
45920
  ),
45469
45921
  children: testimonial.quote
45470
45922
  }
45471
45923
  ) : /* @__PURE__ */ jsx("div", { className: quoteClassName, children: testimonial.quote })),
45472
45924
  /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-4 pt-4", authorClassName), children: [
45473
- /* @__PURE__ */ jsxs(Avatar, { className: "size-12", children: [
45925
+ /* @__PURE__ */ jsxs(Avatar, { className: "relative flex shrink-0 overflow-hidden shadow-xl rounded-2xl size-18", children: [
45474
45926
  /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
45475
45927
  /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(authorName) })
45476
45928
  ] }),
45477
- /* @__PURE__ */ jsxs("div", { children: [
45929
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0", children: [
45478
45930
  testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("p", { className: "font-semibold", children: testimonial.author }) : testimonial.author),
45479
45931
  (testimonial.role || testimonial.company) && /* @__PURE__ */ jsxs("p", { className: "text-sm ", children: [
45480
45932
  testimonial.role && (typeof testimonial.role === "string" ? testimonial.role : testimonial.role),
45481
45933
  testimonial.company && (typeof testimonial.company === "string" ? ` at ${testimonial.company}` : testimonial.company)
45482
- ] })
45934
+ ] }),
45935
+ testimonial.linkConfig?.href && /* @__PURE__ */ jsx(
45936
+ Pressable,
45937
+ {
45938
+ href: testimonial.linkConfig.href,
45939
+ className: cn(
45940
+ testimonial.linkConfig.className,
45941
+ "text-sm font-bold tracking-wide uppercase",
45942
+ "hover:underline hover:underline-offset-2"
45943
+ ),
45944
+ children: testimonial.linkConfig.label
45945
+ }
45946
+ )
45483
45947
  ] })
45484
45948
  ] })
45485
45949
  ]
@@ -45509,13 +45973,17 @@ function TestimonialsSplitImage({
45509
45973
  children: /* @__PURE__ */ jsxs(
45510
45974
  "div",
45511
45975
  {
45512
- className: cn("grid items-center gap-12 lg:grid-cols-2", gridClassName),
45976
+ className: cn(
45977
+ "grid items-center gap-10 md:gap-12 grid-cols-1 lg:grid-cols-2",
45978
+ gridClassName
45979
+ ),
45513
45980
  children: [
45514
45981
  imageSrc && /* @__PURE__ */ jsx(
45515
45982
  "div",
45516
45983
  {
45517
45984
  className: cn(
45518
- "relative aspect-4/3 overflow-hidden rounded-2xl lg:aspect-square",
45985
+ "shadow-xl rounded-2xl",
45986
+ "relative aspect-4/3 overflow-hidden lg:aspect-square",
45519
45987
  effectiveImagePosition === "right" && "lg:order-2",
45520
45988
  imageClassName
45521
45989
  ),
@@ -45838,19 +46306,6 @@ function TestimonialsWallCompact({
45838
46306
  }
45839
46307
  );
45840
46308
  }
45841
- function StarRating4({ rating, size = 14 }) {
45842
- return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-0.5", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsx(
45843
- DynamicIcon,
45844
- {
45845
- name: "lucide/star",
45846
- size,
45847
- className: cn(
45848
- star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
45849
- )
45850
- },
45851
- star
45852
- )) });
45853
- }
45854
46309
  function TestimonialsMiniDividers({
45855
46310
  testimonials,
45856
46311
  testimonialsSlot,
@@ -45865,101 +46320,134 @@ function TestimonialsMiniDividers({
45865
46320
  quoteClassName,
45866
46321
  authorClassName,
45867
46322
  background,
45868
- spacing,
46323
+ spacing = "lg",
46324
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
45869
46325
  pattern,
45870
46326
  patternOpacity
45871
46327
  }) {
45872
- const getAuthorName = useCallback((testimonial) => {
45873
- if (typeof testimonial.author === "string") return testimonial.author;
45874
- return "";
45875
- }, []);
45876
- const getAvatarSrc = useCallback((testimonial) => {
45877
- return testimonial.avatarSrc || testimonial.avatar?.src;
45878
- }, []);
46328
+ const getAuthorName = useCallback(
46329
+ (testimonial) => {
46330
+ if (typeof testimonial.author === "string") return testimonial.author;
46331
+ return "";
46332
+ },
46333
+ []
46334
+ );
46335
+ const getAvatarSrc = useCallback(
46336
+ (testimonial) => {
46337
+ return testimonial.avatarSrc || testimonial.avatar?.src;
46338
+ },
46339
+ []
46340
+ );
45879
46341
  const getInitials = useCallback((name) => {
45880
46342
  return name.split(" ").map((n) => n[0]).join("");
45881
46343
  }, []);
45882
46344
  const renderedTestimonials = useMemo(() => {
45883
46345
  if (testimonialsSlot) return testimonialsSlot;
45884
46346
  if (!testimonials || testimonials.length === 0) return null;
45885
- return /* @__PURE__ */ jsx(
46347
+ return /* @__PURE__ */ jsxs(
45886
46348
  "div",
45887
46349
  {
45888
46350
  className: cn(
45889
- "grid divide-y sm:grid-cols-2 sm:divide-x sm:divide-y-0 lg:grid-cols-3 lg:divide-x",
46351
+ "relative grid border-x border-dashed md:grid-cols-3",
45890
46352
  gridClassName
45891
46353
  ),
45892
- children: testimonials.map((testimonial, index) => {
45893
- const authorName = getAuthorName(testimonial);
45894
- const avatarSrc = getAvatarSrc(testimonial);
45895
- return /* @__PURE__ */ jsxs(
45896
- "div",
46354
+ children: [
46355
+ /* @__PURE__ */ jsx(
46356
+ DynamicIcon,
45897
46357
  {
45898
- className: cn(
45899
- "p-6",
45900
- index >= 2 && "lg:border-t-0",
45901
- index >= 3 && "sm:border-t lg:border-t-0",
45902
- itemClassName
45903
- ),
45904
- children: [
45905
- testimonial.rating && /* @__PURE__ */ jsx(StarRating4, { rating: testimonial.rating }),
45906
- testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxs(
45907
- "p",
45908
- {
45909
- className: cn(
45910
- "mt-3 text-sm leading-relaxed",
45911
- quoteClassName
45912
- ),
45913
- children: [
45914
- "\u201C",
45915
- testimonial.quote,
45916
- "\u201D"
45917
- ]
45918
- }
45919
- ) : /* @__PURE__ */ jsx("div", { className: cn("mt-3", quoteClassName), children: testimonial.quote })),
45920
- /* @__PURE__ */ jsxs(
45921
- "div",
45922
- {
45923
- className: cn("mt-4 flex items-center gap-3", authorClassName),
45924
- children: [
45925
- /* @__PURE__ */ jsxs(Avatar, { className: "size-8", children: [
45926
- /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
45927
- /* @__PURE__ */ jsx(AvatarFallback, { className: "text-xs", children: getInitials(authorName) })
45928
- ] }),
45929
- /* @__PURE__ */ jsxs("div", { children: [
45930
- testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: testimonial.author }) : testimonial.author),
45931
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: testimonial.role }) : testimonial.role)
45932
- ] })
45933
- ]
45934
- }
45935
- )
45936
- ]
45937
- },
45938
- index
45939
- );
45940
- })
46358
+ name: "lucide/sparkle",
46359
+ size: 20,
46360
+ className: "absolute top-0 right-0 translate-x-2.5 -translate-y-2.5 fill-primary"
46361
+ }
46362
+ ),
46363
+ /* @__PURE__ */ jsx(
46364
+ DynamicIcon,
46365
+ {
46366
+ name: "lucide/sparkle",
46367
+ size: 20,
46368
+ className: "absolute top-0 left-0 -translate-x-2.5 -translate-y-2.5 fill-primary"
46369
+ }
46370
+ ),
46371
+ testimonials.map((testimonial, index) => {
46372
+ const authorName = getAuthorName(testimonial);
46373
+ const avatarSrc = getAvatarSrc(testimonial);
46374
+ return /* @__PURE__ */ jsxs(
46375
+ "div",
46376
+ {
46377
+ className: cn(
46378
+ "group flex flex-col gap-4 border-t border-dashed p-4 transition-colors duration-300 hover:bg-muted/50 lg:p-8",
46379
+ index === 1 && "md:border-x md:border-dashed",
46380
+ index === 2 ? "border-b" : "md:border-b",
46381
+ itemClassName
46382
+ ),
46383
+ children: [
46384
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
46385
+ /* @__PURE__ */ jsxs(Avatar, { className: "size-10 shrink-0 rounded-md bg-card shadow-sm lg:size-12", children: [
46386
+ /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
46387
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "rounded-md bg-card text-card-foreground text-sm", children: getInitials(authorName) })
46388
+ ] }),
46389
+ /* @__PURE__ */ jsxs("div", { className: cn("min-w-0", authorClassName), children: [
46390
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("p", { className: "truncate font-medium", children: testimonial.author }) : testimonial.author),
46391
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("p", { className: "truncate text-sm text-muted-foreground", children: testimonial.role }) : testimonial.role)
46392
+ ] })
46393
+ ] }),
46394
+ testimonial.rating != null && /* @__PURE__ */ jsx(StarRating, { rating: testimonial.rating }),
46395
+ testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxs(
46396
+ "p",
46397
+ {
46398
+ className: cn(
46399
+ "text-sm leading-relaxed text-muted-foreground",
46400
+ quoteClassName
46401
+ ),
46402
+ children: [
46403
+ "\u201C",
46404
+ testimonial.quote,
46405
+ "\u201D"
46406
+ ]
46407
+ }
46408
+ ) : /* @__PURE__ */ jsx("div", { className: cn("text-sm", quoteClassName), children: testimonial.quote }))
46409
+ ]
46410
+ },
46411
+ index
46412
+ );
46413
+ })
46414
+ ]
45941
46415
  }
45942
46416
  );
45943
- }, [testimonialsSlot, gridClassName, testimonials, itemClassName, quoteClassName, authorClassName, getAuthorName, getAvatarSrc, getInitials]);
45944
- return /* @__PURE__ */ jsxs(
46417
+ }, [
46418
+ testimonialsSlot,
46419
+ gridClassName,
46420
+ testimonials,
46421
+ itemClassName,
46422
+ quoteClassName,
46423
+ authorClassName,
46424
+ getAuthorName,
46425
+ getAvatarSrc,
46426
+ getInitials
46427
+ ]);
46428
+ return /* @__PURE__ */ jsx(
45945
46429
  Section,
45946
46430
  {
45947
46431
  background,
45948
46432
  spacing,
45949
46433
  pattern,
45950
46434
  patternOpacity,
45951
- className,
45952
- children: [
45953
- /* @__PURE__ */ jsxs(
46435
+ className: cn("relative flex items-center justify-center", className),
46436
+ containerClassName,
46437
+ children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
46438
+ /* @__PURE__ */ jsx(
45954
46439
  "div",
45955
46440
  {
45956
- className: cn("mx-auto mb-12 max-w-2xl text-center", headerClassName),
45957
- children: [
46441
+ className: cn(
46442
+ "border-x border-t border-dashed px-4 py-6 md:py-16 md:px-16",
46443
+ headerClassName
46444
+ ),
46445
+ children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-3xl", children: [
45958
46446
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
45959
46447
  "h2",
45960
46448
  {
45961
46449
  className: cn(
45962
- "text-3xl font-semibold tracking-tight md:text-4xl",
46450
+ "text-center text-3xl font-semibold tracking-tight md:text-4xl",
45963
46451
  headingClassName
45964
46452
  ),
45965
46453
  children: heading
@@ -45969,17 +46457,17 @@ function TestimonialsMiniDividers({
45969
46457
  "p",
45970
46458
  {
45971
46459
  className: cn(
45972
- "mt-4 text-lg text-muted-foreground",
46460
+ "mx-auto mt-4 max-w-2xl text-center text-lg text-balance",
45973
46461
  descriptionClassName
45974
46462
  ),
45975
46463
  children: description
45976
46464
  }
45977
- ) : /* @__PURE__ */ jsx("div", { className: cn("mt-4", descriptionClassName), children: description }))
45978
- ]
46465
+ ) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description }))
46466
+ ] })
45979
46467
  }
45980
46468
  ),
45981
46469
  renderedTestimonials
45982
- ]
46470
+ ] })
45983
46471
  }
45984
46472
  );
45985
46473
  }
@@ -45999,18 +46487,25 @@ function TestimonialsLogoCards({
45999
46487
  quoteClassName,
46000
46488
  authorClassName,
46001
46489
  background,
46002
- spacing,
46490
+ spacing = "lg",
46491
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
46003
46492
  pattern,
46004
46493
  patternOpacity,
46005
46494
  optixFlowConfig
46006
46495
  }) {
46007
- const getAuthorName = useCallback((testimonial) => {
46008
- if (typeof testimonial.author === "string") return testimonial.author;
46009
- return "";
46010
- }, []);
46011
- const getAvatarSrc = useCallback((testimonial) => {
46012
- return testimonial.avatarSrc || testimonial.avatar?.src;
46013
- }, []);
46496
+ const getAuthorName = useCallback(
46497
+ (testimonial) => {
46498
+ if (typeof testimonial.author === "string") return testimonial.author;
46499
+ return "";
46500
+ },
46501
+ []
46502
+ );
46503
+ const getAvatarSrc = useCallback(
46504
+ (testimonial) => {
46505
+ return testimonial.avatarSrc || testimonial.avatar?.src;
46506
+ },
46507
+ []
46508
+ );
46014
46509
  const getInitials = useCallback((name) => {
46015
46510
  return name.split(" ").map((n) => n[0]).join("");
46016
46511
  }, []);
@@ -46041,7 +46536,10 @@ function TestimonialsLogoCards({
46041
46536
  {
46042
46537
  src: testimonial.companyLogo,
46043
46538
  alt: testimonial.companyLogoAlt || "Company logo",
46044
- className: "h-6 w-auto object-contain dark:invert",
46539
+ className: cn(
46540
+ index === 0 ? "h-10" : "h-5",
46541
+ "w-auto object-contain"
46542
+ ),
46045
46543
  optixFlowConfig
46046
46544
  }
46047
46545
  ) }),
@@ -46058,20 +46556,29 @@ function TestimonialsLogoCards({
46058
46556
  {
46059
46557
  className: cn(
46060
46558
  "leading-relaxed",
46061
- index === 0 ? "text-xl font-medium" : "text-sm",
46559
+ index === 0 ? "text-lg md:text-xl font-light" : "text-sm md:text-base",
46062
46560
  quoteClassName
46063
46561
  ),
46064
46562
  children: testimonial.quote
46065
46563
  }
46066
- ) : /* @__PURE__ */ jsx("div", { className: quoteClassName, children: testimonial.quote })),
46564
+ ) : testimonial.quote),
46067
46565
  /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-3", authorClassName), children: [
46068
- /* @__PURE__ */ jsxs(Avatar, { className: cn(index === 0 ? "size-12" : "size-10"), children: [
46069
- /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
46070
- /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(authorName) })
46071
- ] }),
46566
+ /* @__PURE__ */ jsxs(
46567
+ Avatar,
46568
+ {
46569
+ className: cn(
46570
+ index === 0 ? "size-12" : "size-10",
46571
+ "ring-4 ring-primary"
46572
+ ),
46573
+ children: [
46574
+ /* @__PURE__ */ jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
46575
+ /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(authorName) })
46576
+ ]
46577
+ }
46578
+ ),
46072
46579
  /* @__PURE__ */ jsxs("div", { children: [
46073
- testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("cite", { className: "text-sm font-medium not-italic", children: testimonial.author }) : testimonial.author),
46074
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: testimonial.role }) : testimonial.role)
46580
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("cite", { className: "text-sm md:text-base font-medium", children: testimonial.author }) : testimonial.author),
46581
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-xs md:text-sm", children: testimonial.role }) : testimonial.role)
46075
46582
  ] })
46076
46583
  ] })
46077
46584
  ]
@@ -46084,7 +46591,20 @@ function TestimonialsLogoCards({
46084
46591
  })
46085
46592
  }
46086
46593
  );
46087
- }, [testimonialsSlot, gridClassName, testimonials, cardClassName, cardHeaderClassName, optixFlowConfig, cardContentClassName, quoteClassName, authorClassName, getAuthorName, getAvatarSrc, getInitials]);
46594
+ }, [
46595
+ testimonialsSlot,
46596
+ gridClassName,
46597
+ testimonials,
46598
+ cardClassName,
46599
+ cardHeaderClassName,
46600
+ optixFlowConfig,
46601
+ cardContentClassName,
46602
+ quoteClassName,
46603
+ authorClassName,
46604
+ getAuthorName,
46605
+ getAvatarSrc,
46606
+ getInitials
46607
+ ]);
46088
46608
  return /* @__PURE__ */ jsxs(
46089
46609
  Section,
46090
46610
  {
@@ -46093,6 +46613,7 @@ function TestimonialsLogoCards({
46093
46613
  pattern,
46094
46614
  patternOpacity,
46095
46615
  className,
46616
+ containerClassName,
46096
46617
  children: [
46097
46618
  /* @__PURE__ */ jsxs(
46098
46619
  "div",
@@ -46108,17 +46629,8 @@ function TestimonialsLogoCards({
46108
46629
  ),
46109
46630
  children: heading
46110
46631
  }
46111
- ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
46112
- description && (typeof description === "string" ? /* @__PURE__ */ jsx(
46113
- "p",
46114
- {
46115
- className: cn(
46116
- "mt-4 text-lg text-muted-foreground",
46117
- descriptionClassName
46118
- ),
46119
- children: description
46120
- }
46121
- ) : /* @__PURE__ */ jsx("div", { className: cn("mt-4", descriptionClassName), children: description }))
46632
+ ) : heading),
46633
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("mt-4 text-lg", descriptionClassName), children: description }) : description)
46122
46634
  ]
46123
46635
  }
46124
46636
  ),
@@ -46413,14 +46925,14 @@ function TestimonialsAnimatedSplit({
46413
46925
  animate: { opacity: 1, y: 0 },
46414
46926
  exit: { opacity: 0, y: -20 },
46415
46927
  transition: { duration: 0.4 },
46416
- className: "space-y-6",
46928
+ className: "space-y-4 md:space-y-6",
46417
46929
  children: [
46418
46930
  /* @__PURE__ */ jsx(DynamicIcon, { name: "mdi/comment-quote-outline", size: 48 }),
46419
46931
  current.quote && (typeof current.quote === "string" ? /* @__PURE__ */ jsx(
46420
46932
  "blockquote",
46421
46933
  {
46422
46934
  className: cn(
46423
- "text-lg font-base leading-relaxed md:text-2xl",
46935
+ "text-base md:text-lg font-thin leading-normal md:leading-relaxed md:text-2xl line-clamp-4",
46424
46936
  quoteClassName
46425
46937
  ),
46426
46938
  children: current.quote
@@ -46432,9 +46944,9 @@ function TestimonialsAnimatedSplit({
46432
46944
  /* @__PURE__ */ jsx(AvatarFallback, { children: getInitials(authorName) })
46433
46945
  ] }),
46434
46946
  /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
46435
- /* @__PURE__ */ jsxs("div", { className: "flex gap-1", children: [
46436
- current.author && (typeof current.author === "string" ? /* @__PURE__ */ jsx("span", { className: "font-semibold", children: current.author }) : current.author),
46437
- /* @__PURE__ */ jsxs("span", { className: "font-base tracking-wide", children: [
46947
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col md:flex-row items-start md:items-center gap-0 md:gap-1", children: [
46948
+ current.author && (typeof current.author === "string" ? /* @__PURE__ */ jsx("span", { className: "text-sm md:text-base font-semibold", children: current.author }) : current.author),
46949
+ /* @__PURE__ */ jsxs("span", { className: "text-sm md:text-base font-normal tracking-normal md:tracking-wide", children: [
46438
46950
  current.role && (typeof current.role === "string" ? current.role : null),
46439
46951
  current.company && (typeof current.company === "string" ? ` at ${current.company}` : null)
46440
46952
  ] })
@@ -46588,7 +47100,7 @@ function TestimonialsScrollingColumns({
46588
47100
  motion.div,
46589
47101
  {
46590
47102
  className: cn(
46591
- "relative overflow-hidden rounded-lg bg-card shadow-sm",
47103
+ "relative overflow-hidden rounded-2xl bg-card text-card-foreground shadow-sm",
46592
47104
  cardClassName
46593
47105
  ),
46594
47106
  variants: itemVariants2,
@@ -46603,15 +47115,25 @@ function TestimonialsScrollingColumns({
46603
47115
  optixFlowConfig
46604
47116
  }
46605
47117
  ),
46606
- /* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-foreground/70 via-foreground/40 to-transparent" })
47118
+ /* @__PURE__ */ jsx(GradientOverlay, {})
46607
47119
  ] }),
46608
- /* @__PURE__ */ jsxs("div", { className: "absolute bottom-0 left-0 right-0 p-6 text-left text-background", children: [
46609
- /* @__PURE__ */ jsx(
47120
+ /* @__PURE__ */ jsxs("div", { className: "absolute bottom-0 left-0 right-0 p-6 text-left", children: [
47121
+ testimonial?.logoSrc ? /* @__PURE__ */ jsx(
47122
+ Img,
47123
+ {
47124
+ src: testimonial.logoSrc,
47125
+ alt: typeof testimonial.company === "string" ? `${testimonial.company} logo` : typeof testimonial.author === "string" ? `${testimonial.author} company logo` : "Company logo",
47126
+ className: cn(
47127
+ "mx-auto mb-6 max-h-12 max-w-32 object-contain md:max-h-16 md:max-w-48"
47128
+ ),
47129
+ optixFlowConfig
47130
+ }
47131
+ ) : /* @__PURE__ */ jsx(
46610
47132
  DynamicIcon,
46611
47133
  {
46612
- name: "lucide/quote",
46613
- size: 32,
46614
- className: "mb-4 text-background/40"
47134
+ name: "mdi/comment-quote-outline",
47135
+ size: 42,
47136
+ className: cn("opacity-50")
46615
47137
  }
46616
47138
  ),
46617
47139
  testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsx(
@@ -46623,12 +47145,12 @@ function TestimonialsScrollingColumns({
46623
47145
  ),
46624
47146
  children: testimonial.quote
46625
47147
  }
46626
- ) : /* @__PURE__ */ jsx("div", { className: quoteClassName, children: testimonial.quote })),
47148
+ ) : testimonial.quote),
46627
47149
  /* @__PURE__ */ jsx("figcaption", { className: cn("mt-4", authorClassName), children: /* @__PURE__ */ jsxs("p", { className: "font-semibold", children: [
46628
47150
  "\u2014",
46629
47151
  " ",
46630
47152
  testimonial.author && (typeof testimonial.author === "string" ? testimonial.author : null),
46631
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxs("span", { className: "ml-1 text-background/60", children: [
47153
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxs("span", { className: "ml-1", children: [
46632
47154
  ", ",
46633
47155
  testimonial.role
46634
47156
  ] }) : null)
@@ -46664,19 +47186,32 @@ function TestimonialsScrollingColumns({
46664
47186
  /* @__PURE__ */ jsxs(
46665
47187
  "div",
46666
47188
  {
46667
- className: cn("mx-auto mb-12 max-w-2xl text-center", headerClassName),
47189
+ className: cn(
47190
+ "mx-auto mb-12 max-w-full md:max-w-2xl space-y-4 text-center",
47191
+ headerClassName
47192
+ ),
46668
47193
  children: [
46669
47194
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
46670
47195
  "h2",
46671
47196
  {
46672
47197
  className: cn(
46673
- "text-3xl font-semibold tracking-tight md:text-4xl",
47198
+ "text-pretty text-3xl md:text-4xl lg:text-6xl",
47199
+ "font-semibold tracking-tight",
46674
47200
  headingClassName
46675
47201
  ),
46676
47202
  children: heading
46677
47203
  }
46678
- ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
46679
- description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("mt-4 text-lg ", descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: cn("mt-4", descriptionClassName), children: description }))
47204
+ ) : heading),
47205
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx(
47206
+ "p",
47207
+ {
47208
+ className: cn(
47209
+ "text-base text-base md:text-lg text-balance",
47210
+ descriptionClassName
47211
+ ),
47212
+ children: description
47213
+ }
47214
+ ) : description)
46680
47215
  ]
46681
47216
  }
46682
47217
  ),
@@ -46696,7 +47231,8 @@ function TestimonialsMinimalNumbered({
46696
47231
  authorClassName,
46697
47232
  navigationClassName,
46698
47233
  background,
46699
- spacing,
47234
+ spacing = "lg",
47235
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
46700
47236
  pattern,
46701
47237
  patternOpacity
46702
47238
  }) {
@@ -46754,14 +47290,14 @@ function TestimonialsMinimalNumbered({
46754
47290
  "span",
46755
47291
  {
46756
47292
  className: cn(
46757
- "text-8xl font-light leading-none select-none transition-all duration-500 md:text-9xl",
47293
+ "text-4xl md:text-8xl font-light leading-none select-none transition-all duration-500 md:text-9xl",
46758
47294
  numberClassName
46759
47295
  ),
46760
47296
  style: { fontFeatureSettings: '"tnum"' },
46761
47297
  children: String(active + 1).padStart(2, "0")
46762
47298
  }
46763
47299
  ),
46764
- /* @__PURE__ */ jsxs("div", { className: "flex-1 pt-6", children: [
47300
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 pt-0 md:pt-6", children: [
46765
47301
  current.quote && (typeof current.quote === "string" ? /* @__PURE__ */ jsx(
46766
47302
  "blockquote",
46767
47303
  {
@@ -46867,13 +47403,13 @@ function TestimonialsMinimalNumbered({
46867
47403
  String(testimonials.length).padStart(2, "0")
46868
47404
  ] })
46869
47405
  ] }) }),
46870
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
47406
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
46871
47407
  /* @__PURE__ */ jsx(
46872
47408
  "button",
46873
47409
  {
46874
47410
  onClick: handlePrev,
46875
47411
  className: "rounded-full p-2 transition-all duration-300 ",
46876
- children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-left", size: 20 })
47412
+ children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-left", size: 24 })
46877
47413
  }
46878
47414
  ),
46879
47415
  /* @__PURE__ */ jsx(
@@ -46881,7 +47417,7 @@ function TestimonialsMinimalNumbered({
46881
47417
  {
46882
47418
  onClick: handleNext,
46883
47419
  className: "rounded-full p-2 transition-all duration-300 ",
46884
- children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-right", size: 20 })
47420
+ children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/chevron-right", size: 24 })
46885
47421
  }
46886
47422
  )
46887
47423
  ] })
@@ -47002,10 +47538,11 @@ function TestimonialsParallaxNumber({
47002
47538
  motion.div,
47003
47539
  {
47004
47540
  className: cn(
47541
+ "opacity-15",
47005
47542
  "pointer-events-none absolute -left-8 top-1/2 -translate-y-1/2 select-none text-[20rem] font-bold leading-none tracking-tighter ",
47006
47543
  numberClassName
47007
47544
  ),
47008
- style: { x: numberX, y: numberY },
47545
+ style: { x: numberX, y: numberY, opacity: 0.1 },
47009
47546
  children: /* @__PURE__ */ jsx(AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsx(
47010
47547
  motion.span,
47011
47548
  {
@@ -47014,14 +47551,14 @@ function TestimonialsParallaxNumber({
47014
47551
  exit: { opacity: 0, scale: 1.1, filter: "blur(10px)" },
47015
47552
  transition: { duration: 0.6, ease: [0.22, 1, 0.36, 1] },
47016
47553
  className: "block",
47017
- children: current.backgroundIcon ? /* @__PURE__ */ jsx(DynamicIcon, { name: current.backgroundIcon }) : current.backgroundLabel != null ? current.backgroundLabel : null
47554
+ children: current.backgroundIcon ? /* @__PURE__ */ jsx(DynamicIcon, { name: current.backgroundIcon, size: 320 }) : current.backgroundLabel != null ? current.backgroundLabel : null
47018
47555
  },
47019
47556
  activeIndex
47020
47557
  ) })
47021
47558
  }
47022
47559
  ),
47023
47560
  /* @__PURE__ */ jsxs("div", { className: "relative flex", children: [
47024
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center border-r border-border/50 pr-16", children: [
47561
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center border-r-0 md:border-r border-border/50 pr-4 md:pr-16", children: [
47025
47562
  /* @__PURE__ */ jsxs(
47026
47563
  motion.span,
47027
47564
  {
@@ -47047,7 +47584,7 @@ function TestimonialsParallaxNumber({
47047
47584
  }
47048
47585
  ) })
47049
47586
  ] }),
47050
- /* @__PURE__ */ jsxs("div", { className: "flex-1 py-12 pl-16", children: [
47587
+ /* @__PURE__ */ jsxs("div", { className: "flex-1 py-6 md:py-12 pl-4 md:pl-16", children: [
47051
47588
  /* @__PURE__ */ jsx(AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsx(
47052
47589
  motion.div,
47053
47590
  {
@@ -47064,7 +47601,7 @@ function TestimonialsParallaxNumber({
47064
47601
  motion.blockquote,
47065
47602
  {
47066
47603
  className: cn(
47067
- "text-3xl font-light leading-[1.15] tracking-tight md:text-4xl lg:text-5xl",
47604
+ "text-2xl md:text-3xl font-light leading-[1.15] tracking-tight md:text-4xl lg:text-5xl",
47068
47605
  quoteClassName
47069
47606
  ),
47070
47607
  initial: "hidden",
@@ -47099,7 +47636,7 @@ function TestimonialsParallaxNumber({
47099
47636
  },
47100
47637
  activeIndex
47101
47638
  ) }) }),
47102
- /* @__PURE__ */ jsxs("div", { className: "flex items-end justify-between", children: [
47639
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start md:items-end justify-between", children: [
47103
47640
  /* @__PURE__ */ jsx(AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsx(
47104
47641
  motion.div,
47105
47642
  {
@@ -47116,7 +47653,9 @@ function TestimonialsParallaxNumber({
47116
47653
  {
47117
47654
  href: current.linkConfig.href,
47118
47655
  className: cn(
47119
- "text-sm text-muted-foreground underline underline-offset-2 hover:text-foreground transition-colors",
47656
+ "transition-all duration-500",
47657
+ "hover:underline hover:underline-offset-4",
47658
+ "text-sm",
47120
47659
  current.linkConfig.className
47121
47660
  ),
47122
47661
  children: current.linkConfig.label
@@ -47129,7 +47668,10 @@ function TestimonialsParallaxNumber({
47129
47668
  /* @__PURE__ */ jsxs(
47130
47669
  "div",
47131
47670
  {
47132
- className: cn("flex items-center gap-4", navigationClassName),
47671
+ className: cn(
47672
+ "flex items-center gap-4 flex-col md:flex-row",
47673
+ navigationClassName
47674
+ ),
47133
47675
  children: [
47134
47676
  /* @__PURE__ */ jsx(
47135
47677
  motion.button,
@@ -51645,7 +52187,7 @@ function HeroBadgeShadowOverlay({
51645
52187
  backgroundImageUrl,
51646
52188
  optixFlowConfig,
51647
52189
  background,
51648
- spacing = "py-0 md:py-0",
52190
+ spacing = "none",
51649
52191
  pattern,
51650
52192
  patternOpacity,
51651
52193
  className,
@@ -51732,7 +52274,8 @@ function HeroVideoBackgroundDark({
51732
52274
  videoSrc,
51733
52275
  videoSlot,
51734
52276
  background,
51735
- videoBrightness = "50",
52277
+ videoBrightness,
52278
+ videoOverlayIntensity = "high",
51736
52279
  spacing = "py-0 md:py-0",
51737
52280
  pattern,
51738
52281
  patternOpacity,
@@ -51744,21 +52287,21 @@ function HeroVideoBackgroundDark({
51744
52287
  }) {
51745
52288
  const renderVideo = useMemo(() => {
51746
52289
  if (videoSlot) return videoSlot;
51747
- return /* @__PURE__ */ jsx(
51748
- "video",
51749
- {
51750
- loop: true,
51751
- playsInline: true,
51752
- src: videoSrc,
51753
- className: cn(
51754
- "absolute top-0 left-0 size-full object-cover",
51755
- `brightness-${videoBrightness}`
51756
- ),
51757
- autoPlay: true,
51758
- muted: true
51759
- }
51760
- );
51761
- }, [videoSlot, videoSrc, videoBrightness]);
52290
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
52291
+ /* @__PURE__ */ jsx(
52292
+ "video",
52293
+ {
52294
+ loop: true,
52295
+ playsInline: true,
52296
+ src: videoSrc,
52297
+ className: "absolute top-0 left-0 size-full object-cover",
52298
+ autoPlay: true,
52299
+ muted: true
52300
+ }
52301
+ ),
52302
+ /* @__PURE__ */ jsx(GradientOverlay, { intensity: videoOverlayIntensity })
52303
+ ] });
52304
+ }, [videoSlot, videoSrc, videoOverlayIntensity]);
51762
52305
  return /* @__PURE__ */ jsx(
51763
52306
  Section,
51764
52307
  {
@@ -115329,8 +115872,8 @@ var BLOCK_REGISTRY = {
115329
115872
  },
115330
115873
  "testimonials-centered-avatars": {
115331
115874
  id: "testimonials-centered-avatars",
115332
- name: "Testimonials Centered with Avatar Stack",
115333
- description: "A centered testimonial section featuring an overlapping avatar stack at the top, creating a community feel. Displays a rotating testimonial with quote, author name, role, and navigation dots. The stacked avatars create visual interest and suggest multiple satisfied customers. Perfect for SaaS landing pages.",
115875
+ name: "Testimonials Centered with Glassmorphism Card",
115876
+ description: "A modern testimonial section featuring a glassmorphism card with frosted glass effect as the primary focal point. Displays an overlapping avatar stack at the top, creating a community feel, with rotating testimonials including quote, author name, role, and navigation dots. The translucent card design creates visual depth and sophistication. Perfect for SaaS landing pages and premium marketing sites.",
115334
115877
  semanticTags: [
115335
115878
  "testimonials",
115336
115879
  "centered",
@@ -115338,7 +115881,11 @@ var BLOCK_REGISTRY = {
115338
115881
  "stack",
115339
115882
  "community",
115340
115883
  "social-proof",
115341
- "minimal",
115884
+ "glassmorphism",
115885
+ "glass",
115886
+ "frosted",
115887
+ "modern",
115888
+ "premium",
115342
115889
  "rotating"
115343
115890
  ],
115344
115891
  category: "testimonials",