@opensite/ui 2.8.6 → 2.8.8

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 (143) 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-icon-sidebar.cjs +5 -4
  14. package/dist/carousel-icon-sidebar.js +5 -4
  15. package/dist/carousel-portfolio-hero.cjs +79 -25
  16. package/dist/carousel-portfolio-hero.d.cts +7 -2
  17. package/dist/carousel-portfolio-hero.d.ts +7 -2
  18. package/dist/carousel-portfolio-hero.js +79 -25
  19. package/dist/components.cjs +81 -42
  20. package/dist/components.d.cts +29 -2
  21. package/dist/components.d.ts +29 -2
  22. package/dist/components.js +81 -43
  23. package/dist/contact-map.cjs +46 -32
  24. package/dist/contact-map.js +46 -32
  25. package/dist/footer-accordion-social.cjs +17 -10
  26. package/dist/footer-accordion-social.js +17 -10
  27. package/dist/footer-animated-social.cjs +17 -10
  28. package/dist/footer-animated-social.js +17 -10
  29. package/dist/footer-brand-description.cjs +17 -10
  30. package/dist/footer-brand-description.js +17 -10
  31. package/dist/footer-brand-links-contact.cjs +17 -10
  32. package/dist/footer-brand-links-contact.js +17 -10
  33. package/dist/footer-comprehensive-links.cjs +17 -10
  34. package/dist/footer-comprehensive-links.js +17 -10
  35. package/dist/footer-contact-card.cjs +17 -10
  36. package/dist/footer-contact-card.js +17 -10
  37. package/dist/footer-cta-banner.cjs +17 -10
  38. package/dist/footer-cta-banner.js +17 -10
  39. package/dist/footer-cta-social.cjs +17 -10
  40. package/dist/footer-cta-social.js +17 -10
  41. package/dist/footer-info-cards-accordion.cjs +17 -10
  42. package/dist/footer-info-cards-accordion.js +17 -10
  43. package/dist/footer-nav-social.cjs +17 -10
  44. package/dist/footer-nav-social.js +17 -10
  45. package/dist/footer-newsletter-contact.cjs +17 -10
  46. package/dist/footer-newsletter-contact.js +17 -10
  47. package/dist/footer-newsletter-grid.cjs +17 -10
  48. package/dist/footer-newsletter-grid.js +17 -10
  49. package/dist/footer-newsletter-minimal.cjs +17 -10
  50. package/dist/footer-newsletter-minimal.js +17 -10
  51. package/dist/footer-social-apps.cjs +17 -10
  52. package/dist/footer-social-apps.js +17 -10
  53. package/dist/footer-social-newsletter.cjs +17 -10
  54. package/dist/footer-social-newsletter.js +17 -10
  55. package/dist/footer-split-image-accordion.cjs +17 -10
  56. package/dist/footer-split-image-accordion.js +17 -10
  57. package/dist/geo-map.cjs +46 -32
  58. package/dist/geo-map.js +46 -32
  59. package/dist/hero-coming-soon-countdown.cjs +17 -10
  60. package/dist/hero-coming-soon-countdown.js +17 -10
  61. package/dist/hero-video-background-dark.cjs +78 -16
  62. package/dist/hero-video-background-dark.d.cts +7 -2
  63. package/dist/hero-video-background-dark.d.ts +7 -2
  64. package/dist/hero-video-background-dark.js +78 -16
  65. package/dist/index.cjs +81 -42
  66. package/dist/index.d.cts +1 -0
  67. package/dist/index.d.ts +1 -0
  68. package/dist/index.js +81 -43
  69. package/dist/link-page-bento-layout.cjs +17 -10
  70. package/dist/link-page-bento-layout.js +17 -10
  71. package/dist/link-page-grid-cards.cjs +17 -10
  72. package/dist/link-page-grid-cards.js +17 -10
  73. package/dist/link-page-minimal-profile.cjs +17 -10
  74. package/dist/link-page-minimal-profile.js +17 -10
  75. package/dist/link-page-newsletter-social.cjs +17 -10
  76. package/dist/link-page-newsletter-social.js +17 -10
  77. package/dist/link-tree-block.cjs +17 -10
  78. package/dist/link-tree-block.js +17 -10
  79. package/dist/navbar-fullscreen-menu.cjs +17 -10
  80. package/dist/navbar-fullscreen-menu.js +17 -10
  81. package/dist/navbar-transparent-overlay.cjs +17 -10
  82. package/dist/navbar-transparent-overlay.js +17 -10
  83. package/dist/registry.cjs +967 -620
  84. package/dist/registry.js +967 -620
  85. package/dist/social-link-icon.cjs +17 -10
  86. package/dist/social-link-icon.d.cts +5 -0
  87. package/dist/social-link-icon.d.ts +5 -0
  88. package/dist/social-link-icon.js +17 -10
  89. package/dist/testimonials-bento-grid.cjs +1 -1
  90. package/dist/testimonials-bento-grid.js +1 -1
  91. package/dist/testimonials-carousel-image.cjs +16 -2
  92. package/dist/testimonials-carousel-image.d.cts +5 -1
  93. package/dist/testimonials-carousel-image.d.ts +5 -1
  94. package/dist/testimonials-carousel-image.js +16 -2
  95. package/dist/testimonials-centered-avatars.cjs +1 -1
  96. package/dist/testimonials-centered-avatars.js +1 -1
  97. package/dist/testimonials-grid-add-review.cjs +51 -29
  98. package/dist/testimonials-grid-add-review.js +51 -29
  99. package/dist/testimonials-images-helpful.cjs +181 -160
  100. package/dist/testimonials-images-helpful.d.cts +9 -1
  101. package/dist/testimonials-images-helpful.d.ts +9 -1
  102. package/dist/testimonials-images-helpful.js +181 -159
  103. package/dist/testimonials-large-quote.cjs +74 -43
  104. package/dist/testimonials-large-quote.d.cts +5 -1
  105. package/dist/testimonials-large-quote.d.ts +5 -1
  106. package/dist/testimonials-large-quote.js +74 -43
  107. package/dist/testimonials-list-verified.cjs +63 -44
  108. package/dist/testimonials-list-verified.d.cts +5 -1
  109. package/dist/testimonials-list-verified.d.ts +5 -1
  110. package/dist/testimonials-list-verified.js +64 -45
  111. package/dist/testimonials-logo-cards.cjs +55 -25
  112. package/dist/testimonials-logo-cards.d.cts +5 -1
  113. package/dist/testimonials-logo-cards.d.ts +5 -1
  114. package/dist/testimonials-logo-cards.js +55 -25
  115. package/dist/testimonials-marquee.cjs +440 -28
  116. package/dist/testimonials-marquee.js +441 -26
  117. package/dist/testimonials-masonry-grid.cjs +486 -69
  118. package/dist/testimonials-masonry-grid.d.cts +5 -1
  119. package/dist/testimonials-masonry-grid.d.ts +5 -1
  120. package/dist/testimonials-masonry-grid.js +483 -63
  121. package/dist/testimonials-mini-dividers.cjs +119 -83
  122. package/dist/testimonials-mini-dividers.d.cts +10 -6
  123. package/dist/testimonials-mini-dividers.d.ts +10 -6
  124. package/dist/testimonials-mini-dividers.js +119 -83
  125. package/dist/testimonials-minimal-numbered.cjs +9 -7
  126. package/dist/testimonials-minimal-numbered.d.cts +5 -1
  127. package/dist/testimonials-minimal-numbered.d.ts +5 -1
  128. package/dist/testimonials-minimal-numbered.js +9 -7
  129. package/dist/testimonials-parallax-number.cjs +14 -9
  130. package/dist/testimonials-parallax-number.js +14 -9
  131. package/dist/testimonials-scrolling-columns.cjs +100 -21
  132. package/dist/testimonials-scrolling-columns.js +100 -21
  133. package/dist/testimonials-simple-grid.cjs +22 -5
  134. package/dist/testimonials-simple-grid.js +22 -5
  135. package/dist/testimonials-slider-minimal.cjs +1 -1
  136. package/dist/testimonials-slider-minimal.js +1 -1
  137. package/dist/testimonials-stats-header.cjs +528 -87
  138. package/dist/testimonials-stats-header.d.cts +39 -3
  139. package/dist/testimonials-stats-header.d.ts +39 -3
  140. package/dist/testimonials-stats-header.js +523 -82
  141. package/dist/testimonials-twitter-cards.cjs +20 -12
  142. package/dist/testimonials-twitter-cards.js +20 -12
  143. package/package.json +11 -1
package/dist/registry.cjs CHANGED
@@ -80,16 +80,6 @@ var DropdownMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(DropdownMe
80
80
  function cn(...inputs) {
81
81
  return tailwindMerge.twMerge(clsx.clsx(inputs));
82
82
  }
83
- var BRIGHTNESS_CLASS_MAP = {
84
- "10": "brightness-[.1]",
85
- "20": "brightness-[.2]",
86
- "25": "brightness-[.25]",
87
- "30": "brightness-[.3]",
88
- "40": "brightness-[.4]",
89
- "50": "brightness-50",
90
- "75": "brightness-75",
91
- "100": "brightness-100"
92
- };
93
83
  function getNestedCardBg(parentBg, variant = "muted", options) {
94
84
  const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
95
85
  if (isDark) {
@@ -1224,41 +1214,55 @@ function MarkerMediaCarousel({
1224
1214
  React8__namespace.useEffect(() => {
1225
1215
  setActiveIndex(0);
1226
1216
  }, [mediaResetKey]);
1227
- const activeMediaItem = mediaItems[activeItemIndex];
1228
- const mediaType = resolveMediaType(activeMediaItem);
1229
1217
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative border-b border-border/60 bg-muted/40", children: [
1230
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-44 w-full overflow-hidden", children: mediaType === "video" ? /* @__PURE__ */ jsxRuntime.jsx(
1231
- "video",
1232
- {
1233
- className: "h-full w-full object-cover",
1234
- controls: true,
1235
- preload: "metadata",
1236
- poster: activeMediaItem.poster,
1237
- children: /* @__PURE__ */ jsxRuntime.jsx("source", { src: activeMediaItem.src })
1238
- }
1239
- ) : /* @__PURE__ */ jsxRuntime.jsx(
1240
- img.Img,
1241
- {
1242
- src: activeMediaItem.src,
1243
- alt: activeMediaItem.alt ?? "Map marker media",
1244
- className: "h-full w-full object-cover",
1245
- loading: "eager",
1246
- optixFlowConfig
1247
- }
1248
- ) }),
1218
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative aspect-video w-full overflow-hidden", children: mediaItems.map((item, index) => {
1219
+ const isActive = index === activeItemIndex;
1220
+ const mediaType = resolveMediaType(item);
1221
+ return /* @__PURE__ */ jsxRuntime.jsx(
1222
+ "div",
1223
+ {
1224
+ "aria-hidden": !isActive,
1225
+ className: cn(
1226
+ "absolute inset-0 transition-opacity duration-500 ease-in-out",
1227
+ isActive ? "opacity-100 z-[1]" : "opacity-0 z-0 pointer-events-none"
1228
+ ),
1229
+ children: mediaType === "video" ? /* @__PURE__ */ jsxRuntime.jsx(
1230
+ "video",
1231
+ {
1232
+ className: "h-full w-full object-cover",
1233
+ controls: isActive,
1234
+ preload: "metadata",
1235
+ poster: item.poster,
1236
+ tabIndex: isActive ? 0 : -1,
1237
+ children: /* @__PURE__ */ jsxRuntime.jsx("source", { src: item.src })
1238
+ }
1239
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1240
+ img.Img,
1241
+ {
1242
+ src: item.src,
1243
+ alt: item.alt ?? "Map marker media",
1244
+ className: "h-full w-full object-cover",
1245
+ loading: "eager",
1246
+ optixFlowConfig
1247
+ }
1248
+ )
1249
+ },
1250
+ normalizeId(item.id, `media-slide-${index}`)
1251
+ );
1252
+ }) }),
1249
1253
  totalItems > 1 ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1250
1254
  /* @__PURE__ */ jsxRuntime.jsx(
1251
1255
  "button",
1252
1256
  {
1253
1257
  type: "button",
1254
1258
  "aria-label": "Show previous media",
1255
- className: "absolute left-2 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-full bg-card text-card-foreground shadow-sm transition hover:bg-muted hover:text-muted-foreground",
1259
+ className: "absolute left-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-[2]",
1256
1260
  onClick: () => {
1257
1261
  setActiveIndex(
1258
1262
  (current) => (current - 1 + totalItems) % totalItems
1259
1263
  );
1260
1264
  },
1261
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-left", size: 16 })
1265
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-left", size: 18 })
1262
1266
  }
1263
1267
  ),
1264
1268
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -1266,20 +1270,20 @@ function MarkerMediaCarousel({
1266
1270
  {
1267
1271
  type: "button",
1268
1272
  "aria-label": "Show next media",
1269
- className: "absolute right-2 top-1/2 inline-flex h-8 w-8 -translate-y-1/2 items-center justify-center rounded-full bg-card text-card-foreground shadow-sm transition hover:bg-muted hover:text-muted-foreground",
1273
+ className: "absolute right-4 top-1/2 inline-flex size-10 -translate-y-1/2 items-center justify-center rounded-2xl bg-card text-card-foreground shadow-lg border-4 border-black hover:border-white hover:bg-black hover:text-white transition-all duration-500 z-[2]",
1270
1274
  onClick: () => {
1271
1275
  setActiveIndex((current) => (current + 1) % totalItems);
1272
1276
  },
1273
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
1277
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 18 })
1274
1278
  }
1275
1279
  ),
1276
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-2 left-1/2 flex -translate-x-1/2 items-center gap-1.5", children: mediaItems.map((item, index) => /* @__PURE__ */ jsxRuntime.jsx(
1280
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-2 left-1/2 flex -translate-x-1/2 items-center gap-1.5 z-[2]", children: mediaItems.map((item, index) => /* @__PURE__ */ jsxRuntime.jsx(
1277
1281
  "button",
1278
1282
  {
1279
1283
  type: "button",
1280
1284
  "aria-label": `Show media item ${index + 1}`,
1281
1285
  className: cn(
1282
- "h-2 rounded-full transition-all",
1286
+ "h-2 rounded-full transition-all duration-300",
1283
1287
  index === activeItemIndex ? "w-6 bg-card" : "w-2 bg-card opacity-50 hover:opacity-100"
1284
1288
  ),
1285
1289
  onClick: () => setActiveIndex(index)
@@ -1610,9 +1614,9 @@ function GeoMap({
1610
1614
  {
1611
1615
  type: "button",
1612
1616
  "aria-label": "Close marker details",
1613
- className: "flex size-8 items-center justify-center rounded-full border border-border bg-card text-card-foreground transition hover:bg-muted hover:text-foreground absolute top-2 right-2 z-10",
1617
+ className: "\n flex size-12 items-center justify-center rounded-bl-lg rounded-br-0 rounded-t-0 bg-black text-white transition-all duration-500 absolute top-0 right-0 z-10 cursor-pointer ring-4 ring-white\n",
1614
1618
  onClick: clearSelection,
1615
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", size: 16 })
1619
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", size: 20 })
1616
1620
  }
1617
1621
  ),
1618
1622
  markerMediaItems.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -1634,7 +1638,7 @@ function GeoMap({
1634
1638
  {
1635
1639
  name: "lucide:map-pin",
1636
1640
  className: "opacity-50",
1637
- size: 14
1641
+ size: 18
1638
1642
  }
1639
1643
  ),
1640
1644
  typeof selectedMarker.locationLine === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -1656,7 +1660,7 @@ function GeoMap({
1656
1660
  {
1657
1661
  name: "lucide:clock",
1658
1662
  className: "opacity-50",
1659
- size: 14
1663
+ size: 18
1660
1664
  }
1661
1665
  ),
1662
1666
  typeof selectedMarker.hoursLine === "string" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium", children: selectedMarker.hoursLine }) : selectedMarker.hoursLine
@@ -1684,7 +1688,7 @@ function GeoMap({
1684
1688
  "aria-label": "Close cluster details",
1685
1689
  className: "flex size-8 items-center justify-center rounded-full border border-border bg-card text-card-foreground transition hover:bg-muted hover:text-foreground absolute top-2 right-2 z-10",
1686
1690
  onClick: clearSelection,
1687
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", size: 16 })
1691
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", size: 20 })
1688
1692
  }
1689
1693
  ),
1690
1694
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-start justify-between gap-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
@@ -2070,6 +2074,23 @@ function PopoverContent({
2070
2074
  }
2071
2075
  ) });
2072
2076
  }
2077
+ function StarRating({
2078
+ rating,
2079
+ size = 18,
2080
+ className
2081
+ }) {
2082
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex items-center gap-0.5", className), children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsxRuntime.jsx(
2083
+ DynamicIcon,
2084
+ {
2085
+ name: "icon-park-solid/star",
2086
+ size,
2087
+ className: cn(
2088
+ star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
2089
+ )
2090
+ },
2091
+ star
2092
+ )) });
2093
+ }
2073
2094
  var BUTTON_SIZES = {
2074
2095
  sm: { buttonSize: "size-8", iconSize: 16 },
2075
2096
  md: { buttonSize: "size-10", iconSize: 20 },
@@ -2171,6 +2192,7 @@ var SocialLinkIcon = React8__namespace.forwardRef(
2171
2192
  iconClassName,
2172
2193
  className,
2173
2194
  iconNameOverride,
2195
+ iconOnly = false,
2174
2196
  ...pressableProps
2175
2197
  }, ref) => {
2176
2198
  const platform = usePlatformFromUrl.usePlatformFromUrl(href);
@@ -2183,6 +2205,21 @@ var SocialLinkIcon = React8__namespace.forwardRef(
2183
2205
  const accessibleLabel = React8__namespace.useMemo(() => {
2184
2206
  return label || platformName;
2185
2207
  }, [label, platformName]);
2208
+ const icon = React8__namespace.useMemo(() => {
2209
+ return /* @__PURE__ */ jsxRuntime.jsx(
2210
+ DynamicIcon,
2211
+ {
2212
+ name: iconName,
2213
+ size: iconSize,
2214
+ color: iconColor,
2215
+ className: iconClassName,
2216
+ alt: accessibleLabel
2217
+ }
2218
+ );
2219
+ }, [iconName, iconSize, iconColor, iconClassName, accessibleLabel]);
2220
+ if (iconOnly) {
2221
+ return icon;
2222
+ }
2186
2223
  return /* @__PURE__ */ jsxRuntime.jsx(
2187
2224
  Pressable,
2188
2225
  {
@@ -2194,16 +2231,7 @@ var SocialLinkIcon = React8__namespace.forwardRef(
2194
2231
  className
2195
2232
  ),
2196
2233
  ...pressableProps,
2197
- children: /* @__PURE__ */ jsxRuntime.jsx(
2198
- DynamicIcon,
2199
- {
2200
- name: iconName,
2201
- size: iconSize,
2202
- color: iconColor,
2203
- className: iconClassName,
2204
- alt: accessibleLabel
2205
- }
2206
- )
2234
+ children: icon
2207
2235
  }
2208
2236
  );
2209
2237
  }
@@ -19761,6 +19789,67 @@ function ContactHelpCenter({
19761
19789
  }
19762
19790
  );
19763
19791
  }
19792
+ var DIRECTION_STYLES = {
19793
+ "bottom-to-top": "bg-linear-to-t",
19794
+ "top-to-bottom": "bg-linear-to-b",
19795
+ "left-to-right": "bg-linear-to-r",
19796
+ "right-to-left": "bg-linear-to-l",
19797
+ "bottom-left-to-top-right": "bg-linear-to-tr",
19798
+ "bottom-right-to-top-left": "bg-linear-to-tl",
19799
+ "top-left-to-bottom-right": "bg-linear-to-br",
19800
+ "top-right-to-bottom-left": "bg-linear-to-bl"
19801
+ };
19802
+ var INTENSITY_STOPS = {
19803
+ low: "from-black/40 via-black/20 to-transparent",
19804
+ default: "from-black/70 via-black/35 to-transparent",
19805
+ high: "from-black/85 via-black/50 to-transparent",
19806
+ "very-high": "from-black/95 via-black/60 to-black/20"
19807
+ };
19808
+ var RADIAL_INTENSITY = {
19809
+ low: {
19810
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.40) 0%, rgba(0,0,0,0.20) 50%, transparent 100%)"
19811
+ },
19812
+ default: {
19813
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.70) 0%, rgba(0,0,0,0.35) 50%, transparent 100%)"
19814
+ },
19815
+ high: {
19816
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.50) 50%, transparent 100%)"
19817
+ },
19818
+ "very-high": {
19819
+ 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%)"
19820
+ }
19821
+ };
19822
+ function GradientOverlay({
19823
+ direction = "bottom-to-top",
19824
+ intensity = "default",
19825
+ className,
19826
+ style,
19827
+ ...props
19828
+ }) {
19829
+ if (direction === "radial-center") {
19830
+ return /* @__PURE__ */ jsxRuntime.jsx(
19831
+ "div",
19832
+ {
19833
+ className: cn("absolute inset-0", className),
19834
+ style: { ...RADIAL_INTENSITY[intensity], ...style },
19835
+ ...props
19836
+ }
19837
+ );
19838
+ }
19839
+ return /* @__PURE__ */ jsxRuntime.jsx(
19840
+ "div",
19841
+ {
19842
+ className: cn(
19843
+ "absolute inset-0",
19844
+ DIRECTION_STYLES[direction],
19845
+ INTENSITY_STOPS[intensity],
19846
+ className
19847
+ ),
19848
+ style,
19849
+ ...props
19850
+ }
19851
+ );
19852
+ }
19764
19853
  function CarouselAnimatedSections({
19765
19854
  sections,
19766
19855
  sectionsSlot,
@@ -19776,7 +19865,8 @@ function CarouselAnimatedSections({
19776
19865
  navigationClassName,
19777
19866
  arrowsClassName,
19778
19867
  counterClassName,
19779
- slideMediaBrightness = "50",
19868
+ slideMediaBrightness,
19869
+ slideMediaOverlayIntensity = "high",
19780
19870
  optixFlowConfig,
19781
19871
  background = "dark",
19782
19872
  spacing = "py-0",
@@ -19865,7 +19955,7 @@ function CarouselAnimatedSections({
19865
19955
  containerMaxWidth,
19866
19956
  containerClassName,
19867
19957
  children: [
19868
- sectionsSlot ? sectionsSlot : currentSection ? /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { initial: false, custom: direction, mode: "wait", children: /* @__PURE__ */ jsxRuntime.jsx(
19958
+ sectionsSlot ? sectionsSlot : currentSection ? /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { initial: false, custom: direction, mode: "wait", children: /* @__PURE__ */ jsxRuntime.jsxs(
19869
19959
  framerMotion.motion.div,
19870
19960
  {
19871
19961
  custom: direction,
@@ -19876,19 +19966,21 @@ function CarouselAnimatedSections({
19876
19966
  transition: { duration: 0.6, ease: [0.4, 0, 0.2, 1] },
19877
19967
  onAnimationComplete: () => setIsAnimating(false),
19878
19968
  className: cn("absolute inset-0", currentSection?.className),
19879
- children: /* @__PURE__ */ jsxRuntime.jsx(
19880
- img.Img,
19881
- {
19882
- src: currentSection?.image,
19883
- alt: typeof currentSection?.title === "string" ? currentSection?.title : `Section ${currentSection?.id}`,
19884
- className: cn(
19885
- "h-full w-full object-cover",
19886
- BRIGHTNESS_CLASS_MAP[slideMediaBrightness],
19887
- currentSection?.imageClassName
19888
- ),
19889
- optixFlowConfig
19890
- }
19891
- )
19969
+ children: [
19970
+ /* @__PURE__ */ jsxRuntime.jsx(
19971
+ img.Img,
19972
+ {
19973
+ src: currentSection?.image,
19974
+ alt: typeof currentSection?.title === "string" ? currentSection?.title : `Section ${currentSection?.id}`,
19975
+ className: cn(
19976
+ "h-full w-full object-cover",
19977
+ currentSection?.imageClassName
19978
+ ),
19979
+ optixFlowConfig
19980
+ }
19981
+ ),
19982
+ /* @__PURE__ */ jsxRuntime.jsx(GradientOverlay, { intensity: slideMediaOverlayIntensity })
19983
+ ]
19892
19984
  },
19893
19985
  currentIndex
19894
19986
  ) }) : null,
@@ -20853,7 +20945,8 @@ function CarouselGalleryThumbnails({
20853
20945
  spacing = "sm",
20854
20946
  pattern,
20855
20947
  patternOpacity,
20856
- slideMediaBrightness = "100"
20948
+ slideMediaBrightness,
20949
+ slideMediaOverlayIntensity = "default"
20857
20950
  }) {
20858
20951
  const [currentIndex, setCurrentIndex] = React8__namespace.useState(0);
20859
20952
  const prevSlide = React8__namespace.useCallback(() => {
@@ -20902,7 +20995,7 @@ function CarouselGalleryThumbnails({
20902
20995
  "relative aspect-video w-full overflow-hidden",
20903
20996
  slideClassName
20904
20997
  ),
20905
- children: imagesSlot ? imagesSlot : images?.map((image, index) => /* @__PURE__ */ jsxRuntime.jsx(
20998
+ children: imagesSlot ? imagesSlot : images?.map((image, index) => /* @__PURE__ */ jsxRuntime.jsxs(
20906
20999
  "div",
20907
21000
  {
20908
21001
  className: cn(
@@ -20910,19 +21003,21 @@ function CarouselGalleryThumbnails({
20910
21003
  index === currentIndex ? "translate-x-0 opacity-100" : index < currentIndex ? "-translate-x-full opacity-0" : "translate-x-full opacity-0",
20911
21004
  image.className
20912
21005
  ),
20913
- children: /* @__PURE__ */ jsxRuntime.jsx(
20914
- img.Img,
20915
- {
20916
- src: image.src,
20917
- alt: typeof image.alt === "string" ? image.alt : `Image ${index + 1}`,
20918
- className: cn(
20919
- "h-full w-full object-cover",
20920
- BRIGHTNESS_CLASS_MAP[slideMediaBrightness],
20921
- image.imageClassName
20922
- ),
20923
- optixFlowConfig
20924
- }
20925
- )
21006
+ children: [
21007
+ /* @__PURE__ */ jsxRuntime.jsx(
21008
+ img.Img,
21009
+ {
21010
+ src: image.src,
21011
+ alt: typeof image.alt === "string" ? image.alt : `Image ${index + 1}`,
21012
+ className: cn(
21013
+ "h-full w-full object-cover",
21014
+ image.imageClassName
21015
+ ),
21016
+ optixFlowConfig
21017
+ }
21018
+ ),
21019
+ /* @__PURE__ */ jsxRuntime.jsx(GradientOverlay, { intensity: slideMediaOverlayIntensity })
21020
+ ]
20926
21021
  },
20927
21022
  `slide-${index}`
20928
21023
  ))
@@ -21739,7 +21834,8 @@ function CarouselPortfolioHero({
21739
21834
  spacing = "none",
21740
21835
  pattern,
21741
21836
  patternOpacity,
21742
- slideMediaBrightness = "50"
21837
+ slideMediaBrightness,
21838
+ slideMediaOverlayIntensity = "high"
21743
21839
  }) {
21744
21840
  const [currentIndex, setCurrentIndex] = React8__namespace.useState(0);
21745
21841
  const intervalRef = React8__namespace.useRef(null);
@@ -21780,7 +21876,7 @@ function CarouselPortfolioHero({
21780
21876
  patternOpacity,
21781
21877
  containerClassName,
21782
21878
  children: [
21783
- slidesSlot ? slidesSlot : slides?.map((slide, index) => /* @__PURE__ */ jsxRuntime.jsx(
21879
+ slidesSlot ? slidesSlot : slides?.map((slide, index) => /* @__PURE__ */ jsxRuntime.jsxs(
21784
21880
  "div",
21785
21881
  {
21786
21882
  className: cn(
@@ -21788,19 +21884,21 @@ function CarouselPortfolioHero({
21788
21884
  index === currentIndex ? "opacity-100" : "opacity-0",
21789
21885
  slide.className
21790
21886
  ),
21791
- children: /* @__PURE__ */ jsxRuntime.jsx(
21792
- img.Img,
21793
- {
21794
- src: slide.image,
21795
- alt: typeof slide.title === "string" ? slide.title : `Slide ${index + 1}`,
21796
- className: cn(
21797
- "h-full w-full object-cover",
21798
- BRIGHTNESS_CLASS_MAP[slideMediaBrightness],
21799
- slide.imageClassName
21800
- ),
21801
- optixFlowConfig
21802
- }
21803
- )
21887
+ children: [
21888
+ /* @__PURE__ */ jsxRuntime.jsx(
21889
+ img.Img,
21890
+ {
21891
+ src: slide.image,
21892
+ alt: typeof slide.title === "string" ? slide.title : `Slide ${index + 1}`,
21893
+ className: cn(
21894
+ "h-full w-full object-cover",
21895
+ slide.imageClassName
21896
+ ),
21897
+ optixFlowConfig
21898
+ }
21899
+ ),
21900
+ /* @__PURE__ */ jsxRuntime.jsx(GradientOverlay, { intensity: slideMediaOverlayIntensity })
21901
+ ]
21804
21902
  },
21805
21903
  slide.id
21806
21904
  )),
@@ -33577,7 +33675,8 @@ function CarouselIconSidebar({
33577
33675
  src: image.src,
33578
33676
  alt: typeof image.title === "string" ? image.title : image.alt || "Carousel image",
33579
33677
  className: cn(
33580
- "h-full w-full rounded-lg object-cover cursor-pointer",
33678
+ "aspect-4/3",
33679
+ "h-full w-full object-cover cursor-pointer aspect-4/3",
33581
33680
  imageClassName
33582
33681
  ),
33583
33682
  loading: "lazy",
@@ -33637,13 +33736,13 @@ function CarouselIconSidebar({
33637
33736
  /* @__PURE__ */ jsxRuntime.jsx(Carousel, { setApi, className: cn("w-full", carouselClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 md:gap-6 md:grid-cols-5", children: [
33638
33737
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "md:col-span-2", children: sidebarContent }),
33639
33738
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full md:col-span-3", children: /* @__PURE__ */ jsxRuntime.jsx(
33640
- CarouselContent,
33739
+ "div",
33641
33740
  {
33642
33741
  className: cn(
33643
- "overflow-hidden rounded-2xl shadow-lg h-full",
33742
+ "overflow-hidden rounded-2xl shadow-lg",
33644
33743
  carouselContentClassName
33645
33744
  ),
33646
- children: itemsContent
33745
+ children: /* @__PURE__ */ jsxRuntime.jsx(CarouselContent, { children: itemsContent })
33647
33746
  }
33648
33747
  ) })
33649
33748
  ] }) }),
@@ -43849,19 +43948,6 @@ function CaseStudiesTestimonialStats({
43849
43948
  }
43850
43949
  );
43851
43950
  }
43852
- function StarRating({ rating, size = 16 }) {
43853
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-0.5", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsxRuntime.jsx(
43854
- DynamicIcon,
43855
- {
43856
- name: "lucide/star",
43857
- size,
43858
- className: cn(
43859
- star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
43860
- )
43861
- },
43862
- star
43863
- )) });
43864
- }
43865
43951
  function TestimonialsListVerified({
43866
43952
  reviews,
43867
43953
  reviewsSlot,
@@ -43874,7 +43960,8 @@ function TestimonialsListVerified({
43874
43960
  contentClassName,
43875
43961
  authorClassName,
43876
43962
  background,
43877
- spacing,
43963
+ spacing = "lg",
43964
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
43878
43965
  pattern,
43879
43966
  patternOpacity
43880
43967
  }) {
@@ -43893,35 +43980,49 @@ function TestimonialsListVerified({
43893
43980
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0", children: reviews.map((review, index) => {
43894
43981
  const authorName = getAuthorName(review);
43895
43982
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: reviewClassName, children: [
43896
- index > 0 && /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "my-6" }),
43897
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("space-y-3", contentClassName), children: [
43898
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
43899
- /* @__PURE__ */ jsxRuntime.jsx(StarRating, { rating: review.rating, size: 16 }),
43900
- review.title && (typeof review.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mt-2 font-medium", children: review.title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2", children: review.title }))
43983
+ index > 0 && /* @__PURE__ */ jsxRuntime.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" }),
43984
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("space-y-6 md:space-y-12", contentClassName), children: [
43985
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
43986
+ /* @__PURE__ */ jsxRuntime.jsx(StarRating, { rating: review.rating, size: 22 }),
43987
+ review.title && (typeof review.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-medium", children: review.title }) : review.title)
43901
43988
  ] }),
43902
- review.content && (typeof review.content === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm leading-relaxed text-muted-foreground", children: review.content }) : review.content),
43903
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center gap-3", authorClassName), children: [
43904
- /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-8", children: [
43905
- /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
43906
- /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-xs", children: getInitials(authorName) })
43907
- ] }),
43908
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
43909
- review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: review.author }) : review.author),
43910
- review.verified && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1 text-emerald-600", children: [
43911
- /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/badge-check", size: 16 }),
43912
- verifiedPurchaseLabel && (typeof verifiedPurchaseLabel === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs", children: verifiedPurchaseLabel }) : verifiedPurchaseLabel),
43913
- !verifiedPurchaseLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs", children: "Verified Purchase" })
43914
- ] }),
43915
- review.date && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
43916
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "\xB7" }),
43917
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: review.date })
43918
- ] })
43919
- ] })
43989
+ review.content && (typeof review.content === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base md:text-lg leading-relaxed font-light", children: review.content }) : review.content),
43990
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center justify-between w-full"), children: [
43991
+ /* @__PURE__ */ jsxRuntime.jsxs(
43992
+ "div",
43993
+ {
43994
+ className: cn("flex items-center gap-5", authorClassName),
43995
+ children: [
43996
+ /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-12 ring-4 ring-primary shadow-lg", children: [
43997
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
43998
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-md", children: getInitials(authorName) })
43999
+ ] }),
44000
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 text-base flex-col items-start", children: [
44001
+ review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: review.author }) : review.author),
44002
+ review.verified && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1", children: [
44003
+ /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/badge-check", size: 18 }),
44004
+ verifiedPurchaseLabel && (typeof verifiedPurchaseLabel === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: verifiedPurchaseLabel }) : verifiedPurchaseLabel),
44005
+ !verifiedPurchaseLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: "Verified Purchase" })
44006
+ ] })
44007
+ ] })
44008
+ ]
44009
+ }
44010
+ ),
44011
+ review.date && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "relative", children: review.date })
43920
44012
  ] })
43921
44013
  ] })
43922
44014
  ] }, index);
43923
44015
  }) });
43924
- }, [reviewsSlot, reviews, reviewClassName, contentClassName, authorClassName, verifiedPurchaseLabel, getAuthorName, getInitials]);
44016
+ }, [
44017
+ reviewsSlot,
44018
+ reviews,
44019
+ reviewClassName,
44020
+ contentClassName,
44021
+ authorClassName,
44022
+ verifiedPurchaseLabel,
44023
+ getAuthorName,
44024
+ getInitials
44025
+ ]);
43925
44026
  return /* @__PURE__ */ jsxRuntime.jsx(
43926
44027
  Section,
43927
44028
  {
@@ -43930,21 +44031,21 @@ function TestimonialsListVerified({
43930
44031
  pattern,
43931
44032
  patternOpacity,
43932
44033
  className,
43933
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-3xl", children: [
43934
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mb-8", headerClassName), children: [
44034
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-full md:max-w-3xl", children: [
44035
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mb-12 md:mb-24 space-y-6", headerClassName), children: [
43935
44036
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
43936
44037
  "h2",
43937
44038
  {
43938
44039
  className: cn(
43939
- "text-2xl font-semibold tracking-tight md:text-3xl",
44040
+ "text-2xl font-semibold tracking-tight md:text-3xl lg:text-4xl",
43940
44041
  headingClassName
43941
44042
  ),
43942
44043
  children: heading
43943
44044
  }
43944
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
44045
+ ) : heading),
43945
44046
  totalReviews > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex items-center gap-3", children: [
43946
- /* @__PURE__ */ jsxRuntime.jsx(StarRating, { rating: Math.round(averageRating), size: 20 }),
43947
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-muted-foreground", children: [
44047
+ /* @__PURE__ */ jsxRuntime.jsx(StarRating, { rating: Math.round(averageRating), size: 22 }),
44048
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm", children: [
43948
44049
  averageRating.toFixed(1),
43949
44050
  " out of 5 \xB7 ",
43950
44051
  totalReviews,
@@ -43957,23 +44058,11 @@ function TestimonialsListVerified({
43957
44058
  }
43958
44059
  );
43959
44060
  }
43960
- function StarRating2({ rating, size = 16 }) {
43961
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-0.5", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsxRuntime.jsx(
43962
- DynamicIcon,
43963
- {
43964
- name: "lucide/star",
43965
- size,
43966
- className: cn(
43967
- star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
43968
- )
43969
- },
43970
- star
43971
- )) });
43972
- }
43973
44061
  function TestimonialsImagesHelpful({
43974
44062
  reviews,
43975
44063
  reviewsSlot,
43976
44064
  heading,
44065
+ verifiedPurchaseLabel,
43977
44066
  writeReviewLabel,
43978
44067
  reportButtonLabel,
43979
44068
  className,
@@ -43985,12 +44074,16 @@ function TestimonialsImagesHelpful({
43985
44074
  imagesClassName,
43986
44075
  onWriteReview,
43987
44076
  background,
43988
- spacing = "py-6 md:py-32",
44077
+ spacing = "lg",
44078
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
43989
44079
  pattern,
43990
44080
  patternOpacity,
43991
44081
  optixFlowConfig
43992
44082
  }) {
43993
44083
  const [helpfulClicked, setHelpfulClicked] = React8.useState(/* @__PURE__ */ new Set());
44084
+ const [lightboxOpen, setLightboxOpen] = React8.useState(false);
44085
+ const [lightboxItems, setLightboxItems] = React8.useState([]);
44086
+ const [lightboxIndex, setLightboxIndex] = React8.useState(0);
43994
44087
  const totalReviews = reviews?.length ?? 0;
43995
44088
  const averageRating = totalReviews > 0 ? (reviews?.reduce((sum, review) => sum + review.rating, 0) ?? 0) / totalReviews : 0;
43996
44089
  const handleHelpful = React8.useCallback((reviewIndex) => {
@@ -44004,6 +44097,25 @@ function TestimonialsImagesHelpful({
44004
44097
  return newSet;
44005
44098
  });
44006
44099
  }, []);
44100
+ const handleImageClick = React8.useCallback(
44101
+ (reviewImages, imageIndex) => {
44102
+ const items = reviewImages.map((src, i) => ({
44103
+ id: `review-image-${i}`,
44104
+ type: "image",
44105
+ src,
44106
+ alt: `Review image ${i + 1}`,
44107
+ download: true,
44108
+ share: true
44109
+ }));
44110
+ setLightboxItems(items);
44111
+ setLightboxIndex(imageIndex);
44112
+ setLightboxOpen(true);
44113
+ },
44114
+ []
44115
+ );
44116
+ const handleLightboxClose = React8.useCallback(() => {
44117
+ setLightboxOpen(false);
44118
+ }, []);
44007
44119
  const getAuthorName = React8.useCallback((review) => {
44008
44120
  if (typeof review.author === "string") return review.author;
44009
44121
  return "";
@@ -44017,54 +44129,28 @@ function TestimonialsImagesHelpful({
44017
44129
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-0", children: reviews.map((review, index) => {
44018
44130
  const authorName = getAuthorName(review);
44019
44131
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: reviewClassName, children: [
44020
- index > 0 && /* @__PURE__ */ jsxRuntime.jsx(Separator, { className: "my-6" }),
44021
- /* @__PURE__ */ jsxRuntime.jsx(Card, { className: "border-0 p-0 shadow-none", children: /* @__PURE__ */ jsxRuntime.jsxs(CardContent, { className: cn("space-y-4 p-0", contentClassName), children: [
44022
- /* @__PURE__ */ jsxRuntime.jsxs(
44023
- "div",
44024
- {
44025
- className: cn(
44026
- "flex items-start justify-between gap-4",
44027
- authorClassName
44028
- ),
44029
- children: [
44030
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
44031
- /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-10", children: [
44032
- /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
44033
- /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { children: getInitials(authorName) })
44034
- ] }),
44035
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
44036
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
44037
- review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: review.author }) : review.author),
44038
- review.verified && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex items-center gap-1 text-emerald-600", children: /* @__PURE__ */ jsxRuntime.jsx(
44039
- DynamicIcon,
44040
- {
44041
- name: "lucide/badge-check",
44042
- size: 16
44043
- }
44044
- ) })
44045
- ] }),
44046
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
44047
- review.date && /* @__PURE__ */ jsxRuntime.jsx("span", { children: review.date }),
44048
- review.variant && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
44049
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\xB7" }),
44050
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: review.variant })
44051
- ] })
44052
- ] })
44053
- ] })
44054
- ] }),
44055
- /* @__PURE__ */ jsxRuntime.jsx(StarRating2, { rating: review.rating, size: 16 })
44056
- ]
44057
- }
44058
- ),
44059
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
44060
- review.title && (typeof review.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-medium", children: review.title }) : review.title),
44061
- review.content && (typeof review.content === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm leading-relaxed text-muted-foreground", children: review.content }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-2", children: review.content }))
44132
+ index > 0 && /* @__PURE__ */ jsxRuntime.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" }),
44133
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("space-y-6 md:space-y-12", contentClassName), children: [
44134
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
44135
+ /* @__PURE__ */ jsxRuntime.jsx(StarRating, { rating: review.rating, size: 22 }),
44136
+ review.title && (typeof review.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-medium", children: review.title }) : review.title)
44062
44137
  ] }),
44063
- review.images && review.images.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex gap-2", imagesClassName), children: review.images.map((image, imgIndex) => /* @__PURE__ */ jsxRuntime.jsx(
44138
+ review.content && (typeof review.content === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base md:text-lg leading-relaxed font-light", children: review.content }) : review.content),
44139
+ review.images && review.images.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex gap-3", imagesClassName), children: review.images.map((image, imgIndex) => /* @__PURE__ */ jsxRuntime.jsx(
44064
44140
  "div",
44065
44141
  {
44066
- className: "size-20 overflow-hidden rounded-lg sm:size-24",
44067
- children: /* @__PURE__ */ jsxRuntime.jsx(AspectRatio, { ratio: 1, children: /* @__PURE__ */ jsxRuntime.jsx(
44142
+ 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",
44143
+ onClick: () => handleImageClick(review.images, imgIndex),
44144
+ role: "button",
44145
+ tabIndex: 0,
44146
+ onKeyDown: (e) => {
44147
+ if (e.key === "Enter" || e.key === " ") {
44148
+ e.preventDefault();
44149
+ handleImageClick(review.images, imgIndex);
44150
+ }
44151
+ },
44152
+ "aria-label": `View review image ${imgIndex + 1} in lightbox`,
44153
+ children: /* @__PURE__ */ jsxRuntime.jsx(
44068
44154
  img.Img,
44069
44155
  {
44070
44156
  src: image,
@@ -44072,54 +44158,85 @@ function TestimonialsImagesHelpful({
44072
44158
  className: "size-full object-cover",
44073
44159
  optixFlowConfig
44074
44160
  }
44075
- ) })
44161
+ )
44076
44162
  },
44077
44163
  imgIndex
44078
44164
  )) }),
44079
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
44165
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center justify-between w-full"), children: [
44080
44166
  /* @__PURE__ */ jsxRuntime.jsxs(
44081
- Pressable,
44167
+ "div",
44082
44168
  {
44083
- asButton: true,
44084
- variant: "ghost",
44085
- size: "sm",
44086
- className: cn(
44087
- "h-8 gap-1.5 text-muted-foreground",
44088
- helpfulClicked.has(index) && "text-foreground"
44089
- ),
44090
- onClick: () => handleHelpful(index),
44169
+ className: cn("flex items-center gap-5", authorClassName),
44091
44170
  children: [
44092
- /* @__PURE__ */ jsxRuntime.jsx(
44093
- DynamicIcon,
44094
- {
44095
- name: "lucide/thumbs-up",
44096
- size: 16,
44097
- className: cn(
44098
- helpfulClicked.has(index) && "fill-current"
44099
- )
44100
- }
44101
- ),
44102
- "Helpful",
44103
- review.helpful !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
44104
- "(",
44105
- review.helpful + (helpfulClicked.has(index) ? 1 : 0),
44106
- ")"
44171
+ /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-12 ring-4 ring-primary shadow-lg", children: [
44172
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
44173
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-md", children: getInitials(authorName) })
44174
+ ] }),
44175
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-start gap-0", children: [
44176
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
44177
+ review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: review.author }) : review.author),
44178
+ review.verified && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1", children: [
44179
+ /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/badge-check", size: 18 }),
44180
+ verifiedPurchaseLabel && (typeof verifiedPurchaseLabel === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: verifiedPurchaseLabel }) : verifiedPurchaseLabel),
44181
+ !verifiedPurchaseLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: "Verified Purchase" })
44182
+ ] })
44183
+ ] }),
44184
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
44185
+ review.date && /* @__PURE__ */ jsxRuntime.jsx("span", { children: review.date }),
44186
+ review.variant && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
44187
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\xB7" }),
44188
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: review.variant })
44189
+ ] })
44190
+ ] })
44107
44191
  ] })
44108
44192
  ]
44109
44193
  }
44110
44194
  ),
44111
- /* @__PURE__ */ jsxRuntime.jsx(
44112
- Pressable,
44113
- {
44114
- asButton: true,
44115
- variant: "ghost",
44116
- size: "sm",
44117
- className: "h-8 text-muted-foreground",
44118
- children: reportButtonLabel ?? "Report"
44119
- }
44120
- )
44195
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
44196
+ /* @__PURE__ */ jsxRuntime.jsxs(
44197
+ Pressable,
44198
+ {
44199
+ asButton: true,
44200
+ variant: "ghost",
44201
+ size: "sm",
44202
+ className: cn(
44203
+ "h-8 gap-1.5",
44204
+ helpfulClicked.has(index) ? "text-foreground" : "text-muted-foreground"
44205
+ ),
44206
+ onClick: () => handleHelpful(index),
44207
+ children: [
44208
+ /* @__PURE__ */ jsxRuntime.jsx(
44209
+ DynamicIcon,
44210
+ {
44211
+ name: "lucide/thumbs-up",
44212
+ size: 16,
44213
+ className: cn(
44214
+ helpfulClicked.has(index) && "fill-current"
44215
+ )
44216
+ }
44217
+ ),
44218
+ "Helpful",
44219
+ review.helpful !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
44220
+ "(",
44221
+ review.helpful + (helpfulClicked.has(index) ? 1 : 0),
44222
+ ")"
44223
+ ] })
44224
+ ]
44225
+ }
44226
+ ),
44227
+ /* @__PURE__ */ jsxRuntime.jsx(
44228
+ Pressable,
44229
+ {
44230
+ asButton: true,
44231
+ variant: "ghost",
44232
+ size: "sm",
44233
+ className: "h-8 text-muted-foreground",
44234
+ children: reportButtonLabel ?? "Report"
44235
+ }
44236
+ )
44237
+ ] })
44121
44238
  ] })
44122
- ] }) })
44239
+ ] })
44123
44240
  ] }, index);
44124
44241
  }) });
44125
44242
  }, [
@@ -44132,11 +44249,13 @@ function TestimonialsImagesHelpful({
44132
44249
  helpfulClicked,
44133
44250
  optixFlowConfig,
44134
44251
  reportButtonLabel,
44252
+ verifiedPurchaseLabel,
44135
44253
  getAuthorName,
44136
44254
  getInitials,
44137
- handleHelpful
44255
+ handleHelpful,
44256
+ handleImageClick
44138
44257
  ]);
44139
- return /* @__PURE__ */ jsxRuntime.jsx(
44258
+ return /* @__PURE__ */ jsxRuntime.jsxs(
44140
44259
  Section,
44141
44260
  {
44142
44261
  background,
@@ -44144,42 +44263,57 @@ function TestimonialsImagesHelpful({
44144
44263
  pattern,
44145
44264
  patternOpacity,
44146
44265
  className,
44147
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-3xl", children: [
44148
- /* @__PURE__ */ jsxRuntime.jsxs(
44149
- "div",
44150
- {
44151
- className: cn(
44152
- "mb-8 flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between",
44153
- headerClassName
44154
- ),
44155
- children: [
44156
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
44157
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
44158
- "h2",
44159
- {
44160
- className: cn(
44161
- "text-2xl font-semibold tracking-tight md:text-3xl",
44162
- headingClassName
44163
- ),
44164
- children: heading
44165
- }
44166
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
44167
- totalReviews > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex items-center gap-2", children: [
44168
- /* @__PURE__ */ jsxRuntime.jsx(StarRating2, { rating: Math.round(averageRating), size: 20 }),
44169
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg font-semibold", children: averageRating.toFixed(1) }),
44170
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm text-muted-foreground", children: [
44171
- "(",
44172
- totalReviews,
44173
- " reviews)"
44174
- ] })
44175
- ] })
44176
- ] }),
44266
+ containerClassName,
44267
+ children: [
44268
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-full md:max-w-3xl", children: [
44269
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mb-12 md:mb-24 space-y-6", headerClassName), children: [
44270
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 sm:flex-row sm:items-end sm:justify-between", children: [
44271
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
44272
+ "h2",
44273
+ {
44274
+ className: cn(
44275
+ "text-2xl font-semibold tracking-tight md:text-3xl lg:text-4xl",
44276
+ headingClassName
44277
+ ),
44278
+ children: heading
44279
+ }
44280
+ ) : heading),
44177
44281
  (writeReviewLabel || onWriteReview) && /* @__PURE__ */ jsxRuntime.jsx(Pressable, { asButton: true, variant: "outline", onClick: onWriteReview, children: writeReviewLabel })
44178
- ]
44282
+ ] }),
44283
+ totalReviews > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex items-center gap-3", children: [
44284
+ /* @__PURE__ */ jsxRuntime.jsx(StarRating, { rating: Math.round(averageRating), size: 22 }),
44285
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-sm", children: [
44286
+ averageRating.toFixed(1),
44287
+ " out of 5 \xB7 ",
44288
+ totalReviews,
44289
+ " reviews"
44290
+ ] })
44291
+ ] })
44292
+ ] }),
44293
+ renderedReviews
44294
+ ] }),
44295
+ lightboxOpen && /* @__PURE__ */ jsxRuntime.jsx(
44296
+ lightbox.Lightbox,
44297
+ {
44298
+ items: lightboxItems,
44299
+ initialIndex: lightboxIndex,
44300
+ layout: "horizontal",
44301
+ controls: {
44302
+ navigation: true,
44303
+ thumbnails: true,
44304
+ download: true,
44305
+ share: true,
44306
+ fullscreen: true,
44307
+ captions: true,
44308
+ counter: true
44309
+ },
44310
+ onClose: handleLightboxClose,
44311
+ enableKeyboardShortcuts: true,
44312
+ closeOnEscape: true,
44313
+ closeOnBackdropClick: true
44179
44314
  }
44180
- ),
44181
- renderedReviews
44182
- ] })
44315
+ )
44316
+ ]
44183
44317
  }
44184
44318
  );
44185
44319
  }
@@ -44323,7 +44457,7 @@ function TestimonialsBentoGrid({
44323
44457
  ] }),
44324
44458
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-0 leading-tight", children: [
44325
44459
  testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: testimonial.author }) : testimonial.author),
44326
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: testimonial.role }) : testimonial.role),
44460
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs", children: testimonial.role }) : testimonial.role),
44327
44461
  testimonial.linkConfig?.href && /* @__PURE__ */ jsxRuntime.jsx(
44328
44462
  Pressable,
44329
44463
  {
@@ -44438,7 +44572,7 @@ function TestimonialsTwitterCards({
44438
44572
  "div",
44439
44573
  {
44440
44574
  className: cn(
44441
- "grid gap-4 md:gap-6 lg:gap-8 md:grid-cols-2 lg:grid-cols-3",
44575
+ "grid gap-6 lg:gap-8 md:grid-cols-2 lg:grid-cols-3",
44442
44576
  gridClassName
44443
44577
  ),
44444
44578
  children: testimonials.map((testimonial, index) => {
@@ -44491,7 +44625,8 @@ function TestimonialsTwitterCards({
44491
44625
  SocialLinkIcon,
44492
44626
  {
44493
44627
  href: testimonial.linkConfig.href,
44494
- iconSize: 24
44628
+ iconSize: 24,
44629
+ iconOnly: true
44495
44630
  }
44496
44631
  )
44497
44632
  ]
@@ -44572,6 +44707,7 @@ function TestimonialsCarouselImage({
44572
44707
  className,
44573
44708
  contentClassName,
44574
44709
  quoteIconClassName,
44710
+ logoClassName,
44575
44711
  quoteClassName,
44576
44712
  authorClassName,
44577
44713
  navigationClassName,
@@ -44579,7 +44715,7 @@ function TestimonialsCarouselImage({
44579
44715
  dotsClassName,
44580
44716
  optixFlowConfig,
44581
44717
  background,
44582
- containerClassName = "mx-0 w-screen px-0 sm:px-0 lg:px-0 max-w-screen relative z-10",
44718
+ containerClassName = "mx-0 w-screen px-0 sm:px-0 lg:px-0 max-w-screen relative z-10 h-full",
44583
44719
  spacing = "none",
44584
44720
  pattern,
44585
44721
  patternOpacity
@@ -44637,7 +44773,18 @@ function TestimonialsCarouselImage({
44637
44773
  contentClassName
44638
44774
  ),
44639
44775
  children: [
44640
- /* @__PURE__ */ jsxRuntime.jsx(
44776
+ current?.logoSrc ? /* @__PURE__ */ jsxRuntime.jsx(
44777
+ img.Img,
44778
+ {
44779
+ src: current.logoSrc,
44780
+ alt: typeof current.company === "string" ? `${current.company} logo` : typeof current.author === "string" ? `${current.author} company logo` : "Company logo",
44781
+ className: cn(
44782
+ "mx-auto mb-6 max-h-12 max-w-32 object-contain md:max-h-16 md:max-w-48",
44783
+ logoClassName
44784
+ ),
44785
+ optixFlowConfig
44786
+ }
44787
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
44641
44788
  DynamicIcon,
44642
44789
  {
44643
44790
  name: "mdi/comment-quote-outline",
@@ -44695,6 +44842,8 @@ function TestimonialsCarouselImage({
44695
44842
  testimonialsSlot,
44696
44843
  contentClassName,
44697
44844
  quoteIconClassName,
44845
+ logoClassName,
44846
+ optixFlowConfig,
44698
44847
  current,
44699
44848
  quoteClassName,
44700
44849
  authorClassName
@@ -44895,7 +45044,7 @@ function TestimonialsCenteredAvatars({
44895
45044
  "div",
44896
45045
  {
44897
45046
  className: cn(
44898
- "mx-auto max-w-full md:max-w-md text-center flex flex-col items-center gap-6",
45047
+ "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",
44899
45048
  contentClassName
44900
45049
  ),
44901
45050
  children: [
@@ -45051,19 +45200,6 @@ function TestimonialsCompanyLogo({
45051
45200
  }
45052
45201
  );
45053
45202
  }
45054
- function StarRating3({ rating, size = 16 }) {
45055
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-0.5", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsxRuntime.jsx(
45056
- DynamicIcon,
45057
- {
45058
- name: "lucide/star",
45059
- size,
45060
- className: cn(
45061
- star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
45062
- )
45063
- },
45064
- star
45065
- )) });
45066
- }
45067
45203
  function TestimonialsGridAddReview({
45068
45204
  reviews,
45069
45205
  reviewsSlot,
@@ -45110,27 +45246,33 @@ function TestimonialsGridAddReview({
45110
45246
  addReviewCardClassName
45111
45247
  ),
45112
45248
  onClick: onAddReview,
45113
- children: /* @__PURE__ */ jsxRuntime.jsxs(CardContent, { className: cn(
45114
- "flex flex-col items-center gap-3 py-12 text-center",
45115
- getNestedCardTextColor(background)
45116
- ), children: [
45117
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(
45118
- DynamicIcon,
45119
- {
45120
- name: "lucide/plus",
45121
- size: 24,
45122
- className: "text-primary"
45123
- }
45124
- ) }),
45125
- addReviewText && (typeof addReviewText === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-medium", children: addReviewText }) : addReviewText),
45126
- addReviewSubtext && (typeof addReviewSubtext === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: addReviewSubtext }) : addReviewSubtext)
45127
- ] })
45249
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
45250
+ CardContent,
45251
+ {
45252
+ className: cn(
45253
+ "flex flex-col items-center gap-3 py-12 text-center",
45254
+ getNestedCardTextColor(background)
45255
+ ),
45256
+ children: [
45257
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(
45258
+ DynamicIcon,
45259
+ {
45260
+ name: "lucide/plus",
45261
+ size: 24,
45262
+ className: "text-primary"
45263
+ }
45264
+ ) }),
45265
+ addReviewText && (typeof addReviewText === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-medium", children: addReviewText }) : addReviewText),
45266
+ addReviewSubtext && (typeof addReviewSubtext === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: addReviewSubtext }) : addReviewSubtext)
45267
+ ]
45268
+ }
45269
+ )
45128
45270
  }
45129
45271
  ),
45130
45272
  reviews?.map((review, index) => {
45131
45273
  const authorName = getAuthorName(review);
45132
45274
  return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cardClassName, children: /* @__PURE__ */ jsxRuntime.jsxs(CardContent, { className: "space-y-4 p-6", children: [
45133
- /* @__PURE__ */ jsxRuntime.jsx(StarRating3, { rating: review.rating }),
45275
+ /* @__PURE__ */ jsxRuntime.jsx(StarRating, { rating: review.rating }),
45134
45276
  review.content && (typeof review.content === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm leading-relaxed", children: review.content }) : review.content),
45135
45277
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center gap-3", authorClassName), children: [
45136
45278
  /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-8", children: [
@@ -45144,7 +45286,19 @@ function TestimonialsGridAddReview({
45144
45286
  ]
45145
45287
  }
45146
45288
  );
45147
- }, [reviewsSlot, gridClassName, addReviewCardClassName, onAddReview, addReviewText, addReviewSubtext, reviews, cardClassName, authorClassName, getAuthorName, getInitials]);
45289
+ }, [
45290
+ reviewsSlot,
45291
+ gridClassName,
45292
+ addReviewCardClassName,
45293
+ onAddReview,
45294
+ addReviewText,
45295
+ addReviewSubtext,
45296
+ reviews,
45297
+ cardClassName,
45298
+ authorClassName,
45299
+ getAuthorName,
45300
+ getInitials
45301
+ ]);
45148
45302
  return /* @__PURE__ */ jsxRuntime.jsxs(
45149
45303
  Section,
45150
45304
  {
@@ -45250,10 +45404,18 @@ function TestimonialsMarquee({
45250
45404
  const authorName = getAuthorName(testimonial);
45251
45405
  const avatarSrc = getAvatarSrc(testimonial);
45252
45406
  return /* @__PURE__ */ jsxRuntime.jsx(
45253
- Card,
45407
+ Pressable,
45254
45408
  {
45255
- className: cn("w-80 shrink-0", cardClassName),
45256
- children: /* @__PURE__ */ jsxRuntime.jsxs(CardContent, { className: "p-6", children: [
45409
+ href: testimonial?.linkConfig?.href,
45410
+ className: cn(
45411
+ "bg-card text-card-foreground",
45412
+ "rounded-2xl border shadow-xl",
45413
+ "cursor-pointer transition-all duration-500",
45414
+ "hover:bg-primary hover:text-primary-foreground",
45415
+ "flex flex-col gap-6 w-80 shrink-0",
45416
+ cardClassName
45417
+ ),
45418
+ children: /* @__PURE__ */ jsxRuntime.jsxs(CardContent, { className: "p-6 h-full flex flex-col justify-between gap-12", children: [
45257
45419
  testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsxs(
45258
45420
  "p",
45259
45421
  {
@@ -45271,15 +45433,15 @@ function TestimonialsMarquee({
45271
45433
  /* @__PURE__ */ jsxRuntime.jsxs(
45272
45434
  "div",
45273
45435
  {
45274
- className: cn("flex items-center gap-3", authorClassName),
45436
+ className: cn("flex items-center gap-4", authorClassName),
45275
45437
  children: [
45276
- /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-9", children: [
45438
+ /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "relative flex shrink-0 overflow-hidden rounded-full size-10 ring-4 ring-primary shadow-lg", children: [
45277
45439
  /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
45278
45440
  /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-xs", children: getInitials(authorName) })
45279
45441
  ] }),
45280
45442
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45281
- testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: testimonial.author }) : testimonial.author),
45282
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs", children: testimonial.role }) : testimonial.role)
45443
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-medium", children: testimonial.author }) : testimonial.author),
45444
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm", children: testimonial.role }) : testimonial.role)
45283
45445
  ] })
45284
45446
  ]
45285
45447
  }
@@ -45317,18 +45479,18 @@ function TestimonialsMarquee({
45317
45479
  className: cn("overflow-hidden", className),
45318
45480
  containerClassName,
45319
45481
  children: [
45320
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mb-12", headerClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-2xl text-center", children: [
45482
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mb-12", headerClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-full md:max-w-2xl text-center space-y-2", children: [
45321
45483
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
45322
45484
  "h2",
45323
45485
  {
45324
45486
  className: cn(
45325
- "text-3xl font-semibold tracking-tight md:text-4xl",
45487
+ "text-3xl font-semibold tracking-tight md:text-4xl lg:text-6xl text-pretty",
45326
45488
  headingClassName
45327
45489
  ),
45328
45490
  children: heading
45329
45491
  }
45330
45492
  ) : heading),
45331
- description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-4 text-lg", descriptionClassName), children: description }) : description)
45493
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-lg text-balance", descriptionClassName), children: description }) : description)
45332
45494
  ] }) }),
45333
45495
  renderedTestimonials,
45334
45496
  /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
@@ -45409,7 +45571,7 @@ function TestimonialsSimpleGrid({
45409
45571
  "bg-card text-card-foreground",
45410
45572
  "flex flex-col gap-6",
45411
45573
  testimonial.linkConfig?.href ? "cursor-pointer hover:bg-black hover:text-white transition-all duration-500" : "",
45412
- "rounded-2xl py-6 shadow-xl group",
45574
+ "rounded-2xl py-0 shadow-xl group",
45413
45575
  "ring-4 ring-ring",
45414
45576
  cardClassName
45415
45577
  ),
@@ -45417,7 +45579,7 @@ function TestimonialsSimpleGrid({
45417
45579
  CardContent,
45418
45580
  {
45419
45581
  className: cn(
45420
- "px-6 h-full flex flex-col-reverse items-stretch justify-between gap-12",
45582
+ "px-0 h-full flex flex-col-reverse items-stretch justify-between gap-12",
45421
45583
  cardContentClassName
45422
45584
  ),
45423
45585
  children: [
@@ -45429,7 +45591,7 @@ function TestimonialsSimpleGrid({
45429
45591
  authorClassName
45430
45592
  ),
45431
45593
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
45432
- /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "relative flex shrink-0 overflow-hidden rounded-full size-12 ring-4 ring-primary shadow-lg", children: [
45594
+ /* @__PURE__ */ jsxRuntime.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: [
45433
45595
  /* @__PURE__ */ jsxRuntime.jsx(
45434
45596
  AvatarImage,
45435
45597
  {
@@ -45439,11 +45601,28 @@ function TestimonialsSimpleGrid({
45439
45601
  ),
45440
45602
  /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { children: getInitials(authorName) })
45441
45603
  ] }),
45442
- /* @__PURE__ */ jsxRuntime.jsx("div", { children: testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-medium leading-none", children: testimonial.author }) : testimonial.author) })
45604
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1 pt-2 pr-6 pb-2", children: [
45605
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-0", children: [
45606
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg font-semibold leading-relaxed", children: testimonial.author }) : testimonial.author),
45607
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base", children: testimonial.role }) : testimonial.role)
45608
+ ] }),
45609
+ testimonial.linkConfig?.href && /* @__PURE__ */ jsxRuntime.jsx(
45610
+ Pressable,
45611
+ {
45612
+ href: testimonial.linkConfig.href,
45613
+ className: cn(
45614
+ "text-base transition-all duration-300",
45615
+ "underline underline-offset-4",
45616
+ testimonial.linkConfig.className
45617
+ ),
45618
+ children: testimonial.linkConfig.label
45619
+ }
45620
+ )
45621
+ ] })
45443
45622
  ] })
45444
45623
  }
45445
45624
  ),
45446
- testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm leading-relaxed", children: testimonial.quote }) : testimonial.quote)
45625
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pt-6 md: pt-8 px-6 md:px-8", children: testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm leading-relaxed", children: testimonial.quote }) : testimonial.quote) })
45447
45626
  ]
45448
45627
  }
45449
45628
  )
@@ -45614,7 +45793,7 @@ function TestimonialsSliderMinimal({
45614
45793
  Avatar,
45615
45794
  {
45616
45795
  className: cn(
45617
- "relative flex shrink-0 overflow-hidden rounded-3xl ring-8 ring-primary shadow-xl size-24",
45796
+ "relative flex shrink-0 overflow-hidden rounded-full ring-4 ring-primary shadow-xl size-12",
45618
45797
  avatarClassName
45619
45798
  ),
45620
45799
  children: [
@@ -45896,6 +46075,7 @@ function TestimonialsStatsHeader({
45896
46075
  statItemClassName,
45897
46076
  testimonialsGridClassName,
45898
46077
  cardClassName,
46078
+ statCardClassName,
45899
46079
  quoteClassName,
45900
46080
  authorClassName,
45901
46081
  background,
@@ -45914,6 +46094,11 @@ function TestimonialsStatsHeader({
45914
46094
  },
45915
46095
  []
45916
46096
  );
46097
+ const renderStatIcon = React8.useCallback((stat) => {
46098
+ if (stat.iconSlot) return stat.iconSlot;
46099
+ if (!stat.icon) return null;
46100
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: stat.icon, size: 32, className: stat.iconColor }) });
46101
+ }, []);
45917
46102
  const getInitials = React8.useCallback((name) => {
45918
46103
  return name.split(" ").map((n) => n[0]).join("");
45919
46104
  }, []);
@@ -45924,24 +46109,29 @@ function TestimonialsStatsHeader({
45924
46109
  "div",
45925
46110
  {
45926
46111
  className: cn(
45927
- "mb-12 grid grid-cols-2 gap-4 md:grid-cols-4",
46112
+ "mb-12 grid gap-6 md:grid-cols-2 lg:grid-cols-3",
45928
46113
  statsGridClassName
45929
46114
  ),
45930
- children: stats.map((stat, index) => /* @__PURE__ */ jsxRuntime.jsxs(
45931
- "div",
46115
+ children: stats.map((stat) => /* @__PURE__ */ jsxRuntime.jsx(
46116
+ Card,
45932
46117
  {
45933
46118
  className: cn(
45934
- "rounded-lg p-6 text-center",
45935
- getNestedCardBg(background),
45936
- getNestedCardTextColor(background),
45937
- statItemClassName
46119
+ "overflow-hidden border p-0",
46120
+ stat.className,
46121
+ statCardClassName
45938
46122
  ),
45939
- children: [
45940
- typeof stat.value === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-3xl font-bold text-primary md:text-4xl", children: stat.value }) : stat.value,
45941
- typeof stat.label === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: stat.label }) : stat.label
45942
- ]
46123
+ children: /* @__PURE__ */ jsxRuntime.jsxs(CardContent, { className: "p-6 md:p-8", children: [
46124
+ renderStatIcon(stat),
46125
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-end", children: [
46126
+ stat.prefix && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-1 mr-1 text-2xl font-bold", children: stat.prefix }),
46127
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-4xl font-bold tracking-tight leading-tight md:text-5xl", children: stat.value }),
46128
+ stat.suffix && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-1 ml-1 text-2xl font-bold", children: stat.suffix })
46129
+ ] }),
46130
+ stat.label && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4 text-xl font-semibold", children: stat.label }),
46131
+ stat.description && (typeof stat.description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "opacity-75", children: stat.description }) : stat.description)
46132
+ ] })
45943
46133
  },
45944
- index
46134
+ stat.id
45945
46135
  ))
45946
46136
  }
45947
46137
  );
@@ -45956,41 +46146,65 @@ function TestimonialsStatsHeader({
45956
46146
  children: testimonials.map((testimonial, index) => {
45957
46147
  const authorName = getAuthorName(testimonial);
45958
46148
  const avatarSrc = getAvatarSrc(testimonial);
45959
- return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cardClassName, children: /* @__PURE__ */ jsxRuntime.jsxs(CardContent, { className: "p-6", children: [
45960
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4 flex gap-1", children: [...Array(5)].map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
45961
- DynamicIcon,
45962
- {
45963
- name: "lucide/star",
45964
- size: 16,
45965
- className: "fill-primary text-primary"
45966
- },
45967
- i
45968
- )) }),
45969
- testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsxs(
45970
- "p",
45971
- {
45972
- className: cn(
45973
- "mb-6 text-sm leading-relaxed",
45974
- quoteClassName
45975
- ),
45976
- children: [
45977
- "\u201C",
45978
- testimonial.quote,
45979
- "\u201D"
45980
- ]
45981
- }
45982
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mb-6", quoteClassName), children: testimonial.quote })),
45983
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center gap-3", authorClassName), children: [
45984
- /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-10", children: [
45985
- /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
45986
- /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { children: getInitials(authorName) })
45987
- ] }),
45988
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
45989
- testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: testimonial.author }) : testimonial.author),
45990
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: testimonial.role }) : testimonial.role)
45991
- ] })
45992
- ] })
45993
- ] }) }, index);
46149
+ return /* @__PURE__ */ jsxRuntime.jsx(
46150
+ "div",
46151
+ {
46152
+ className: cn(
46153
+ "bg-card text-card-foreground flex flex-col gap-6 rounded-2xl border py-0 shadow-xl",
46154
+ cardClassName
46155
+ ),
46156
+ children: /* @__PURE__ */ jsxRuntime.jsx(CardContent, { className: "p-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-start gap-12 justify-between", children: [
46157
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-start gap-4", children: [
46158
+ /* @__PURE__ */ jsxRuntime.jsx(StarRating, { rating: 5, size: 20 }),
46159
+ testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsxs(
46160
+ "p",
46161
+ {
46162
+ className: cn(
46163
+ "mb-6 text-sm leading-relaxed",
46164
+ quoteClassName
46165
+ ),
46166
+ children: [
46167
+ "\u201C",
46168
+ testimonial.quote,
46169
+ "\u201D"
46170
+ ]
46171
+ }
46172
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mb-6", quoteClassName), children: testimonial.quote }))
46173
+ ] }),
46174
+ /* @__PURE__ */ jsxRuntime.jsxs(
46175
+ "div",
46176
+ {
46177
+ className: cn("flex items-center gap-3", authorClassName),
46178
+ children: [
46179
+ /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-10", children: [
46180
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
46181
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { children: getInitials(authorName) })
46182
+ ] }),
46183
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
46184
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
46185
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-medium", children: testimonial.author }) : testimonial.author),
46186
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm opacity-75", children: testimonial.role }) : testimonial.role)
46187
+ ] }),
46188
+ testimonial.linkConfig?.href && /* @__PURE__ */ jsxRuntime.jsx(
46189
+ Pressable,
46190
+ {
46191
+ href: testimonial.linkConfig.href,
46192
+ className: cn(
46193
+ "text-sm transition-all duration-300",
46194
+ "hover:underline hover:underline-offset-4",
46195
+ testimonial.linkConfig.className
46196
+ ),
46197
+ children: testimonial.linkConfig.label
46198
+ }
46199
+ )
46200
+ ] })
46201
+ ]
46202
+ }
46203
+ )
46204
+ ] }) })
46205
+ },
46206
+ index
46207
+ );
45994
46208
  })
45995
46209
  }
45996
46210
  );
@@ -46182,19 +46396,6 @@ function TestimonialsWallCompact({
46182
46396
  }
46183
46397
  );
46184
46398
  }
46185
- function StarRating4({ rating, size = 14 }) {
46186
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-0.5", children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsxRuntime.jsx(
46187
- DynamicIcon,
46188
- {
46189
- name: "lucide/star",
46190
- size,
46191
- className: cn(
46192
- star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
46193
- )
46194
- },
46195
- star
46196
- )) });
46197
- }
46198
46399
  function TestimonialsMiniDividers({
46199
46400
  testimonials,
46200
46401
  testimonialsSlot,
@@ -46209,101 +46410,133 @@ function TestimonialsMiniDividers({
46209
46410
  quoteClassName,
46210
46411
  authorClassName,
46211
46412
  background,
46212
- spacing,
46413
+ spacing = "lg",
46414
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
46213
46415
  pattern,
46214
46416
  patternOpacity
46215
46417
  }) {
46216
- const getAuthorName = React8.useCallback((testimonial) => {
46217
- if (typeof testimonial.author === "string") return testimonial.author;
46218
- return "";
46219
- }, []);
46220
- const getAvatarSrc = React8.useCallback((testimonial) => {
46221
- return testimonial.avatarSrc || testimonial.avatar?.src;
46222
- }, []);
46418
+ const getAuthorName = React8.useCallback(
46419
+ (testimonial) => {
46420
+ if (typeof testimonial.author === "string") return testimonial.author;
46421
+ return "";
46422
+ },
46423
+ []
46424
+ );
46425
+ const getAvatarSrc = React8.useCallback(
46426
+ (testimonial) => {
46427
+ return testimonial.avatarSrc || testimonial.avatar?.src;
46428
+ },
46429
+ []
46430
+ );
46223
46431
  const getInitials = React8.useCallback((name) => {
46224
46432
  return name.split(" ").map((n) => n[0]).join("");
46225
46433
  }, []);
46226
46434
  const renderedTestimonials = React8.useMemo(() => {
46227
46435
  if (testimonialsSlot) return testimonialsSlot;
46228
46436
  if (!testimonials || testimonials.length === 0) return null;
46229
- return /* @__PURE__ */ jsxRuntime.jsx(
46437
+ return /* @__PURE__ */ jsxRuntime.jsxs(
46230
46438
  "div",
46231
46439
  {
46232
46440
  className: cn(
46233
- "grid divide-y sm:grid-cols-2 sm:divide-x sm:divide-y-0 lg:grid-cols-3 lg:divide-x",
46441
+ "relative grid border-x border-b border-dashed md:grid-cols-3",
46234
46442
  gridClassName
46235
46443
  ),
46236
- children: testimonials.map((testimonial, index) => {
46237
- const authorName = getAuthorName(testimonial);
46238
- const avatarSrc = getAvatarSrc(testimonial);
46239
- return /* @__PURE__ */ jsxRuntime.jsxs(
46240
- "div",
46444
+ children: [
46445
+ /* @__PURE__ */ jsxRuntime.jsx(
46446
+ DynamicIcon,
46241
46447
  {
46242
- className: cn(
46243
- "p-6",
46244
- index >= 2 && "lg:border-t-0",
46245
- index >= 3 && "sm:border-t lg:border-t-0",
46246
- itemClassName
46247
- ),
46248
- children: [
46249
- testimonial.rating && /* @__PURE__ */ jsxRuntime.jsx(StarRating4, { rating: testimonial.rating }),
46250
- testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsxs(
46251
- "p",
46252
- {
46253
- className: cn(
46254
- "mt-3 text-sm leading-relaxed",
46255
- quoteClassName
46256
- ),
46257
- children: [
46258
- "\u201C",
46259
- testimonial.quote,
46260
- "\u201D"
46261
- ]
46262
- }
46263
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mt-3", quoteClassName), children: testimonial.quote })),
46264
- /* @__PURE__ */ jsxRuntime.jsxs(
46265
- "div",
46266
- {
46267
- className: cn("mt-4 flex items-center gap-3", authorClassName),
46268
- children: [
46269
- /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-8", children: [
46270
- /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
46271
- /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-xs", children: getInitials(authorName) })
46272
- ] }),
46273
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
46274
- testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: testimonial.author }) : testimonial.author),
46275
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: testimonial.role }) : testimonial.role)
46276
- ] })
46277
- ]
46278
- }
46279
- )
46280
- ]
46281
- },
46282
- index
46283
- );
46284
- })
46448
+ name: "lucide/sparkle",
46449
+ size: 20,
46450
+ className: "absolute top-0 right-0 translate-x-2.5 -translate-y-2.5 fill-primary"
46451
+ }
46452
+ ),
46453
+ /* @__PURE__ */ jsxRuntime.jsx(
46454
+ DynamicIcon,
46455
+ {
46456
+ name: "lucide/sparkle",
46457
+ size: 20,
46458
+ className: "absolute top-0 left-0 -translate-x-2.5 -translate-y-2.5 fill-primary"
46459
+ }
46460
+ ),
46461
+ testimonials.map((testimonial, index) => {
46462
+ const authorName = getAuthorName(testimonial);
46463
+ const avatarSrc = getAvatarSrc(testimonial);
46464
+ return /* @__PURE__ */ jsxRuntime.jsxs(
46465
+ "div",
46466
+ {
46467
+ className: cn(
46468
+ "group flex flex-col gap-4 border-t border-dashed p-4 transition-colors duration-300 hover:bg-muted/50 lg:p-8",
46469
+ index % 3 === 1 && "md:border-x md:border-dashed",
46470
+ itemClassName
46471
+ ),
46472
+ children: [
46473
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
46474
+ /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-10 shrink-0 rounded-md bg-card shadow-sm lg:size-12", children: [
46475
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
46476
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "rounded-md bg-card text-card-foreground text-sm", children: getInitials(authorName) })
46477
+ ] }),
46478
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("min-w-0", authorClassName), children: [
46479
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate font-medium", children: testimonial.author }) : testimonial.author),
46480
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-sm text-muted-foreground", children: testimonial.role }) : testimonial.role)
46481
+ ] })
46482
+ ] }),
46483
+ testimonial.rating != null && /* @__PURE__ */ jsxRuntime.jsx(StarRating, { rating: testimonial.rating }),
46484
+ testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsxs(
46485
+ "p",
46486
+ {
46487
+ className: cn(
46488
+ "text-sm leading-relaxed text-muted-foreground",
46489
+ quoteClassName
46490
+ ),
46491
+ children: [
46492
+ "\u201C",
46493
+ testimonial.quote,
46494
+ "\u201D"
46495
+ ]
46496
+ }
46497
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-sm", quoteClassName), children: testimonial.quote }))
46498
+ ]
46499
+ },
46500
+ index
46501
+ );
46502
+ })
46503
+ ]
46285
46504
  }
46286
46505
  );
46287
- }, [testimonialsSlot, gridClassName, testimonials, itemClassName, quoteClassName, authorClassName, getAuthorName, getAvatarSrc, getInitials]);
46288
- return /* @__PURE__ */ jsxRuntime.jsxs(
46506
+ }, [
46507
+ testimonialsSlot,
46508
+ gridClassName,
46509
+ testimonials,
46510
+ itemClassName,
46511
+ quoteClassName,
46512
+ authorClassName,
46513
+ getAuthorName,
46514
+ getAvatarSrc,
46515
+ getInitials
46516
+ ]);
46517
+ return /* @__PURE__ */ jsxRuntime.jsx(
46289
46518
  Section,
46290
46519
  {
46291
46520
  background,
46292
46521
  spacing,
46293
46522
  pattern,
46294
46523
  patternOpacity,
46295
- className,
46296
- children: [
46297
- /* @__PURE__ */ jsxRuntime.jsxs(
46524
+ className: cn("relative flex items-center justify-center", className),
46525
+ containerClassName,
46526
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
46527
+ /* @__PURE__ */ jsxRuntime.jsx(
46298
46528
  "div",
46299
46529
  {
46300
- className: cn("mx-auto mb-12 max-w-2xl text-center", headerClassName),
46301
- children: [
46530
+ className: cn(
46531
+ "border-x border-t border-dashed px-4 py-6 md:py-16 md:px-16",
46532
+ headerClassName
46533
+ ),
46534
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-3xl", children: [
46302
46535
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
46303
46536
  "h2",
46304
46537
  {
46305
46538
  className: cn(
46306
- "text-3xl font-semibold tracking-tight md:text-4xl",
46539
+ "text-center text-3xl font-semibold tracking-tight md:text-4xl",
46307
46540
  headingClassName
46308
46541
  ),
46309
46542
  children: heading
@@ -46313,17 +46546,17 @@ function TestimonialsMiniDividers({
46313
46546
  "p",
46314
46547
  {
46315
46548
  className: cn(
46316
- "mt-4 text-lg text-muted-foreground",
46549
+ "mx-auto mt-4 max-w-2xl text-center text-lg text-balance",
46317
46550
  descriptionClassName
46318
46551
  ),
46319
46552
  children: description
46320
46553
  }
46321
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mt-4", descriptionClassName), children: description }))
46322
- ]
46554
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description }))
46555
+ ] })
46323
46556
  }
46324
46557
  ),
46325
46558
  renderedTestimonials
46326
- ]
46559
+ ] })
46327
46560
  }
46328
46561
  );
46329
46562
  }
@@ -46343,18 +46576,25 @@ function TestimonialsLogoCards({
46343
46576
  quoteClassName,
46344
46577
  authorClassName,
46345
46578
  background,
46346
- spacing,
46579
+ spacing = "lg",
46580
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
46347
46581
  pattern,
46348
46582
  patternOpacity,
46349
46583
  optixFlowConfig
46350
46584
  }) {
46351
- const getAuthorName = React8.useCallback((testimonial) => {
46352
- if (typeof testimonial.author === "string") return testimonial.author;
46353
- return "";
46354
- }, []);
46355
- const getAvatarSrc = React8.useCallback((testimonial) => {
46356
- return testimonial.avatarSrc || testimonial.avatar?.src;
46357
- }, []);
46585
+ const getAuthorName = React8.useCallback(
46586
+ (testimonial) => {
46587
+ if (typeof testimonial.author === "string") return testimonial.author;
46588
+ return "";
46589
+ },
46590
+ []
46591
+ );
46592
+ const getAvatarSrc = React8.useCallback(
46593
+ (testimonial) => {
46594
+ return testimonial.avatarSrc || testimonial.avatar?.src;
46595
+ },
46596
+ []
46597
+ );
46358
46598
  const getInitials = React8.useCallback((name) => {
46359
46599
  return name.split(" ").map((n) => n[0]).join("");
46360
46600
  }, []);
@@ -46385,7 +46625,10 @@ function TestimonialsLogoCards({
46385
46625
  {
46386
46626
  src: testimonial.companyLogo,
46387
46627
  alt: testimonial.companyLogoAlt || "Company logo",
46388
- className: "h-6 w-auto object-contain dark:invert",
46628
+ className: cn(
46629
+ index === 0 ? "h-10" : "h-5",
46630
+ "w-auto object-contain"
46631
+ ),
46389
46632
  optixFlowConfig
46390
46633
  }
46391
46634
  ) }),
@@ -46402,20 +46645,29 @@ function TestimonialsLogoCards({
46402
46645
  {
46403
46646
  className: cn(
46404
46647
  "leading-relaxed",
46405
- index === 0 ? "text-xl font-medium" : "text-sm",
46648
+ index === 0 ? "text-lg md:text-xl font-light" : "text-sm md:text-base",
46406
46649
  quoteClassName
46407
46650
  ),
46408
46651
  children: testimonial.quote
46409
46652
  }
46410
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: quoteClassName, children: testimonial.quote })),
46653
+ ) : testimonial.quote),
46411
46654
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center gap-3", authorClassName), children: [
46412
- /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: cn(index === 0 ? "size-12" : "size-10"), children: [
46413
- /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
46414
- /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { children: getInitials(authorName) })
46415
- ] }),
46655
+ /* @__PURE__ */ jsxRuntime.jsxs(
46656
+ Avatar,
46657
+ {
46658
+ className: cn(
46659
+ index === 0 ? "size-12" : "size-10",
46660
+ "ring-4 ring-primary"
46661
+ ),
46662
+ children: [
46663
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
46664
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { children: getInitials(authorName) })
46665
+ ]
46666
+ }
46667
+ ),
46416
46668
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
46417
- testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("cite", { className: "text-sm font-medium not-italic", children: testimonial.author }) : testimonial.author),
46418
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: testimonial.role }) : testimonial.role)
46669
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("cite", { className: "text-sm md:text-base font-medium", children: testimonial.author }) : testimonial.author),
46670
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs md:text-sm", children: testimonial.role }) : testimonial.role)
46419
46671
  ] })
46420
46672
  ] })
46421
46673
  ]
@@ -46428,7 +46680,20 @@ function TestimonialsLogoCards({
46428
46680
  })
46429
46681
  }
46430
46682
  );
46431
- }, [testimonialsSlot, gridClassName, testimonials, cardClassName, cardHeaderClassName, optixFlowConfig, cardContentClassName, quoteClassName, authorClassName, getAuthorName, getAvatarSrc, getInitials]);
46683
+ }, [
46684
+ testimonialsSlot,
46685
+ gridClassName,
46686
+ testimonials,
46687
+ cardClassName,
46688
+ cardHeaderClassName,
46689
+ optixFlowConfig,
46690
+ cardContentClassName,
46691
+ quoteClassName,
46692
+ authorClassName,
46693
+ getAuthorName,
46694
+ getAvatarSrc,
46695
+ getInitials
46696
+ ]);
46432
46697
  return /* @__PURE__ */ jsxRuntime.jsxs(
46433
46698
  Section,
46434
46699
  {
@@ -46437,6 +46702,7 @@ function TestimonialsLogoCards({
46437
46702
  pattern,
46438
46703
  patternOpacity,
46439
46704
  className,
46705
+ containerClassName,
46440
46706
  children: [
46441
46707
  /* @__PURE__ */ jsxRuntime.jsxs(
46442
46708
  "div",
@@ -46447,22 +46713,19 @@ function TestimonialsLogoCards({
46447
46713
  "h2",
46448
46714
  {
46449
46715
  className: cn(
46450
- "text-3xl font-semibold tracking-tight md:text-4xl",
46716
+ "text-3xl font-semibold tracking-tight md:text-4xl text-balance",
46451
46717
  headingClassName
46452
46718
  ),
46453
46719
  children: heading
46454
46720
  }
46455
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
46721
+ ) : heading),
46456
46722
  description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
46457
46723
  "p",
46458
46724
  {
46459
- className: cn(
46460
- "mt-4 text-lg text-muted-foreground",
46461
- descriptionClassName
46462
- ),
46725
+ className: cn("mt-4 text-lg text-balance", descriptionClassName),
46463
46726
  children: description
46464
46727
  }
46465
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mt-4", descriptionClassName), children: description }))
46728
+ ) : description)
46466
46729
  ]
46467
46730
  }
46468
46731
  ),
@@ -46932,7 +47195,7 @@ function TestimonialsScrollingColumns({
46932
47195
  framerMotion.motion.div,
46933
47196
  {
46934
47197
  className: cn(
46935
- "relative overflow-hidden rounded-lg bg-card shadow-sm",
47198
+ "relative overflow-hidden rounded-2xl shadow-sm",
46936
47199
  cardClassName
46937
47200
  ),
46938
47201
  variants: itemVariants2,
@@ -46947,35 +47210,40 @@ function TestimonialsScrollingColumns({
46947
47210
  optixFlowConfig
46948
47211
  }
46949
47212
  ),
46950
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 bg-gradient-to-t from-foreground/70 via-foreground/40 to-transparent" })
47213
+ /* @__PURE__ */ jsxRuntime.jsx(GradientOverlay, {})
46951
47214
  ] }),
46952
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute bottom-0 left-0 right-0 p-6 text-left text-background", children: [
46953
- /* @__PURE__ */ jsxRuntime.jsx(
47215
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute bottom-0 left-0 right-0 p-6 text-left", children: [
47216
+ testimonial?.logoSrc ? /* @__PURE__ */ jsxRuntime.jsx(
47217
+ img.Img,
47218
+ {
47219
+ src: testimonial.logoSrc,
47220
+ alt: typeof testimonial.company === "string" ? `${testimonial.company} logo` : typeof testimonial.author === "string" ? `${testimonial.author} company logo` : "Company logo",
47221
+ className: cn(
47222
+ "flex justify-start items-start mb-6 max-h-10 max-w-32 object-contain md:max-h-10 md:max-w-48"
47223
+ ),
47224
+ optixFlowConfig
47225
+ }
47226
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
46954
47227
  DynamicIcon,
46955
47228
  {
46956
- name: "lucide/quote",
46957
- size: 32,
46958
- className: "mb-4 text-background/40"
47229
+ name: "mdi/comment-quote-outline",
47230
+ size: 42,
47231
+ className: cn("opacity-50")
46959
47232
  }
46960
47233
  ),
46961
47234
  testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
46962
47235
  "blockquote",
46963
47236
  {
46964
47237
  className: cn(
46965
- "text-base font-medium leading-relaxed",
47238
+ "text-base font-base leading-relaxed",
46966
47239
  quoteClassName
46967
47240
  ),
46968
47241
  children: testimonial.quote
46969
47242
  }
46970
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: quoteClassName, children: testimonial.quote })),
46971
- /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: cn("mt-4", authorClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "font-semibold", children: [
46972
- "\u2014",
46973
- " ",
46974
- testimonial.author && (typeof testimonial.author === "string" ? testimonial.author : null),
46975
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-1 text-background/60", children: [
46976
- ", ",
46977
- testimonial.role
46978
- ] }) : null)
47243
+ ) : testimonial.quote),
47244
+ /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: cn("mt-4", authorClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
47245
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "uppercase text-base font-semibold", children: testimonial.author }) : null),
47246
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-thin", children: testimonial.role }) : null)
46979
47247
  ] }) })
46980
47248
  ] })
46981
47249
  ]
@@ -47008,19 +47276,32 @@ function TestimonialsScrollingColumns({
47008
47276
  /* @__PURE__ */ jsxRuntime.jsxs(
47009
47277
  "div",
47010
47278
  {
47011
- className: cn("mx-auto mb-12 max-w-2xl text-center", headerClassName),
47279
+ className: cn(
47280
+ "mx-auto mb-12 max-w-full md:max-w-2xl space-y-4 text-center",
47281
+ headerClassName
47282
+ ),
47012
47283
  children: [
47013
47284
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
47014
47285
  "h2",
47015
47286
  {
47016
47287
  className: cn(
47017
- "text-3xl font-semibold tracking-tight md:text-4xl",
47288
+ "text-pretty text-3xl md:text-4xl lg:text-6xl",
47289
+ "font-semibold tracking-tight",
47018
47290
  headingClassName
47019
47291
  ),
47020
47292
  children: heading
47021
47293
  }
47022
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
47023
- description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mt-4 text-lg ", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mt-4", descriptionClassName), children: description }))
47294
+ ) : heading),
47295
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
47296
+ "p",
47297
+ {
47298
+ className: cn(
47299
+ "text-base md:text-lg text-balance",
47300
+ descriptionClassName
47301
+ ),
47302
+ children: description
47303
+ }
47304
+ ) : description)
47024
47305
  ]
47025
47306
  }
47026
47307
  ),
@@ -47040,7 +47321,8 @@ function TestimonialsMinimalNumbered({
47040
47321
  authorClassName,
47041
47322
  navigationClassName,
47042
47323
  background,
47043
- spacing,
47324
+ spacing = "py-8 md:py-12",
47325
+ containerClassName = "w-full px-6 sm:px-6 md:px-8 lg:px-0 max-w-full md:max-w-lg min-h-70dvh h-70dvh flex flex-col items-center justify-center",
47044
47326
  pattern,
47045
47327
  patternOpacity
47046
47328
  }) {
@@ -47093,19 +47375,19 @@ function TestimonialsMinimalNumbered({
47093
47375
  if (!current) return null;
47094
47376
  const authorName = getAuthorName(current);
47095
47377
  const avatarSrc = getAvatarSrc(current);
47096
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-start gap-8", contentClassName), children: [
47378
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-start gap-4 md:gap-8", contentClassName), children: [
47097
47379
  /* @__PURE__ */ jsxRuntime.jsx(
47098
47380
  "span",
47099
47381
  {
47100
47382
  className: cn(
47101
- "text-8xl font-light leading-none select-none transition-all duration-500 md:text-9xl",
47383
+ "text-4xl md:text-8xl font-light leading-none select-none transition-all duration-500",
47102
47384
  numberClassName
47103
47385
  ),
47104
47386
  style: { fontFeatureSettings: '"tnum"' },
47105
47387
  children: String(active + 1).padStart(2, "0")
47106
47388
  }
47107
47389
  ),
47108
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 pt-6", children: [
47390
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 pt-0 md:pt-6", children: [
47109
47391
  current.quote && (typeof current.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
47110
47392
  "blockquote",
47111
47393
  {
@@ -47176,6 +47458,7 @@ function TestimonialsMinimalNumbered({
47176
47458
  pattern,
47177
47459
  patternOpacity,
47178
47460
  className,
47461
+ containerClassName,
47179
47462
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-4xl mx-auto", children: [
47180
47463
  renderedTestimonial,
47181
47464
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -47211,13 +47494,13 @@ function TestimonialsMinimalNumbered({
47211
47494
  String(testimonials.length).padStart(2, "0")
47212
47495
  ] })
47213
47496
  ] }) }),
47214
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
47497
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
47215
47498
  /* @__PURE__ */ jsxRuntime.jsx(
47216
47499
  "button",
47217
47500
  {
47218
47501
  onClick: handlePrev,
47219
47502
  className: "rounded-full p-2 transition-all duration-300 ",
47220
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/chevron-left", size: 20 })
47503
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/chevron-left", size: 24 })
47221
47504
  }
47222
47505
  ),
47223
47506
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -47225,7 +47508,7 @@ function TestimonialsMinimalNumbered({
47225
47508
  {
47226
47509
  onClick: handleNext,
47227
47510
  className: "rounded-full p-2 transition-all duration-300 ",
47228
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/chevron-right", size: 20 })
47511
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/chevron-right", size: 24 })
47229
47512
  }
47230
47513
  )
47231
47514
  ] })
@@ -47346,10 +47629,11 @@ function TestimonialsParallaxNumber({
47346
47629
  framerMotion.motion.div,
47347
47630
  {
47348
47631
  className: cn(
47349
- "pointer-events-none absolute -left-8 top-1/2 -translate-y-1/2 select-none text-[20rem] font-bold leading-none tracking-tighter ",
47632
+ "opacity-15",
47633
+ "pointer-events-none absolute -left-8 top-1/2 -translate-y-1/2 select-none text-[20rem] font-bold leading-none tracking-tighter",
47350
47634
  numberClassName
47351
47635
  ),
47352
- style: { x: numberX, y: numberY },
47636
+ style: { x: numberX, y: numberY, opacity: 0.1 },
47353
47637
  children: /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsxRuntime.jsx(
47354
47638
  framerMotion.motion.span,
47355
47639
  {
@@ -47358,14 +47642,14 @@ function TestimonialsParallaxNumber({
47358
47642
  exit: { opacity: 0, scale: 1.1, filter: "blur(10px)" },
47359
47643
  transition: { duration: 0.6, ease: [0.22, 1, 0.36, 1] },
47360
47644
  className: "block",
47361
- children: current.backgroundIcon ? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: current.backgroundIcon }) : current.backgroundLabel != null ? current.backgroundLabel : null
47645
+ children: current.backgroundIcon ? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: current.backgroundIcon, size: 320 }) : current.backgroundLabel != null ? current.backgroundLabel : null
47362
47646
  },
47363
47647
  activeIndex
47364
47648
  ) })
47365
47649
  }
47366
47650
  ),
47367
47651
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex", children: [
47368
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center border-r border-border/50 pr-16", children: [
47652
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center border-r-0 md:border-r border-border/30 pr-4 md:pr-16", children: [
47369
47653
  /* @__PURE__ */ jsxRuntime.jsxs(
47370
47654
  framerMotion.motion.span,
47371
47655
  {
@@ -47391,7 +47675,7 @@ function TestimonialsParallaxNumber({
47391
47675
  }
47392
47676
  ) })
47393
47677
  ] }),
47394
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 py-12 pl-16", children: [
47678
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 py-6 md:py-12 pl-4 md:pl-16", children: [
47395
47679
  /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsxRuntime.jsx(
47396
47680
  framerMotion.motion.div,
47397
47681
  {
@@ -47400,7 +47684,7 @@ function TestimonialsParallaxNumber({
47400
47684
  exit: { opacity: 0, x: 20 },
47401
47685
  transition: { duration: 0.4 },
47402
47686
  className: "mb-8",
47403
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center gap-2 rounded-full border border-border px-3 py-1 text-xs ", children: companyName })
47687
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center gap-2 rounded-full border border-border px-4 py-2 text-sm", children: companyName })
47404
47688
  },
47405
47689
  activeIndex
47406
47690
  ) }),
@@ -47408,7 +47692,8 @@ function TestimonialsParallaxNumber({
47408
47692
  framerMotion.motion.blockquote,
47409
47693
  {
47410
47694
  className: cn(
47411
- "text-3xl font-light leading-[1.15] tracking-tight md:text-4xl lg:text-5xl",
47695
+ "text-2xl md:text-4xl lg:text-5xl",
47696
+ "font-light leading-[1.15] tracking-tight",
47412
47697
  quoteClassName
47413
47698
  ),
47414
47699
  initial: "hidden",
@@ -47443,7 +47728,7 @@ function TestimonialsParallaxNumber({
47443
47728
  },
47444
47729
  activeIndex
47445
47730
  ) }) }),
47446
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-end justify-between", children: [
47731
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start md:items-end justify-between", children: [
47447
47732
  /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsxRuntime.jsx(
47448
47733
  framerMotion.motion.div,
47449
47734
  {
@@ -47475,7 +47760,10 @@ function TestimonialsParallaxNumber({
47475
47760
  /* @__PURE__ */ jsxRuntime.jsxs(
47476
47761
  "div",
47477
47762
  {
47478
- className: cn("flex items-center gap-4", navigationClassName),
47763
+ className: cn(
47764
+ "flex items-center gap-4 flex-col md:flex-row",
47765
+ navigationClassName
47766
+ ),
47479
47767
  children: [
47480
47768
  /* @__PURE__ */ jsxRuntime.jsx(
47481
47769
  framerMotion.motion.button,
@@ -47590,7 +47878,8 @@ function TestimonialsMasonryGrid({
47590
47878
  quoteClassName,
47591
47879
  authorClassName,
47592
47880
  background,
47593
- spacing,
47881
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
47882
+ spacing = "xl",
47594
47883
  pattern,
47595
47884
  patternOpacity
47596
47885
  }) {
@@ -47603,9 +47892,12 @@ function TestimonialsMasonryGrid({
47603
47892
  if (typeof testimonial.author === "string") return testimonial.author;
47604
47893
  return "";
47605
47894
  }, []);
47606
- const getAvatarSrc = React8.useCallback((testimonial) => {
47607
- return testimonial.avatarSrc || testimonial.avatar?.src;
47608
- }, []);
47895
+ const getAvatarSrc = React8.useCallback(
47896
+ (testimonial) => {
47897
+ return testimonial.avatarSrc || testimonial.avatar?.src;
47898
+ },
47899
+ []
47900
+ );
47609
47901
  const getInitials = React8.useCallback((name) => {
47610
47902
  return name.split(" ").map((n) => n[0]).join("");
47611
47903
  }, []);
@@ -47622,42 +47914,60 @@ function TestimonialsMasonryGrid({
47622
47914
  children: columns.map((column, columnIndex) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-4", children: column.map((testimonial, index) => {
47623
47915
  const authorName = getAuthorName(testimonial);
47624
47916
  const avatarSrc = getAvatarSrc(testimonial);
47625
- return /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cardClassName, children: /* @__PURE__ */ jsxRuntime.jsxs(CardContent, { className: "p-6", children: [
47626
- testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsxs(
47627
- "p",
47628
- {
47629
- className: cn(
47630
- "mb-4 text-sm leading-relaxed",
47631
- quoteClassName
47632
- ),
47633
- children: [
47917
+ return /* @__PURE__ */ jsxRuntime.jsx(
47918
+ "div",
47919
+ {
47920
+ className: cn(
47921
+ cardClassName,
47922
+ "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border shadow-sm"
47923
+ ),
47924
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full flex-col justify-between p-6 gap-8", children: [
47925
+ testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: "text-sm leading-relaxed line-clamp-3", children: [
47634
47926
  "\u201C",
47635
47927
  testimonial.quote,
47636
47928
  "\u201D"
47637
- ]
47638
- }
47639
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mb-4", quoteClassName), children: testimonial.quote })),
47640
- /* @__PURE__ */ jsxRuntime.jsxs(
47641
- "div",
47642
- {
47643
- className: cn("flex items-center gap-3", authorClassName),
47644
- children: [
47645
- /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-9", children: [
47929
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line-clamp-3", children: testimonial.quote })),
47930
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 flex items-center gap-3", children: [
47931
+ /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "relative flex shrink-0 overflow-hidden rounded-full size-12 ring-4 ring-primary shadow-lg", children: [
47646
47932
  /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
47647
47933
  /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-xs", children: getInitials(authorName) })
47648
47934
  ] }),
47649
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
47935
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-0 leading-tight", children: [
47650
47936
  testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: testimonial.author }) : testimonial.author),
47651
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: testimonial.role }) : testimonial.role)
47937
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs", children: testimonial.role }) : testimonial.role),
47938
+ testimonial.linkConfig?.href && /* @__PURE__ */ jsxRuntime.jsx(
47939
+ Pressable,
47940
+ {
47941
+ href: testimonial.linkConfig.href,
47942
+ className: cn(
47943
+ "text-sm transition-all duration-300",
47944
+ "underline underline-offset-4",
47945
+ testimonial.linkConfig.className
47946
+ ),
47947
+ children: testimonial.linkConfig.label
47948
+ }
47949
+ )
47652
47950
  ] })
47653
- ]
47654
- }
47655
- )
47656
- ] }) }, index);
47951
+ ] })
47952
+ ] })
47953
+ },
47954
+ index
47955
+ );
47657
47956
  }) }, columnIndex))
47658
47957
  }
47659
47958
  );
47660
- }, [testimonialsSlot, gridClassName, columns, cardClassName, quoteClassName, authorClassName, testimonials, getAuthorName, getAvatarSrc, getInitials]);
47959
+ }, [
47960
+ testimonialsSlot,
47961
+ gridClassName,
47962
+ columns,
47963
+ cardClassName,
47964
+ quoteClassName,
47965
+ authorClassName,
47966
+ testimonials,
47967
+ getAuthorName,
47968
+ getAvatarSrc,
47969
+ getInitials
47970
+ ]);
47661
47971
  return /* @__PURE__ */ jsxRuntime.jsxs(
47662
47972
  Section,
47663
47973
  {
@@ -47666,32 +47976,33 @@ function TestimonialsMasonryGrid({
47666
47976
  pattern,
47667
47977
  patternOpacity,
47668
47978
  className,
47979
+ containerClassName,
47669
47980
  children: [
47670
47981
  /* @__PURE__ */ jsxRuntime.jsxs(
47671
47982
  "div",
47672
47983
  {
47673
- className: cn("mx-auto mb-12 max-w-2xl text-center", headerClassName),
47984
+ className: cn(
47985
+ "mx-auto mb-12 max-w-full md:max-w-2xl text-center",
47986
+ headerClassName
47987
+ ),
47674
47988
  children: [
47675
47989
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
47676
47990
  "h2",
47677
47991
  {
47678
47992
  className: cn(
47679
- "text-3xl font-semibold tracking-tight md:text-4xl",
47993
+ "text-3xl font-semibold tracking-tight md:text-4xl lg:text-6xl text-balance",
47680
47994
  headingClassName
47681
47995
  ),
47682
47996
  children: heading
47683
47997
  }
47684
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
47998
+ ) : heading),
47685
47999
  description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
47686
48000
  "p",
47687
48001
  {
47688
- className: cn(
47689
- "mt-4 text-lg text-muted-foreground",
47690
- descriptionClassName
47691
- ),
48002
+ className: cn("mt-4 text-lg text-balance", descriptionClassName),
47692
48003
  children: description
47693
48004
  }
47694
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mt-4", descriptionClassName), children: description }))
48005
+ ) : description)
47695
48006
  ]
47696
48007
  }
47697
48008
  ),
@@ -47710,7 +48021,8 @@ function TestimonialsLargeQuote({
47710
48021
  authorClassName,
47711
48022
  avatarClassName,
47712
48023
  background,
47713
- spacing,
48024
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
48025
+ spacing = "xl",
47714
48026
  pattern,
47715
48027
  patternOpacity
47716
48028
  }) {
@@ -47729,49 +48041,78 @@ function TestimonialsLargeQuote({
47729
48041
  if (!testimonial) return null;
47730
48042
  const authorName = getAuthorName();
47731
48043
  const avatarSrc = getAvatarSrc();
47732
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mx-auto max-w-4xl text-center", contentClassName), children: [
47733
- /* @__PURE__ */ jsxRuntime.jsx(
47734
- DynamicIcon,
47735
- {
47736
- name: "lucide/quote",
47737
- size: 64,
47738
- className: cn("mx-auto mb-8 text-primary/20", quoteIconClassName)
47739
- }
47740
- ),
47741
- testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
47742
- "blockquote",
47743
- {
47744
- className: cn(
47745
- "text-2xl font-medium leading-relaxed md:text-3xl lg:text-4xl",
47746
- quoteClassName
47747
- ),
47748
- children: testimonial.quote
47749
- }
47750
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: quoteClassName, children: testimonial.quote })),
47751
- /* @__PURE__ */ jsxRuntime.jsxs(
47752
- "div",
47753
- {
47754
- className: cn(
47755
- "mt-10 flex flex-col items-center gap-4",
47756
- authorClassName
48044
+ return /* @__PURE__ */ jsxRuntime.jsxs(
48045
+ "div",
48046
+ {
48047
+ className: cn(
48048
+ "mx-auto max-full md:max-w-lg text-center",
48049
+ contentClassName
48050
+ ),
48051
+ children: [
48052
+ /* @__PURE__ */ jsxRuntime.jsx(
48053
+ DynamicIcon,
48054
+ {
48055
+ name: "mdi/comment-quote-outline",
48056
+ size: 48,
48057
+ className: cn("mx-auto mb-8 ", quoteIconClassName)
48058
+ }
47757
48059
  ),
47758
- children: [
47759
- /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: cn("size-16", avatarClassName), children: [
47760
- /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
47761
- /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-lg", children: getInitials(authorName) })
47762
- ] }),
47763
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
47764
- testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg font-semibold", children: testimonial.author }) : testimonial.author),
47765
- (testimonial.role || testimonial.company) && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-muted-foreground", children: [
47766
- testimonial.role && (typeof testimonial.role === "string" ? testimonial.role : testimonial.role),
47767
- testimonial.company && (typeof testimonial.company === "string" ? ` at ${testimonial.company}` : testimonial.company)
47768
- ] })
47769
- ] })
47770
- ]
47771
- }
47772
- )
47773
- ] });
47774
- }, [testimonialSlot, contentClassName, quoteIconClassName, testimonial, quoteClassName, authorClassName, avatarClassName, getAuthorName, getAvatarSrc, getInitials]);
48060
+ testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
48061
+ "blockquote",
48062
+ {
48063
+ className: cn(
48064
+ "text-2xl font-light leading-relaxed md:text-3xl lg:text-4xl text-balance",
48065
+ quoteClassName
48066
+ ),
48067
+ children: testimonial.quote
48068
+ }
48069
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: quoteClassName, children: testimonial.quote })),
48070
+ /* @__PURE__ */ jsxRuntime.jsxs(
48071
+ "div",
48072
+ {
48073
+ className: cn(
48074
+ "mt-10 md:mt-16 flex flex-col items-center gap-4 md:gap-8",
48075
+ authorClassName
48076
+ ),
48077
+ children: [
48078
+ /* @__PURE__ */ jsxRuntime.jsxs(
48079
+ Avatar,
48080
+ {
48081
+ className: cn(
48082
+ "relative flex shrink-0 overflow-hidden rounded-full size-16 ring-4 ring-primary shadow-lg",
48083
+ avatarClassName
48084
+ ),
48085
+ children: [
48086
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
48087
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-lg", children: getInitials(authorName) })
48088
+ ]
48089
+ }
48090
+ ),
48091
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-4", children: [
48092
+ testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg font-semibold", children: testimonial.author }) : testimonial.author),
48093
+ (testimonial.role || testimonial.company) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-2", children: [
48094
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-normal opacity-75", children: testimonial.role && (typeof testimonial.role === "string" ? testimonial.role : testimonial.role) }),
48095
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm uppercase font-semibold opacity-75", children: testimonial.company && (typeof testimonial.company === "string" ? ` at ${testimonial.company}` : testimonial.company) })
48096
+ ] })
48097
+ ] })
48098
+ ]
48099
+ }
48100
+ )
48101
+ ]
48102
+ }
48103
+ );
48104
+ }, [
48105
+ testimonialSlot,
48106
+ contentClassName,
48107
+ quoteIconClassName,
48108
+ testimonial,
48109
+ quoteClassName,
48110
+ authorClassName,
48111
+ avatarClassName,
48112
+ getAuthorName,
48113
+ getAvatarSrc,
48114
+ getInitials
48115
+ ]);
47775
48116
  return /* @__PURE__ */ jsxRuntime.jsx(
47776
48117
  Section,
47777
48118
  {
@@ -47780,6 +48121,7 @@ function TestimonialsLargeQuote({
47780
48121
  pattern,
47781
48122
  patternOpacity,
47782
48123
  className,
48124
+ containerClassName,
47783
48125
  children: renderedTestimonial
47784
48126
  }
47785
48127
  );
@@ -52078,7 +52420,8 @@ function HeroVideoBackgroundDark({
52078
52420
  videoSrc,
52079
52421
  videoSlot,
52080
52422
  background,
52081
- videoBrightness = "50",
52423
+ videoBrightness,
52424
+ videoOverlayIntensity = "high",
52082
52425
  spacing = "py-0 md:py-0",
52083
52426
  pattern,
52084
52427
  patternOpacity,
@@ -52090,21 +52433,21 @@ function HeroVideoBackgroundDark({
52090
52433
  }) {
52091
52434
  const renderVideo = React8.useMemo(() => {
52092
52435
  if (videoSlot) return videoSlot;
52093
- return /* @__PURE__ */ jsxRuntime.jsx(
52094
- "video",
52095
- {
52096
- loop: true,
52097
- playsInline: true,
52098
- src: videoSrc,
52099
- className: cn(
52100
- "absolute top-0 left-0 size-full object-cover",
52101
- `brightness-${videoBrightness}`
52102
- ),
52103
- autoPlay: true,
52104
- muted: true
52105
- }
52106
- );
52107
- }, [videoSlot, videoSrc, videoBrightness]);
52436
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
52437
+ /* @__PURE__ */ jsxRuntime.jsx(
52438
+ "video",
52439
+ {
52440
+ loop: true,
52441
+ playsInline: true,
52442
+ src: videoSrc,
52443
+ className: "absolute top-0 left-0 size-full object-cover",
52444
+ autoPlay: true,
52445
+ muted: true
52446
+ }
52447
+ ),
52448
+ /* @__PURE__ */ jsxRuntime.jsx(GradientOverlay, { intensity: videoOverlayIntensity })
52449
+ ] });
52450
+ }, [videoSlot, videoSrc, videoOverlayIntensity]);
52108
52451
  return /* @__PURE__ */ jsxRuntime.jsx(
52109
52452
  Section,
52110
52453
  {
@@ -115675,8 +116018,8 @@ var BLOCK_REGISTRY = {
115675
116018
  },
115676
116019
  "testimonials-centered-avatars": {
115677
116020
  id: "testimonials-centered-avatars",
115678
- name: "Testimonials Centered with Avatar Stack",
115679
- 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.",
116021
+ name: "Testimonials Centered with Glassmorphism Card",
116022
+ 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.",
115680
116023
  semanticTags: [
115681
116024
  "testimonials",
115682
116025
  "centered",
@@ -115684,7 +116027,11 @@ var BLOCK_REGISTRY = {
115684
116027
  "stack",
115685
116028
  "community",
115686
116029
  "social-proof",
115687
- "minimal",
116030
+ "glassmorphism",
116031
+ "glass",
116032
+ "frosted",
116033
+ "modern",
116034
+ "premium",
115688
116035
  "rotating"
115689
116036
  ],
115690
116037
  category: "testimonials",