@opensite/ui 2.8.5 → 2.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/about-developer-profile.cjs +17 -10
  2. package/dist/about-developer-profile.js +17 -10
  3. package/dist/article-chapters-author.cjs +17 -10
  4. package/dist/article-chapters-author.js +17 -10
  5. package/dist/carousel-animated-sections.cjs +79 -25
  6. package/dist/carousel-animated-sections.d.cts +7 -2
  7. package/dist/carousel-animated-sections.d.ts +7 -2
  8. package/dist/carousel-animated-sections.js +79 -25
  9. package/dist/carousel-gallery-thumbnails.cjs +79 -25
  10. package/dist/carousel-gallery-thumbnails.d.cts +7 -2
  11. package/dist/carousel-gallery-thumbnails.d.ts +7 -2
  12. package/dist/carousel-gallery-thumbnails.js +79 -25
  13. package/dist/carousel-portfolio-hero.cjs +79 -25
  14. package/dist/carousel-portfolio-hero.d.cts +7 -2
  15. package/dist/carousel-portfolio-hero.d.ts +7 -2
  16. package/dist/carousel-portfolio-hero.js +79 -25
  17. package/dist/components.cjs +35 -10
  18. package/dist/components.d.cts +29 -2
  19. package/dist/components.d.ts +29 -2
  20. package/dist/components.js +35 -11
  21. package/dist/footer-accordion-social.cjs +17 -10
  22. package/dist/footer-accordion-social.js +17 -10
  23. package/dist/footer-animated-social.cjs +17 -10
  24. package/dist/footer-animated-social.js +17 -10
  25. package/dist/footer-brand-description.cjs +17 -10
  26. package/dist/footer-brand-description.js +17 -10
  27. package/dist/footer-brand-links-contact.cjs +17 -10
  28. package/dist/footer-brand-links-contact.js +17 -10
  29. package/dist/footer-comprehensive-links.cjs +17 -10
  30. package/dist/footer-comprehensive-links.js +17 -10
  31. package/dist/footer-contact-card.cjs +17 -10
  32. package/dist/footer-contact-card.js +17 -10
  33. package/dist/footer-cta-banner.cjs +17 -10
  34. package/dist/footer-cta-banner.js +17 -10
  35. package/dist/footer-cta-social.cjs +17 -10
  36. package/dist/footer-cta-social.js +17 -10
  37. package/dist/footer-info-cards-accordion.cjs +17 -10
  38. package/dist/footer-info-cards-accordion.js +17 -10
  39. package/dist/footer-nav-social.cjs +17 -10
  40. package/dist/footer-nav-social.js +17 -10
  41. package/dist/footer-newsletter-contact.cjs +17 -10
  42. package/dist/footer-newsletter-contact.js +17 -10
  43. package/dist/footer-newsletter-grid.cjs +17 -10
  44. package/dist/footer-newsletter-grid.js +17 -10
  45. package/dist/footer-newsletter-minimal.cjs +17 -10
  46. package/dist/footer-newsletter-minimal.js +17 -10
  47. package/dist/footer-social-apps.cjs +17 -10
  48. package/dist/footer-social-apps.js +17 -10
  49. package/dist/footer-social-newsletter.cjs +17 -10
  50. package/dist/footer-social-newsletter.js +17 -10
  51. package/dist/footer-split-image-accordion.cjs +17 -10
  52. package/dist/footer-split-image-accordion.js +17 -10
  53. package/dist/hero-badge-shadow-overlay.cjs +1 -1
  54. package/dist/hero-badge-shadow-overlay.js +1 -1
  55. package/dist/hero-coming-soon-countdown.cjs +17 -10
  56. package/dist/hero-coming-soon-countdown.js +17 -10
  57. package/dist/hero-video-background-dark.cjs +78 -16
  58. package/dist/hero-video-background-dark.d.cts +7 -2
  59. package/dist/hero-video-background-dark.d.ts +7 -2
  60. package/dist/hero-video-background-dark.js +78 -16
  61. package/dist/index.cjs +35 -10
  62. package/dist/index.d.cts +1 -0
  63. package/dist/index.d.ts +1 -0
  64. package/dist/index.js +35 -11
  65. package/dist/link-page-bento-layout.cjs +17 -10
  66. package/dist/link-page-bento-layout.js +17 -10
  67. package/dist/link-page-grid-cards.cjs +17 -10
  68. package/dist/link-page-grid-cards.js +17 -10
  69. package/dist/link-page-minimal-profile.cjs +17 -10
  70. package/dist/link-page-minimal-profile.js +17 -10
  71. package/dist/link-page-newsletter-social.cjs +17 -10
  72. package/dist/link-page-newsletter-social.js +17 -10
  73. package/dist/link-tree-block.cjs +17 -10
  74. package/dist/link-tree-block.js +17 -10
  75. package/dist/navbar-fullscreen-menu.cjs +17 -10
  76. package/dist/navbar-fullscreen-menu.js +17 -10
  77. package/dist/navbar-transparent-overlay.cjs +17 -10
  78. package/dist/navbar-transparent-overlay.js +17 -10
  79. package/dist/registry.cjs +1398 -851
  80. package/dist/registry.js +1398 -851
  81. package/dist/social-link-icon.cjs +17 -10
  82. package/dist/social-link-icon.d.cts +5 -0
  83. package/dist/social-link-icon.d.ts +5 -0
  84. package/dist/social-link-icon.js +17 -10
  85. package/dist/testimonials-animated-split.cjs +5 -5
  86. package/dist/testimonials-animated-split.js +5 -5
  87. package/dist/testimonials-bento-grid.cjs +48 -56
  88. package/dist/testimonials-bento-grid.js +48 -56
  89. package/dist/testimonials-carousel-image.cjs +608 -96
  90. package/dist/testimonials-carousel-image.d.cts +26 -2
  91. package/dist/testimonials-carousel-image.d.ts +26 -2
  92. package/dist/testimonials-carousel-image.js +609 -97
  93. package/dist/testimonials-centered-avatars.cjs +89 -62
  94. package/dist/testimonials-centered-avatars.d.cts +5 -1
  95. package/dist/testimonials-centered-avatars.d.ts +5 -1
  96. package/dist/testimonials-centered-avatars.js +89 -62
  97. package/dist/testimonials-company-logo.cjs +6 -6
  98. package/dist/testimonials-company-logo.js +6 -6
  99. package/dist/testimonials-grid-add-review.cjs +51 -29
  100. package/dist/testimonials-grid-add-review.js +51 -29
  101. package/dist/testimonials-images-helpful.cjs +181 -160
  102. package/dist/testimonials-images-helpful.d.cts +9 -1
  103. package/dist/testimonials-images-helpful.d.ts +9 -1
  104. package/dist/testimonials-images-helpful.js +181 -159
  105. package/dist/testimonials-list-verified.cjs +63 -44
  106. package/dist/testimonials-list-verified.d.cts +5 -1
  107. package/dist/testimonials-list-verified.d.ts +5 -1
  108. package/dist/testimonials-list-verified.js +64 -45
  109. package/dist/testimonials-logo-cards.cjs +53 -29
  110. package/dist/testimonials-logo-cards.d.cts +5 -1
  111. package/dist/testimonials-logo-cards.d.ts +5 -1
  112. package/dist/testimonials-logo-cards.js +53 -29
  113. package/dist/testimonials-marquee.cjs +524 -102
  114. package/dist/testimonials-marquee.d.cts +5 -1
  115. package/dist/testimonials-marquee.d.ts +5 -1
  116. package/dist/testimonials-marquee.js +525 -100
  117. package/dist/testimonials-mini-dividers.cjs +120 -83
  118. package/dist/testimonials-mini-dividers.d.cts +10 -6
  119. package/dist/testimonials-mini-dividers.d.ts +10 -6
  120. package/dist/testimonials-mini-dividers.js +120 -83
  121. package/dist/testimonials-minimal-numbered.cjs +7 -6
  122. package/dist/testimonials-minimal-numbered.d.cts +5 -1
  123. package/dist/testimonials-minimal-numbered.d.ts +5 -1
  124. package/dist/testimonials-minimal-numbered.js +7 -6
  125. package/dist/testimonials-parallax-number.cjs +14 -8
  126. package/dist/testimonials-parallax-number.js +14 -8
  127. package/dist/testimonials-scrolling-columns.cjs +97 -13
  128. package/dist/testimonials-scrolling-columns.js +97 -13
  129. package/dist/testimonials-simple-grid.cjs +513 -68
  130. package/dist/testimonials-simple-grid.d.cts +9 -5
  131. package/dist/testimonials-simple-grid.d.ts +9 -5
  132. package/dist/testimonials-simple-grid.js +510 -62
  133. package/dist/testimonials-slider-minimal.cjs +604 -90
  134. package/dist/testimonials-slider-minimal.d.cts +17 -1
  135. package/dist/testimonials-slider-minimal.d.ts +17 -1
  136. package/dist/testimonials-slider-minimal.js +598 -81
  137. package/dist/testimonials-split-image.cjs +452 -17
  138. package/dist/testimonials-split-image.js +448 -13
  139. package/dist/testimonials-twitter-cards.cjs +26 -14
  140. package/dist/testimonials-twitter-cards.js +26 -14
  141. package/package.json +11 -1
@@ -117,10 +117,15 @@ interface CarouselGalleryThumbnailsProps {
117
117
  */
118
118
  patternOpacity?: number;
119
119
  /**
120
- * Brightness level for slide images (controls overlay visibility)
120
+ * Intensity of the gradient overlay on slide images
121
+ * @default "default"
122
+ */
123
+ slideMediaOverlayIntensity?: "low" | "default" | "high" | "very-high";
124
+ /**
125
+ * Brightness level for slide images (deprecated - prefer slideMediaOverlayIntensity)
121
126
  */
122
127
  slideMediaBrightness?: "10" | "20" | "25" | "30" | "40" | "50" | "75" | "100";
123
128
  }
124
- declare function CarouselGalleryThumbnails({ images, imagesSlot, autoPlay, autoPlayInterval, showThumbnails, className, containerClassName, slideClassName, navigationClassName, captionClassName, thumbnailsClassName, thumbnailClassName, optixFlowConfig, background, spacing, pattern, patternOpacity, slideMediaBrightness, }: CarouselGalleryThumbnailsProps): React.JSX.Element;
129
+ declare function CarouselGalleryThumbnails({ images, imagesSlot, autoPlay, autoPlayInterval, showThumbnails, className, containerClassName, slideClassName, navigationClassName, captionClassName, thumbnailsClassName, thumbnailClassName, optixFlowConfig, background, spacing, pattern, patternOpacity, slideMediaBrightness, slideMediaOverlayIntensity, }: CarouselGalleryThumbnailsProps): React.JSX.Element;
125
130
 
126
131
  export { CarouselGalleryThumbnails, type CarouselGalleryThumbnailsProps, type GalleryImage };
@@ -12,16 +12,6 @@ import { Img } from '@page-speed/img';
12
12
  function cn(...inputs) {
13
13
  return twMerge(clsx(inputs));
14
14
  }
15
- var BRIGHTNESS_CLASS_MAP = {
16
- "10": "brightness-[.1]",
17
- "20": "brightness-[.2]",
18
- "25": "brightness-[.25]",
19
- "30": "brightness-[.3]",
20
- "40": "brightness-[.4]",
21
- "50": "brightness-50",
22
- "75": "brightness-75",
23
- "100": "brightness-100"
24
- };
25
15
  function normalizePhoneNumber(input) {
26
16
  const trimmed = input.trim();
27
17
  if (trimmed.toLowerCase().startsWith("tel:")) {
@@ -448,6 +438,67 @@ var DynamicIcon = React.memo(function DynamicIcon2({
448
438
  return /* @__PURE__ */ jsx(Icon, { ...props, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
449
439
  });
450
440
  DynamicIcon.displayName = "DynamicIcon";
441
+ var DIRECTION_STYLES = {
442
+ "bottom-to-top": "bg-linear-to-t",
443
+ "top-to-bottom": "bg-linear-to-b",
444
+ "left-to-right": "bg-linear-to-r",
445
+ "right-to-left": "bg-linear-to-l",
446
+ "bottom-left-to-top-right": "bg-linear-to-tr",
447
+ "bottom-right-to-top-left": "bg-linear-to-tl",
448
+ "top-left-to-bottom-right": "bg-linear-to-br",
449
+ "top-right-to-bottom-left": "bg-linear-to-bl"
450
+ };
451
+ var INTENSITY_STOPS = {
452
+ low: "from-black/40 via-black/20 to-transparent",
453
+ default: "from-black/70 via-black/35 to-transparent",
454
+ high: "from-black/85 via-black/50 to-transparent",
455
+ "very-high": "from-black/95 via-black/60 to-black/20"
456
+ };
457
+ var RADIAL_INTENSITY = {
458
+ low: {
459
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.40) 0%, rgba(0,0,0,0.20) 50%, transparent 100%)"
460
+ },
461
+ default: {
462
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.70) 0%, rgba(0,0,0,0.35) 50%, transparent 100%)"
463
+ },
464
+ high: {
465
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.50) 50%, transparent 100%)"
466
+ },
467
+ "very-high": {
468
+ 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%)"
469
+ }
470
+ };
471
+ function GradientOverlay({
472
+ direction = "bottom-to-top",
473
+ intensity = "default",
474
+ className,
475
+ style,
476
+ ...props
477
+ }) {
478
+ if (direction === "radial-center") {
479
+ return /* @__PURE__ */ jsx(
480
+ "div",
481
+ {
482
+ className: cn("absolute inset-0", className),
483
+ style: { ...RADIAL_INTENSITY[intensity], ...style },
484
+ ...props
485
+ }
486
+ );
487
+ }
488
+ return /* @__PURE__ */ jsx(
489
+ "div",
490
+ {
491
+ className: cn(
492
+ "absolute inset-0",
493
+ DIRECTION_STYLES[direction],
494
+ INTENSITY_STOPS[intensity],
495
+ className
496
+ ),
497
+ style,
498
+ ...props
499
+ }
500
+ );
501
+ }
451
502
  var maxWidthStyles = {
452
503
  sm: "max-w-screen-sm",
453
504
  md: "max-w-screen-md",
@@ -842,7 +893,8 @@ function CarouselGalleryThumbnails({
842
893
  spacing = "sm",
843
894
  pattern,
844
895
  patternOpacity,
845
- slideMediaBrightness = "100"
896
+ slideMediaBrightness,
897
+ slideMediaOverlayIntensity = "default"
846
898
  }) {
847
899
  const [currentIndex, setCurrentIndex] = React.useState(0);
848
900
  const prevSlide = React.useCallback(() => {
@@ -891,7 +943,7 @@ function CarouselGalleryThumbnails({
891
943
  "relative aspect-video w-full overflow-hidden",
892
944
  slideClassName
893
945
  ),
894
- children: imagesSlot ? imagesSlot : images?.map((image, index) => /* @__PURE__ */ jsx(
946
+ children: imagesSlot ? imagesSlot : images?.map((image, index) => /* @__PURE__ */ jsxs(
895
947
  "div",
896
948
  {
897
949
  className: cn(
@@ -899,19 +951,21 @@ function CarouselGalleryThumbnails({
899
951
  index === currentIndex ? "translate-x-0 opacity-100" : index < currentIndex ? "-translate-x-full opacity-0" : "translate-x-full opacity-0",
900
952
  image.className
901
953
  ),
902
- children: /* @__PURE__ */ jsx(
903
- Img,
904
- {
905
- src: image.src,
906
- alt: typeof image.alt === "string" ? image.alt : `Image ${index + 1}`,
907
- className: cn(
908
- "h-full w-full object-cover",
909
- BRIGHTNESS_CLASS_MAP[slideMediaBrightness],
910
- image.imageClassName
911
- ),
912
- optixFlowConfig
913
- }
914
- )
954
+ children: [
955
+ /* @__PURE__ */ jsx(
956
+ Img,
957
+ {
958
+ src: image.src,
959
+ alt: typeof image.alt === "string" ? image.alt : `Image ${index + 1}`,
960
+ className: cn(
961
+ "h-full w-full object-cover",
962
+ image.imageClassName
963
+ ),
964
+ optixFlowConfig
965
+ }
966
+ ),
967
+ /* @__PURE__ */ jsx(GradientOverlay, { intensity: slideMediaOverlayIntensity })
968
+ ]
915
969
  },
916
970
  `slide-${index}`
917
971
  ))
@@ -34,16 +34,6 @@ var React6__namespace = /*#__PURE__*/_interopNamespace(React6);
34
34
  function cn(...inputs) {
35
35
  return tailwindMerge.twMerge(clsx.clsx(inputs));
36
36
  }
37
- var BRIGHTNESS_CLASS_MAP = {
38
- "10": "brightness-[.1]",
39
- "20": "brightness-[.2]",
40
- "25": "brightness-[.25]",
41
- "30": "brightness-[.3]",
42
- "40": "brightness-[.4]",
43
- "50": "brightness-50",
44
- "75": "brightness-75",
45
- "100": "brightness-100"
46
- };
47
37
  function getNestedCardBg(parentBg, variant = "muted", options) {
48
38
  const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
49
39
  if (isDark) {
@@ -500,6 +490,67 @@ var DynamicIcon = React6__namespace.memo(function DynamicIcon2({
500
490
  return /* @__PURE__ */ jsxRuntime.jsx(icon.Icon, { ...props, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
501
491
  });
502
492
  DynamicIcon.displayName = "DynamicIcon";
493
+ var DIRECTION_STYLES = {
494
+ "bottom-to-top": "bg-linear-to-t",
495
+ "top-to-bottom": "bg-linear-to-b",
496
+ "left-to-right": "bg-linear-to-r",
497
+ "right-to-left": "bg-linear-to-l",
498
+ "bottom-left-to-top-right": "bg-linear-to-tr",
499
+ "bottom-right-to-top-left": "bg-linear-to-tl",
500
+ "top-left-to-bottom-right": "bg-linear-to-br",
501
+ "top-right-to-bottom-left": "bg-linear-to-bl"
502
+ };
503
+ var INTENSITY_STOPS = {
504
+ low: "from-black/40 via-black/20 to-transparent",
505
+ default: "from-black/70 via-black/35 to-transparent",
506
+ high: "from-black/85 via-black/50 to-transparent",
507
+ "very-high": "from-black/95 via-black/60 to-black/20"
508
+ };
509
+ var RADIAL_INTENSITY = {
510
+ low: {
511
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.40) 0%, rgba(0,0,0,0.20) 50%, transparent 100%)"
512
+ },
513
+ default: {
514
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.70) 0%, rgba(0,0,0,0.35) 50%, transparent 100%)"
515
+ },
516
+ high: {
517
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.50) 50%, transparent 100%)"
518
+ },
519
+ "very-high": {
520
+ 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%)"
521
+ }
522
+ };
523
+ function GradientOverlay({
524
+ direction = "bottom-to-top",
525
+ intensity = "default",
526
+ className,
527
+ style,
528
+ ...props
529
+ }) {
530
+ if (direction === "radial-center") {
531
+ return /* @__PURE__ */ jsxRuntime.jsx(
532
+ "div",
533
+ {
534
+ className: cn("absolute inset-0", className),
535
+ style: { ...RADIAL_INTENSITY[intensity], ...style },
536
+ ...props
537
+ }
538
+ );
539
+ }
540
+ return /* @__PURE__ */ jsxRuntime.jsx(
541
+ "div",
542
+ {
543
+ className: cn(
544
+ "absolute inset-0",
545
+ DIRECTION_STYLES[direction],
546
+ INTENSITY_STOPS[intensity],
547
+ className
548
+ ),
549
+ style,
550
+ ...props
551
+ }
552
+ );
553
+ }
503
554
  var maxWidthStyles = {
504
555
  sm: "max-w-screen-sm",
505
556
  md: "max-w-screen-md",
@@ -992,7 +1043,8 @@ function CarouselPortfolioHero({
992
1043
  spacing = "none",
993
1044
  pattern,
994
1045
  patternOpacity,
995
- slideMediaBrightness = "50"
1046
+ slideMediaBrightness,
1047
+ slideMediaOverlayIntensity = "high"
996
1048
  }) {
997
1049
  const [currentIndex, setCurrentIndex] = React6__namespace.useState(0);
998
1050
  const intervalRef = React6__namespace.useRef(null);
@@ -1033,7 +1085,7 @@ function CarouselPortfolioHero({
1033
1085
  patternOpacity,
1034
1086
  containerClassName,
1035
1087
  children: [
1036
- slidesSlot ? slidesSlot : slides?.map((slide, index) => /* @__PURE__ */ jsxRuntime.jsx(
1088
+ slidesSlot ? slidesSlot : slides?.map((slide, index) => /* @__PURE__ */ jsxRuntime.jsxs(
1037
1089
  "div",
1038
1090
  {
1039
1091
  className: cn(
@@ -1041,19 +1093,21 @@ function CarouselPortfolioHero({
1041
1093
  index === currentIndex ? "opacity-100" : "opacity-0",
1042
1094
  slide.className
1043
1095
  ),
1044
- children: /* @__PURE__ */ jsxRuntime.jsx(
1045
- img.Img,
1046
- {
1047
- src: slide.image,
1048
- alt: typeof slide.title === "string" ? slide.title : `Slide ${index + 1}`,
1049
- className: cn(
1050
- "h-full w-full object-cover",
1051
- BRIGHTNESS_CLASS_MAP[slideMediaBrightness],
1052
- slide.imageClassName
1053
- ),
1054
- optixFlowConfig
1055
- }
1056
- )
1096
+ children: [
1097
+ /* @__PURE__ */ jsxRuntime.jsx(
1098
+ img.Img,
1099
+ {
1100
+ src: slide.image,
1101
+ alt: typeof slide.title === "string" ? slide.title : `Slide ${index + 1}`,
1102
+ className: cn(
1103
+ "h-full w-full object-cover",
1104
+ slide.imageClassName
1105
+ ),
1106
+ optixFlowConfig
1107
+ }
1108
+ ),
1109
+ /* @__PURE__ */ jsxRuntime.jsx(GradientOverlay, { intensity: slideMediaOverlayIntensity })
1110
+ ]
1057
1111
  },
1058
1112
  slide.id
1059
1113
  )),
@@ -129,10 +129,15 @@ interface CarouselPortfolioHeroProps {
129
129
  */
130
130
  patternOpacity?: number;
131
131
  /**
132
- * Brightness level for slide images (controls overlay visibility)
132
+ * Intensity of the gradient overlay on slide images
133
+ * @default "high"
134
+ */
135
+ slideMediaOverlayIntensity?: "low" | "default" | "high" | "very-high";
136
+ /**
137
+ * Brightness level for slide images (deprecated - prefer slideMediaOverlayIntensity)
133
138
  */
134
139
  slideMediaBrightness?: "10" | "20" | "25" | "30" | "40" | "50" | "75" | "100";
135
140
  }
136
- declare function CarouselPortfolioHero({ slides, slidesSlot, actions, actionsSlot, autoPlayInterval, className, containerClassName, contentClassName, tagClassName, titleClassName, descriptionClassName, actionsClassName, navigationClassName, counterClassName, optixFlowConfig, background, spacing, pattern, patternOpacity, slideMediaBrightness, }: CarouselPortfolioHeroProps): React.JSX.Element;
141
+ declare function CarouselPortfolioHero({ slides, slidesSlot, actions, actionsSlot, autoPlayInterval, className, containerClassName, contentClassName, tagClassName, titleClassName, descriptionClassName, actionsClassName, navigationClassName, counterClassName, optixFlowConfig, background, spacing, pattern, patternOpacity, slideMediaBrightness, slideMediaOverlayIntensity, }: CarouselPortfolioHeroProps): React.JSX.Element;
137
142
 
138
143
  export { CarouselPortfolioHero, type CarouselPortfolioHeroProps, type PortfolioSlide };
@@ -129,10 +129,15 @@ interface CarouselPortfolioHeroProps {
129
129
  */
130
130
  patternOpacity?: number;
131
131
  /**
132
- * Brightness level for slide images (controls overlay visibility)
132
+ * Intensity of the gradient overlay on slide images
133
+ * @default "high"
134
+ */
135
+ slideMediaOverlayIntensity?: "low" | "default" | "high" | "very-high";
136
+ /**
137
+ * Brightness level for slide images (deprecated - prefer slideMediaOverlayIntensity)
133
138
  */
134
139
  slideMediaBrightness?: "10" | "20" | "25" | "30" | "40" | "50" | "75" | "100";
135
140
  }
136
- declare function CarouselPortfolioHero({ slides, slidesSlot, actions, actionsSlot, autoPlayInterval, className, containerClassName, contentClassName, tagClassName, titleClassName, descriptionClassName, actionsClassName, navigationClassName, counterClassName, optixFlowConfig, background, spacing, pattern, patternOpacity, slideMediaBrightness, }: CarouselPortfolioHeroProps): React.JSX.Element;
141
+ declare function CarouselPortfolioHero({ slides, slidesSlot, actions, actionsSlot, autoPlayInterval, className, containerClassName, contentClassName, tagClassName, titleClassName, descriptionClassName, actionsClassName, navigationClassName, counterClassName, optixFlowConfig, background, spacing, pattern, patternOpacity, slideMediaBrightness, slideMediaOverlayIntensity, }: CarouselPortfolioHeroProps): React.JSX.Element;
137
142
 
138
143
  export { CarouselPortfolioHero, type CarouselPortfolioHeroProps, type PortfolioSlide };
@@ -13,16 +13,6 @@ import { Slot } from '@radix-ui/react-slot';
13
13
  function cn(...inputs) {
14
14
  return twMerge(clsx(inputs));
15
15
  }
16
- var BRIGHTNESS_CLASS_MAP = {
17
- "10": "brightness-[.1]",
18
- "20": "brightness-[.2]",
19
- "25": "brightness-[.25]",
20
- "30": "brightness-[.3]",
21
- "40": "brightness-[.4]",
22
- "50": "brightness-50",
23
- "75": "brightness-75",
24
- "100": "brightness-100"
25
- };
26
16
  function getNestedCardBg(parentBg, variant = "muted", options) {
27
17
  const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
28
18
  if (isDark) {
@@ -479,6 +469,67 @@ var DynamicIcon = React6.memo(function DynamicIcon2({
479
469
  return /* @__PURE__ */ jsx(Icon, { ...props, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
480
470
  });
481
471
  DynamicIcon.displayName = "DynamicIcon";
472
+ var DIRECTION_STYLES = {
473
+ "bottom-to-top": "bg-linear-to-t",
474
+ "top-to-bottom": "bg-linear-to-b",
475
+ "left-to-right": "bg-linear-to-r",
476
+ "right-to-left": "bg-linear-to-l",
477
+ "bottom-left-to-top-right": "bg-linear-to-tr",
478
+ "bottom-right-to-top-left": "bg-linear-to-tl",
479
+ "top-left-to-bottom-right": "bg-linear-to-br",
480
+ "top-right-to-bottom-left": "bg-linear-to-bl"
481
+ };
482
+ var INTENSITY_STOPS = {
483
+ low: "from-black/40 via-black/20 to-transparent",
484
+ default: "from-black/70 via-black/35 to-transparent",
485
+ high: "from-black/85 via-black/50 to-transparent",
486
+ "very-high": "from-black/95 via-black/60 to-black/20"
487
+ };
488
+ var RADIAL_INTENSITY = {
489
+ low: {
490
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.40) 0%, rgba(0,0,0,0.20) 50%, transparent 100%)"
491
+ },
492
+ default: {
493
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.70) 0%, rgba(0,0,0,0.35) 50%, transparent 100%)"
494
+ },
495
+ high: {
496
+ background: "radial-gradient(ellipse at center, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.50) 50%, transparent 100%)"
497
+ },
498
+ "very-high": {
499
+ 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%)"
500
+ }
501
+ };
502
+ function GradientOverlay({
503
+ direction = "bottom-to-top",
504
+ intensity = "default",
505
+ className,
506
+ style,
507
+ ...props
508
+ }) {
509
+ if (direction === "radial-center") {
510
+ return /* @__PURE__ */ jsx(
511
+ "div",
512
+ {
513
+ className: cn("absolute inset-0", className),
514
+ style: { ...RADIAL_INTENSITY[intensity], ...style },
515
+ ...props
516
+ }
517
+ );
518
+ }
519
+ return /* @__PURE__ */ jsx(
520
+ "div",
521
+ {
522
+ className: cn(
523
+ "absolute inset-0",
524
+ DIRECTION_STYLES[direction],
525
+ INTENSITY_STOPS[intensity],
526
+ className
527
+ ),
528
+ style,
529
+ ...props
530
+ }
531
+ );
532
+ }
482
533
  var maxWidthStyles = {
483
534
  sm: "max-w-screen-sm",
484
535
  md: "max-w-screen-md",
@@ -971,7 +1022,8 @@ function CarouselPortfolioHero({
971
1022
  spacing = "none",
972
1023
  pattern,
973
1024
  patternOpacity,
974
- slideMediaBrightness = "50"
1025
+ slideMediaBrightness,
1026
+ slideMediaOverlayIntensity = "high"
975
1027
  }) {
976
1028
  const [currentIndex, setCurrentIndex] = React6.useState(0);
977
1029
  const intervalRef = React6.useRef(null);
@@ -1012,7 +1064,7 @@ function CarouselPortfolioHero({
1012
1064
  patternOpacity,
1013
1065
  containerClassName,
1014
1066
  children: [
1015
- slidesSlot ? slidesSlot : slides?.map((slide, index) => /* @__PURE__ */ jsx(
1067
+ slidesSlot ? slidesSlot : slides?.map((slide, index) => /* @__PURE__ */ jsxs(
1016
1068
  "div",
1017
1069
  {
1018
1070
  className: cn(
@@ -1020,19 +1072,21 @@ function CarouselPortfolioHero({
1020
1072
  index === currentIndex ? "opacity-100" : "opacity-0",
1021
1073
  slide.className
1022
1074
  ),
1023
- children: /* @__PURE__ */ jsx(
1024
- Img,
1025
- {
1026
- src: slide.image,
1027
- alt: typeof slide.title === "string" ? slide.title : `Slide ${index + 1}`,
1028
- className: cn(
1029
- "h-full w-full object-cover",
1030
- BRIGHTNESS_CLASS_MAP[slideMediaBrightness],
1031
- slide.imageClassName
1032
- ),
1033
- optixFlowConfig
1034
- }
1035
- )
1075
+ children: [
1076
+ /* @__PURE__ */ jsx(
1077
+ Img,
1078
+ {
1079
+ src: slide.image,
1080
+ alt: typeof slide.title === "string" ? slide.title : `Slide ${index + 1}`,
1081
+ className: cn(
1082
+ "h-full w-full object-cover",
1083
+ slide.imageClassName
1084
+ ),
1085
+ optixFlowConfig
1086
+ }
1087
+ ),
1088
+ /* @__PURE__ */ jsx(GradientOverlay, { intensity: slideMediaOverlayIntensity })
1089
+ ]
1036
1090
  },
1037
1091
  slide.id
1038
1092
  )),
@@ -2129,6 +2129,23 @@ function PopoverContent({
2129
2129
  }
2130
2130
  ) });
2131
2131
  }
2132
+ function StarRating({
2133
+ rating,
2134
+ size = 18,
2135
+ className
2136
+ }) {
2137
+ 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(
2138
+ DynamicIcon,
2139
+ {
2140
+ name: "icon-park-solid/star",
2141
+ size,
2142
+ className: cn(
2143
+ star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
2144
+ )
2145
+ },
2146
+ star
2147
+ )) });
2148
+ }
2132
2149
  var BUTTON_SIZES = {
2133
2150
  sm: { buttonSize: "size-8", iconSize: 16 },
2134
2151
  md: { buttonSize: "size-10", iconSize: 20 },
@@ -2230,6 +2247,7 @@ var SocialLinkIcon = React6__namespace.forwardRef(
2230
2247
  iconClassName,
2231
2248
  className,
2232
2249
  iconNameOverride,
2250
+ iconOnly = false,
2233
2251
  ...pressableProps
2234
2252
  }, ref) => {
2235
2253
  const platform = usePlatformFromUrl.usePlatformFromUrl(href);
@@ -2242,6 +2260,21 @@ var SocialLinkIcon = React6__namespace.forwardRef(
2242
2260
  const accessibleLabel = React6__namespace.useMemo(() => {
2243
2261
  return label || platformName;
2244
2262
  }, [label, platformName]);
2263
+ const icon = React6__namespace.useMemo(() => {
2264
+ return /* @__PURE__ */ jsxRuntime.jsx(
2265
+ DynamicIcon,
2266
+ {
2267
+ name: iconName,
2268
+ size: iconSize,
2269
+ color: iconColor,
2270
+ className: iconClassName,
2271
+ alt: accessibleLabel
2272
+ }
2273
+ );
2274
+ }, [iconName, iconSize, iconColor, iconClassName, accessibleLabel]);
2275
+ if (iconOnly) {
2276
+ return icon;
2277
+ }
2245
2278
  return /* @__PURE__ */ jsxRuntime.jsx(
2246
2279
  Pressable,
2247
2280
  {
@@ -2253,16 +2286,7 @@ var SocialLinkIcon = React6__namespace.forwardRef(
2253
2286
  className
2254
2287
  ),
2255
2288
  ...pressableProps,
2256
- children: /* @__PURE__ */ jsxRuntime.jsx(
2257
- DynamicIcon,
2258
- {
2259
- name: iconName,
2260
- size: iconSize,
2261
- color: iconColor,
2262
- className: iconClassName,
2263
- alt: accessibleLabel
2264
- }
2265
- )
2289
+ children: icon
2266
2290
  }
2267
2291
  );
2268
2292
  }
@@ -7563,3 +7587,4 @@ exports.PopoverTrigger = PopoverTrigger;
7563
7587
  exports.Pressable = Pressable;
7564
7588
  exports.Section = Section;
7565
7589
  exports.SocialLinkIcon = SocialLinkIcon;
7590
+ exports.StarRating = StarRating;
@@ -9,6 +9,7 @@ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }
9
9
  export { Badge } from './badge.cjs';
10
10
  export { Popover, PopoverContent, PopoverTrigger } from './popover.cjs';
11
11
  export { DynamicIcon } from './dynamic-icon.cjs';
12
+ import * as React from 'react';
12
13
  export { CarouselPagination, CarouselPaginationProps } from './carousel-pagination.cjs';
13
14
  export { SocialLinkIcon, SocialLinkIconDynamicIconProps, SocialLinkIconProps } from './social-link-icon.cjs';
14
15
  export { PaymentPlatformIcon, PaymentPlatformIconProps, PaymentPlatformName } from './payment-platform-icon.cjs';
@@ -40,14 +41,40 @@ export { FooterNewsletterMinimal } from './footer-newsletter-minimal.cjs';
40
41
  export { FooterCtaSocial } from './footer-cta-social.cjs';
41
42
  export { FooterNavSocial } from './footer-nav-social.cjs';
42
43
  export { SocialPlatformName } from '@opensite/hooks/usePlatformFromUrl';
43
- import 'react';
44
- import '@page-speed/maps';
45
44
  import './blocks-D1hqLk46.cjs';
46
45
  import 'class-variance-authority';
47
46
  import './button-variants-lRElsmTc.cjs';
48
47
  import 'class-variance-authority/types';
49
48
  import 'react/jsx-runtime';
49
+ import '@page-speed/maps';
50
50
  import '@radix-ui/react-popover';
51
51
  import '@page-speed/icon';
52
52
  import './types-Cs1jk79n.cjs';
53
53
  import '@page-speed/forms/integration';
54
+
55
+ interface StarRatingProps {
56
+ /**
57
+ * Star rating value (1-5)
58
+ */
59
+ rating: number;
60
+ /**
61
+ * Icon size in pixels
62
+ */
63
+ size?: number;
64
+ /**
65
+ * Additional CSS classes for the container
66
+ */
67
+ className?: string;
68
+ }
69
+ /**
70
+ * StarRating - Displays a 1-5 star rating using filled/muted star icons.
71
+ * Uses CSS variable-based colors (primary/muted) for theme compatibility.
72
+ *
73
+ * @example
74
+ * ```tsx
75
+ * <StarRating rating={4} size={18} />
76
+ * ```
77
+ */
78
+ declare function StarRating({ rating, size, className, }: StarRatingProps): React.JSX.Element;
79
+
80
+ export { StarRating, type StarRatingProps };
@@ -9,6 +9,7 @@ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }
9
9
  export { Badge } from './badge.js';
10
10
  export { Popover, PopoverContent, PopoverTrigger } from './popover.js';
11
11
  export { DynamicIcon } from './dynamic-icon.js';
12
+ import * as React from 'react';
12
13
  export { CarouselPagination, CarouselPaginationProps } from './carousel-pagination.js';
13
14
  export { SocialLinkIcon, SocialLinkIconDynamicIconProps, SocialLinkIconProps } from './social-link-icon.js';
14
15
  export { PaymentPlatformIcon, PaymentPlatformIconProps, PaymentPlatformName } from './payment-platform-icon.js';
@@ -40,14 +41,40 @@ export { FooterNewsletterMinimal } from './footer-newsletter-minimal.js';
40
41
  export { FooterCtaSocial } from './footer-cta-social.js';
41
42
  export { FooterNavSocial } from './footer-nav-social.js';
42
43
  export { SocialPlatformName } from '@opensite/hooks/usePlatformFromUrl';
43
- import 'react';
44
- import '@page-speed/maps';
45
44
  import './blocks-kcru1Ogu.js';
46
45
  import 'class-variance-authority';
47
46
  import './button-variants-lRElsmTc.js';
48
47
  import 'class-variance-authority/types';
49
48
  import 'react/jsx-runtime';
49
+ import '@page-speed/maps';
50
50
  import '@radix-ui/react-popover';
51
51
  import '@page-speed/icon';
52
52
  import './types-Cs1jk79n.js';
53
53
  import '@page-speed/forms/integration';
54
+
55
+ interface StarRatingProps {
56
+ /**
57
+ * Star rating value (1-5)
58
+ */
59
+ rating: number;
60
+ /**
61
+ * Icon size in pixels
62
+ */
63
+ size?: number;
64
+ /**
65
+ * Additional CSS classes for the container
66
+ */
67
+ className?: string;
68
+ }
69
+ /**
70
+ * StarRating - Displays a 1-5 star rating using filled/muted star icons.
71
+ * Uses CSS variable-based colors (primary/muted) for theme compatibility.
72
+ *
73
+ * @example
74
+ * ```tsx
75
+ * <StarRating rating={4} size={18} />
76
+ * ```
77
+ */
78
+ declare function StarRating({ rating, size, className, }: StarRatingProps): React.JSX.Element;
79
+
80
+ export { StarRating, type StarRatingProps };