@opensite/ui 2.9.0 → 2.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/carousel-feature-badge.cjs +4 -3
  2. package/dist/carousel-feature-badge.d.cts +1 -1
  3. package/dist/carousel-feature-badge.d.ts +1 -1
  4. package/dist/carousel-feature-badge.js +4 -3
  5. package/dist/carousel-scrolling-feature-showcase.cjs +47 -38
  6. package/dist/carousel-scrolling-feature-showcase.js +47 -38
  7. package/dist/registry.cjs +454 -265
  8. package/dist/registry.js +454 -265
  9. package/dist/testimonials-grid-add-review.cjs +578 -39
  10. package/dist/testimonials-grid-add-review.d.cts +26 -26
  11. package/dist/testimonials-grid-add-review.d.ts +26 -26
  12. package/dist/testimonials-grid-add-review.js +577 -38
  13. package/dist/testimonials-images-helpful.cjs +85 -74
  14. package/dist/testimonials-images-helpful.js +85 -74
  15. package/dist/testimonials-list-verified.cjs +1 -0
  16. package/dist/testimonials-list-verified.js +1 -0
  17. package/dist/testimonials-logo-cards.cjs +8 -5
  18. package/dist/testimonials-logo-cards.js +8 -5
  19. package/dist/testimonials-masonry-grid.cjs +87 -11
  20. package/dist/testimonials-masonry-grid.d.cts +14 -1
  21. package/dist/testimonials-masonry-grid.d.ts +14 -1
  22. package/dist/testimonials-masonry-grid.js +88 -12
  23. package/dist/testimonials-mini-dividers.cjs +438 -26
  24. package/dist/testimonials-mini-dividers.js +434 -22
  25. package/dist/testimonials-minimal-numbered.cjs +1 -1
  26. package/dist/testimonials-minimal-numbered.js +1 -1
  27. package/dist/testimonials-parallax-number.cjs +1 -1
  28. package/dist/testimonials-parallax-number.js +1 -1
  29. package/dist/testimonials-quote-carousel.cjs +39 -37
  30. package/dist/testimonials-quote-carousel.d.cts +5 -1
  31. package/dist/testimonials-quote-carousel.d.ts +5 -1
  32. package/dist/testimonials-quote-carousel.js +39 -37
  33. package/dist/testimonials-scrolling-columns.cjs +438 -8
  34. package/dist/testimonials-scrolling-columns.js +436 -6
  35. package/dist/testimonials-simple-grid.cjs +82 -6
  36. package/dist/testimonials-simple-grid.d.cts +14 -1
  37. package/dist/testimonials-simple-grid.d.ts +14 -1
  38. package/dist/testimonials-simple-grid.js +83 -7
  39. package/dist/testimonials-stats-header.cjs +88 -8
  40. package/dist/testimonials-stats-header.d.cts +14 -1
  41. package/dist/testimonials-stats-header.d.ts +14 -1
  42. package/dist/testimonials-stats-header.js +89 -9
  43. package/dist/testimonials-twitter-cards.cjs +150 -25
  44. package/dist/testimonials-twitter-cards.d.cts +14 -1
  45. package/dist/testimonials-twitter-cards.d.ts +14 -1
  46. package/dist/testimonials-twitter-cards.js +151 -26
  47. package/dist/testimonials-wall-compact.cjs +529 -50
  48. package/dist/testimonials-wall-compact.d.cts +14 -1
  49. package/dist/testimonials-wall-compact.d.ts +14 -1
  50. package/dist/testimonials-wall-compact.js +526 -44
  51. package/package.json +1 -1
@@ -1000,10 +1000,10 @@ function TestimonialsImagesHelpful({
1000
1000
  review.title && (typeof review.title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-medium", children: review.title }) : review.title)
1001
1001
  ] }),
1002
1002
  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),
1003
- 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(
1003
+ review.images && review.images.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-wrap gap-4", imagesClassName), children: review.images.map((image, imgIndex) => /* @__PURE__ */ jsxRuntime.jsx(
1004
1004
  "div",
1005
1005
  {
1006
- 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",
1006
+ className: "size-20 cursor-pointer overflow-hidden rounded-lg sm:size-24 transition-transform duration-300 hover:scale-[1.03] shadow-lg hover:shadow-xl ring-4 ring-primary",
1007
1007
  onClick: () => handleImageClick(review.images, imgIndex),
1008
1008
  role: "button",
1009
1009
  tabIndex: 0,
@@ -1026,80 +1026,91 @@ function TestimonialsImagesHelpful({
1026
1026
  },
1027
1027
  imgIndex
1028
1028
  )) }),
1029
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center justify-between w-full"), children: [
1030
- /* @__PURE__ */ jsxRuntime.jsxs(
1031
- "div",
1032
- {
1033
- className: cn("flex items-center gap-5", authorClassName),
1034
- children: [
1035
- /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-12 ring-4 ring-primary shadow-lg", children: [
1036
- /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
1037
- /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-md", children: getInitials(authorName) })
1038
- ] }),
1039
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-start gap-0", children: [
1040
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1041
- review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: review.author }) : review.author),
1042
- review.verified && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1", children: [
1043
- /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/badge-check", size: 18 }),
1044
- verifiedPurchaseLabel && (typeof verifiedPurchaseLabel === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: verifiedPurchaseLabel }) : verifiedPurchaseLabel),
1045
- !verifiedPurchaseLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: "Verified Purchase" })
1046
- ] })
1047
- ] }),
1048
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
1049
- review.date && /* @__PURE__ */ jsxRuntime.jsx("span", { children: review.date }),
1050
- review.variant && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1051
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\xB7" }),
1052
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: review.variant })
1029
+ /* @__PURE__ */ jsxRuntime.jsxs(
1030
+ "div",
1031
+ {
1032
+ className: cn(
1033
+ "flex items-center justify-between w-full flex-col md:flex-row gap-4"
1034
+ ),
1035
+ children: [
1036
+ /* @__PURE__ */ jsxRuntime.jsxs(
1037
+ "div",
1038
+ {
1039
+ className: cn(
1040
+ "flex items-center gap-5 w-full",
1041
+ authorClassName
1042
+ ),
1043
+ children: [
1044
+ /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "size-12 ring-4 ring-primary shadow-lg", children: [
1045
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
1046
+ /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-md", children: getInitials(authorName) })
1047
+ ] }),
1048
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-start gap-0", children: [
1049
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 flex-col md:flex-row", children: [
1050
+ review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", children: review.author }) : review.author),
1051
+ review.verified && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-1", children: [
1052
+ /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/badge-check", size: 18 }),
1053
+ verifiedPurchaseLabel && (typeof verifiedPurchaseLabel === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: verifiedPurchaseLabel }) : verifiedPurchaseLabel),
1054
+ !verifiedPurchaseLabel && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: "Verified Purchase" })
1055
+ ] })
1056
+ ] }),
1057
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
1058
+ review.date && /* @__PURE__ */ jsxRuntime.jsx("span", { children: review.date }),
1059
+ review.variant && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1060
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\xB7" }),
1061
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: review.variant })
1062
+ ] })
1063
+ ] })
1053
1064
  ] })
1054
- ] })
1055
- ] })
1056
- ]
1057
- }
1058
- ),
1059
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
1060
- /* @__PURE__ */ jsxRuntime.jsxs(
1061
- Pressable,
1062
- {
1063
- asButton: true,
1064
- variant: "ghost",
1065
- size: "sm",
1066
- className: cn(
1067
- "h-8 gap-1.5",
1068
- helpfulClicked.has(index) ? "text-foreground" : "text-muted-foreground"
1065
+ ]
1066
+ }
1067
+ ),
1068
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
1069
+ /* @__PURE__ */ jsxRuntime.jsxs(
1070
+ Pressable,
1071
+ {
1072
+ asButton: true,
1073
+ variant: "ghost",
1074
+ size: "sm",
1075
+ className: cn(
1076
+ "h-8 gap-1.5",
1077
+ helpfulClicked.has(index) ? "text-foreground" : "text-muted-foreground"
1078
+ ),
1079
+ onClick: () => handleHelpful(index),
1080
+ children: [
1081
+ /* @__PURE__ */ jsxRuntime.jsx(
1082
+ DynamicIcon,
1083
+ {
1084
+ name: "lucide/thumbs-up",
1085
+ size: 16,
1086
+ className: cn(
1087
+ helpfulClicked.has(index) && "fill-current"
1088
+ )
1089
+ }
1090
+ ),
1091
+ "Helpful",
1092
+ review.helpful !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1093
+ "(",
1094
+ review.helpful + (helpfulClicked.has(index) ? 1 : 0),
1095
+ ")"
1096
+ ] })
1097
+ ]
1098
+ }
1069
1099
  ),
1070
- onClick: () => handleHelpful(index),
1071
- children: [
1072
- /* @__PURE__ */ jsxRuntime.jsx(
1073
- DynamicIcon,
1074
- {
1075
- name: "lucide/thumbs-up",
1076
- size: 16,
1077
- className: cn(
1078
- helpfulClicked.has(index) && "fill-current"
1079
- )
1080
- }
1081
- ),
1082
- "Helpful",
1083
- review.helpful !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
1084
- "(",
1085
- review.helpful + (helpfulClicked.has(index) ? 1 : 0),
1086
- ")"
1087
- ] })
1088
- ]
1089
- }
1090
- ),
1091
- /* @__PURE__ */ jsxRuntime.jsx(
1092
- Pressable,
1093
- {
1094
- asButton: true,
1095
- variant: "ghost",
1096
- size: "sm",
1097
- className: "h-8 text-muted-foreground",
1098
- children: reportButtonLabel ?? "Report"
1099
- }
1100
- )
1101
- ] })
1102
- ] })
1100
+ /* @__PURE__ */ jsxRuntime.jsx(
1101
+ Pressable,
1102
+ {
1103
+ asButton: true,
1104
+ variant: "ghost",
1105
+ size: "sm",
1106
+ className: "h-8 text-muted-foreground",
1107
+ children: reportButtonLabel ?? "Report"
1108
+ }
1109
+ )
1110
+ ] })
1111
+ ]
1112
+ }
1113
+ )
1103
1114
  ] })
1104
1115
  ] }, index);
1105
1116
  }) });
@@ -977,10 +977,10 @@ function TestimonialsImagesHelpful({
977
977
  review.title && (typeof review.title === "string" ? /* @__PURE__ */ jsx("h3", { className: "font-medium", children: review.title }) : review.title)
978
978
  ] }),
979
979
  review.content && (typeof review.content === "string" ? /* @__PURE__ */ jsx("p", { className: "text-base md:text-lg leading-relaxed font-light", children: review.content }) : review.content),
980
- review.images && review.images.length > 0 && /* @__PURE__ */ jsx("div", { className: cn("flex gap-3", imagesClassName), children: review.images.map((image, imgIndex) => /* @__PURE__ */ jsx(
980
+ review.images && review.images.length > 0 && /* @__PURE__ */ jsx("div", { className: cn("flex flex-wrap gap-4", imagesClassName), children: review.images.map((image, imgIndex) => /* @__PURE__ */ jsx(
981
981
  "div",
982
982
  {
983
- 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",
983
+ className: "size-20 cursor-pointer overflow-hidden rounded-lg sm:size-24 transition-transform duration-300 hover:scale-[1.03] shadow-lg hover:shadow-xl ring-4 ring-primary",
984
984
  onClick: () => handleImageClick(review.images, imgIndex),
985
985
  role: "button",
986
986
  tabIndex: 0,
@@ -1003,80 +1003,91 @@ function TestimonialsImagesHelpful({
1003
1003
  },
1004
1004
  imgIndex
1005
1005
  )) }),
1006
- /* @__PURE__ */ jsxs("div", { className: cn("flex items-center justify-between w-full"), children: [
1007
- /* @__PURE__ */ jsxs(
1008
- "div",
1009
- {
1010
- className: cn("flex items-center gap-5", authorClassName),
1011
- children: [
1012
- /* @__PURE__ */ jsxs(Avatar, { className: "size-12 ring-4 ring-primary shadow-lg", children: [
1013
- /* @__PURE__ */ jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
1014
- /* @__PURE__ */ jsx(AvatarFallback, { className: "text-md", children: getInitials(authorName) })
1015
- ] }),
1016
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-start gap-0", children: [
1017
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
1018
- review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsx("span", { className: "font-medium", children: review.author }) : review.author),
1019
- review.verified && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
1020
- /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/badge-check", size: 18 }),
1021
- verifiedPurchaseLabel && (typeof verifiedPurchaseLabel === "string" ? /* @__PURE__ */ jsx("span", { className: "text-sm", children: verifiedPurchaseLabel }) : verifiedPurchaseLabel),
1022
- !verifiedPurchaseLabel && /* @__PURE__ */ jsx("span", { className: "text-sm", children: "Verified Purchase" })
1023
- ] })
1024
- ] }),
1025
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
1026
- review.date && /* @__PURE__ */ jsx("span", { children: review.date }),
1027
- review.variant && /* @__PURE__ */ jsxs(Fragment, { children: [
1028
- /* @__PURE__ */ jsx("span", { children: "\xB7" }),
1029
- /* @__PURE__ */ jsx("span", { children: review.variant })
1006
+ /* @__PURE__ */ jsxs(
1007
+ "div",
1008
+ {
1009
+ className: cn(
1010
+ "flex items-center justify-between w-full flex-col md:flex-row gap-4"
1011
+ ),
1012
+ children: [
1013
+ /* @__PURE__ */ jsxs(
1014
+ "div",
1015
+ {
1016
+ className: cn(
1017
+ "flex items-center gap-5 w-full",
1018
+ authorClassName
1019
+ ),
1020
+ children: [
1021
+ /* @__PURE__ */ jsxs(Avatar, { className: "size-12 ring-4 ring-primary shadow-lg", children: [
1022
+ /* @__PURE__ */ jsx(AvatarImage, { src: review.avatarSrc, alt: authorName }),
1023
+ /* @__PURE__ */ jsx(AvatarFallback, { className: "text-md", children: getInitials(authorName) })
1024
+ ] }),
1025
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-start gap-0", children: [
1026
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-col md:flex-row", children: [
1027
+ review.author && (typeof review.author === "string" ? /* @__PURE__ */ jsx("span", { className: "font-medium", children: review.author }) : review.author),
1028
+ review.verified && /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
1029
+ /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/badge-check", size: 18 }),
1030
+ verifiedPurchaseLabel && (typeof verifiedPurchaseLabel === "string" ? /* @__PURE__ */ jsx("span", { className: "text-sm", children: verifiedPurchaseLabel }) : verifiedPurchaseLabel),
1031
+ !verifiedPurchaseLabel && /* @__PURE__ */ jsx("span", { className: "text-sm", children: "Verified Purchase" })
1032
+ ] })
1033
+ ] }),
1034
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm", children: [
1035
+ review.date && /* @__PURE__ */ jsx("span", { children: review.date }),
1036
+ review.variant && /* @__PURE__ */ jsxs(Fragment, { children: [
1037
+ /* @__PURE__ */ jsx("span", { children: "\xB7" }),
1038
+ /* @__PURE__ */ jsx("span", { children: review.variant })
1039
+ ] })
1040
+ ] })
1030
1041
  ] })
1031
- ] })
1032
- ] })
1033
- ]
1034
- }
1035
- ),
1036
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
1037
- /* @__PURE__ */ jsxs(
1038
- Pressable,
1039
- {
1040
- asButton: true,
1041
- variant: "ghost",
1042
- size: "sm",
1043
- className: cn(
1044
- "h-8 gap-1.5",
1045
- helpfulClicked.has(index) ? "text-foreground" : "text-muted-foreground"
1042
+ ]
1043
+ }
1044
+ ),
1045
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4", children: [
1046
+ /* @__PURE__ */ jsxs(
1047
+ Pressable,
1048
+ {
1049
+ asButton: true,
1050
+ variant: "ghost",
1051
+ size: "sm",
1052
+ className: cn(
1053
+ "h-8 gap-1.5",
1054
+ helpfulClicked.has(index) ? "text-foreground" : "text-muted-foreground"
1055
+ ),
1056
+ onClick: () => handleHelpful(index),
1057
+ children: [
1058
+ /* @__PURE__ */ jsx(
1059
+ DynamicIcon,
1060
+ {
1061
+ name: "lucide/thumbs-up",
1062
+ size: 16,
1063
+ className: cn(
1064
+ helpfulClicked.has(index) && "fill-current"
1065
+ )
1066
+ }
1067
+ ),
1068
+ "Helpful",
1069
+ review.helpful !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
1070
+ "(",
1071
+ review.helpful + (helpfulClicked.has(index) ? 1 : 0),
1072
+ ")"
1073
+ ] })
1074
+ ]
1075
+ }
1046
1076
  ),
1047
- onClick: () => handleHelpful(index),
1048
- children: [
1049
- /* @__PURE__ */ jsx(
1050
- DynamicIcon,
1051
- {
1052
- name: "lucide/thumbs-up",
1053
- size: 16,
1054
- className: cn(
1055
- helpfulClicked.has(index) && "fill-current"
1056
- )
1057
- }
1058
- ),
1059
- "Helpful",
1060
- review.helpful !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
1061
- "(",
1062
- review.helpful + (helpfulClicked.has(index) ? 1 : 0),
1063
- ")"
1064
- ] })
1065
- ]
1066
- }
1067
- ),
1068
- /* @__PURE__ */ jsx(
1069
- Pressable,
1070
- {
1071
- asButton: true,
1072
- variant: "ghost",
1073
- size: "sm",
1074
- className: "h-8 text-muted-foreground",
1075
- children: reportButtonLabel ?? "Report"
1076
- }
1077
- )
1078
- ] })
1079
- ] })
1077
+ /* @__PURE__ */ jsx(
1078
+ Pressable,
1079
+ {
1080
+ asButton: true,
1081
+ variant: "ghost",
1082
+ size: "sm",
1083
+ className: "h-8 text-muted-foreground",
1084
+ children: reportButtonLabel ?? "Report"
1085
+ }
1086
+ )
1087
+ ] })
1088
+ ]
1089
+ }
1090
+ )
1080
1091
  ] })
1081
1092
  ] }, index);
1082
1093
  }) });
@@ -584,6 +584,7 @@ function TestimonialsListVerified({
584
584
  pattern,
585
585
  patternOpacity,
586
586
  className,
587
+ containerClassName,
587
588
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-full md:max-w-3xl", children: [
588
589
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mb-12 md:mb-24 space-y-6", headerClassName), children: [
589
590
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -561,6 +561,7 @@ function TestimonialsListVerified({
561
561
  pattern,
562
562
  patternOpacity,
563
563
  className,
564
+ containerClassName,
564
565
  children: /* @__PURE__ */ jsxs("div", { className: "mx-auto max-w-full md:max-w-3xl", children: [
565
566
  /* @__PURE__ */ jsxs("div", { className: cn("mb-12 md:mb-24 space-y-6", headerClassName), children: [
566
567
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
@@ -558,7 +558,7 @@ function TestimonialsLogoCards({
558
558
  src: testimonial.companyLogo,
559
559
  alt: testimonial.companyLogoAlt || "Company logo",
560
560
  className: cn(
561
- index === 0 ? "h-10" : "h-5",
561
+ index === 0 ? "h-10" : "h-10 md:h-5",
562
562
  "w-auto object-contain"
563
563
  ),
564
564
  optixFlowConfig
@@ -576,8 +576,8 @@ function TestimonialsLogoCards({
576
576
  "blockquote",
577
577
  {
578
578
  className: cn(
579
- "leading-relaxed",
580
- index === 0 ? "text-lg md:text-xl font-light" : "text-sm md:text-base",
579
+ "leading-relaxed font-light",
580
+ index === 0 ? "text-base md:text-xl" : "text-base md:text-base",
581
581
  quoteClassName
582
582
  ),
583
583
  children: testimonial.quote
@@ -599,7 +599,7 @@ function TestimonialsLogoCards({
599
599
  ),
600
600
  /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
601
601
  testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("cite", { className: "text-sm md:text-base font-medium", children: testimonial.author }) : testimonial.author),
602
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs md:text-sm", children: testimonial.role }) : testimonial.role)
602
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm opacity-75 font-semibold", children: testimonial.role }) : testimonial.role)
603
603
  ] })
604
604
  ] })
605
605
  ]
@@ -639,7 +639,10 @@ function TestimonialsLogoCards({
639
639
  /* @__PURE__ */ jsxRuntime.jsxs(
640
640
  "div",
641
641
  {
642
- className: cn("mx-auto mb-12 max-w-2xl text-center", headerClassName),
642
+ className: cn(
643
+ "mx-auto mb-12 max-w-full md:max-w-2xl text-center",
644
+ headerClassName
645
+ ),
643
646
  children: [
644
647
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
645
648
  "h2",
@@ -533,7 +533,7 @@ function TestimonialsLogoCards({
533
533
  src: testimonial.companyLogo,
534
534
  alt: testimonial.companyLogoAlt || "Company logo",
535
535
  className: cn(
536
- index === 0 ? "h-10" : "h-5",
536
+ index === 0 ? "h-10" : "h-10 md:h-5",
537
537
  "w-auto object-contain"
538
538
  ),
539
539
  optixFlowConfig
@@ -551,8 +551,8 @@ function TestimonialsLogoCards({
551
551
  "blockquote",
552
552
  {
553
553
  className: cn(
554
- "leading-relaxed",
555
- index === 0 ? "text-lg md:text-xl font-light" : "text-sm md:text-base",
554
+ "leading-relaxed font-light",
555
+ index === 0 ? "text-base md:text-xl" : "text-base md:text-base",
556
556
  quoteClassName
557
557
  ),
558
558
  children: testimonial.quote
@@ -574,7 +574,7 @@ function TestimonialsLogoCards({
574
574
  ),
575
575
  /* @__PURE__ */ jsxs("div", { children: [
576
576
  testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsx("cite", { className: "text-sm md:text-base font-medium", children: testimonial.author }) : testimonial.author),
577
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-xs md:text-sm", children: testimonial.role }) : testimonial.role)
577
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsx("p", { className: "text-sm opacity-75 font-semibold", children: testimonial.role }) : testimonial.role)
578
578
  ] })
579
579
  ] })
580
580
  ]
@@ -614,7 +614,10 @@ function TestimonialsLogoCards({
614
614
  /* @__PURE__ */ jsxs(
615
615
  "div",
616
616
  {
617
- className: cn("mx-auto mb-12 max-w-2xl text-center", headerClassName),
617
+ className: cn(
618
+ "mx-auto mb-12 max-w-full md:max-w-2xl text-center",
619
+ headerClassName
620
+ ),
618
621
  children: [
619
622
  heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
620
623
  "h2",
@@ -872,6 +872,70 @@ var Pressable = React3__namespace.forwardRef(
872
872
  }
873
873
  );
874
874
  Pressable.displayName = "Pressable";
875
+ var MOBILE_CLASSES = {
876
+ "fit-left": "items-start md:items-center",
877
+ "fit-center": "items-center",
878
+ "fit-right": "items-end md:items-center",
879
+ "full-left": "items-stretch md:items-center",
880
+ "full-center": "items-stretch md:items-center",
881
+ "full-right": "items-stretch md:items-center"
882
+ };
883
+ function BlockActions({
884
+ mobileConfig,
885
+ actionsClassName,
886
+ verticalSpacing = "mt-4 md:mt-8",
887
+ actions,
888
+ actionsSlot
889
+ }) {
890
+ const width = mobileConfig?.width ?? "full";
891
+ const position = mobileConfig?.position ?? "center";
892
+ const mobileLayoutClass = MOBILE_CLASSES[`${width}-${position}`];
893
+ if (actionsSlot) {
894
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { children: actionsSlot });
895
+ } else if (actions && actions?.length > 0) {
896
+ return /* @__PURE__ */ jsxRuntime.jsx(
897
+ "div",
898
+ {
899
+ className: cn(
900
+ "flex flex-col md:flex-row flex-wrap gap-4",
901
+ mobileLayoutClass,
902
+ actionsClassName,
903
+ verticalSpacing
904
+ ),
905
+ children: actions.map((action, index) => /* @__PURE__ */ jsxRuntime.jsx(ActionComponent, { action }, index))
906
+ }
907
+ );
908
+ } else {
909
+ return null;
910
+ }
911
+ }
912
+ function ActionComponent({ action }) {
913
+ const {
914
+ label,
915
+ icon,
916
+ iconAfter,
917
+ children,
918
+ href,
919
+ onClick,
920
+ className: actionClassName,
921
+ ...pressableProps
922
+ } = action;
923
+ return /* @__PURE__ */ jsxRuntime.jsx(
924
+ Pressable,
925
+ {
926
+ href,
927
+ onClick,
928
+ asButton: action.asButton ?? true,
929
+ className: actionClassName,
930
+ ...pressableProps,
931
+ children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
932
+ icon,
933
+ label,
934
+ iconAfter
935
+ ] })
936
+ }
937
+ );
938
+ }
875
939
  function TestimonialsMasonryGrid({
876
940
  testimonials,
877
941
  testimonialsSlot,
@@ -887,9 +951,12 @@ function TestimonialsMasonryGrid({
887
951
  authorClassName,
888
952
  background,
889
953
  containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
890
- spacing = "xl",
954
+ spacing = "lg",
891
955
  pattern,
892
- patternOpacity
956
+ patternOpacity,
957
+ actions,
958
+ actionsSlot,
959
+ actionsClassName
893
960
  }) {
894
961
  const columns = testimonials ? [
895
962
  testimonials.filter((_, i) => i % 3 === 0),
@@ -930,29 +997,29 @@ function TestimonialsMasonryGrid({
930
997
  "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border shadow-sm"
931
998
  ),
932
999
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full flex-col justify-between p-6 gap-8", children: [
933
- testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: "text-sm leading-relaxed line-clamp-3", children: [
1000
+ testimonial.quote && (typeof testimonial.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: "text-lg leading-relaxed line-clamp-6 md:line-clamp-3 font-thin", children: [
934
1001
  "\u201C",
935
1002
  testimonial.quote,
936
1003
  "\u201D"
937
- ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line-clamp-3", children: testimonial.quote })),
938
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 flex items-center gap-3", children: [
939
- /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "relative flex shrink-0 overflow-hidden rounded-full size-12 ring-4 ring-primary shadow-lg", children: [
1004
+ ] }) : testimonial.quote),
1005
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-4 flex items-center gap-4", children: [
1006
+ /* @__PURE__ */ jsxRuntime.jsxs(Avatar, { className: "relative flex shrink-0 overflow-hidden rounded-full size-14 ring-4 ring-primary shadow-lg", children: [
940
1007
  /* @__PURE__ */ jsxRuntime.jsx(AvatarImage, { src: avatarSrc, alt: authorName }),
941
1008
  /* @__PURE__ */ jsxRuntime.jsx(AvatarFallback, { className: "text-xs", children: getInitials(authorName) })
942
1009
  ] }),
943
1010
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-0 leading-tight", children: [
944
1011
  testimonial.author && (typeof testimonial.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: testimonial.author }) : testimonial.author),
945
- testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs", children: testimonial.role }) : testimonial.role),
1012
+ testimonial.role && (typeof testimonial.role === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-thin opacity-75", children: testimonial.role }) : testimonial.role),
946
1013
  testimonial.linkConfig?.href && /* @__PURE__ */ jsxRuntime.jsx(
947
1014
  Pressable,
948
1015
  {
949
1016
  href: testimonial.linkConfig.href,
950
1017
  className: cn(
951
- "text-sm transition-all duration-300",
952
- "underline underline-offset-4",
1018
+ "text-sm transition-all duration-500",
1019
+ "hover:underline hover:underline-offset-4",
953
1020
  testimonial.linkConfig.className
954
1021
  ),
955
- children: testimonial.linkConfig.label
1022
+ children: testimonial.linkConfig.label || "Full Review"
956
1023
  }
957
1024
  )
958
1025
  ] })
@@ -1014,7 +1081,16 @@ function TestimonialsMasonryGrid({
1014
1081
  ]
1015
1082
  }
1016
1083
  ),
1017
- renderedTestimonials
1084
+ renderedTestimonials,
1085
+ /* @__PURE__ */ jsxRuntime.jsx(
1086
+ BlockActions,
1087
+ {
1088
+ actions,
1089
+ actionsSlot,
1090
+ actionsClassName: cn("mt-8 md:mt-12 justify-center", actionsClassName),
1091
+ mobileConfig: { width: "full", position: "center" }
1092
+ }
1093
+ )
1018
1094
  ]
1019
1095
  }
1020
1096
  );
@@ -1,5 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { S as SectionBackground, s as SectionSpacing, t as PatternName } from './community-initiatives-B8KCpwXH.cjs';
3
+ import { ActionConfig } from '@page-speed/maps/components/geo-map';
3
4
  import { T as TestimonialItem } from './blocks-BtDAbw8d.cjs';
4
5
  import 'react/jsx-runtime';
5
6
  import 'class-variance-authority';
@@ -76,6 +77,18 @@ interface TestimonialsMasonryGridProps {
76
77
  * Additional CSS classes for the container
77
78
  */
78
79
  containerClassName?: string;
80
+ /**
81
+ * Array of action configurations for CTA buttons
82
+ */
83
+ actions?: ActionConfig[];
84
+ /**
85
+ * Custom slot for rendering actions (overrides actions array)
86
+ */
87
+ actionsSlot?: React.ReactNode;
88
+ /**
89
+ * Additional CSS classes for the actions container
90
+ */
91
+ actionsClassName?: string;
79
92
  }
80
93
  /**
81
94
  * TestimonialsMasonryGrid - A masonry-style grid layout for testimonials with varying
@@ -102,6 +115,6 @@ interface TestimonialsMasonryGridProps {
102
115
  * />
103
116
  * ```
104
117
  */
105
- declare function TestimonialsMasonryGrid({ testimonials, testimonialsSlot, heading, description, className, headerClassName, headingClassName, descriptionClassName, gridClassName, cardClassName, quoteClassName, authorClassName, background, containerClassName, spacing, pattern, patternOpacity, }: TestimonialsMasonryGridProps): React.JSX.Element;
118
+ declare function TestimonialsMasonryGrid({ testimonials, testimonialsSlot, heading, description, className, headerClassName, headingClassName, descriptionClassName, gridClassName, cardClassName, quoteClassName, authorClassName, background, containerClassName, spacing, pattern, patternOpacity, actions, actionsSlot, actionsClassName, }: TestimonialsMasonryGridProps): React.JSX.Element;
106
119
 
107
120
  export { TestimonialsMasonryGrid, type TestimonialsMasonryGridProps };