@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
@@ -2,6 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var React2 = require('react');
5
+ var framerMotion = require('framer-motion');
5
6
  var clsx = require('clsx');
6
7
  var tailwindMerge = require('tailwind-merge');
7
8
  var icon = require('@page-speed/icon');
@@ -459,125 +460,636 @@ var Pressable = React2__namespace.forwardRef(
459
460
  }
460
461
  );
461
462
  Pressable.displayName = "Pressable";
463
+ var maxWidthStyles = {
464
+ sm: "max-w-screen-sm",
465
+ md: "max-w-screen-md",
466
+ lg: "max-w-screen-lg",
467
+ xl: "max-w-7xl",
468
+ "2xl": "max-w-screen-2xl",
469
+ "4xl": "max-w-[1536px]",
470
+ full: "max-w-full"
471
+ };
472
+ var Container = React2__namespace.default.forwardRef(
473
+ ({ children, maxWidth = "xl", className, as = "div", ...props }, ref) => {
474
+ const Component = as;
475
+ return /* @__PURE__ */ jsxRuntime.jsx(
476
+ Component,
477
+ {
478
+ ref,
479
+ className: cn(
480
+ "mx-auto w-full px-2 sm:px-4 lg:px-8",
481
+ maxWidthStyles[maxWidth],
482
+ className
483
+ ),
484
+ ...props,
485
+ children
486
+ }
487
+ );
488
+ }
489
+ );
490
+ Container.displayName = "Container";
491
+
492
+ // lib/patternSvgs.ts
493
+ var patternSvgs = {
494
+ squareAltGrid: "https://cdn.ing/assets/files/record/286187/4gpn0yq2ptra8iwlvmwwv860ggwv",
495
+ grid1: "https://cdn.ing/assets/files/record/286186/nbdflpgp4ostrno079hygibsflp3",
496
+ noise: "https://cdn.ing/assets/i/r/286188/zrqcp9hynh3j7p2laihwzfbujgrl/noise.png",
497
+ dots: "https://cdn.ing/assets/files/record/286198/yfsjx9thvtxzhl2qtshxyhkrm524",
498
+ dotPattern: "https://cdn.ing/assets/files/record/286192/7ig0cku8aqbboiza8nuk6hw0nnsr",
499
+ dotPattern2: "https://cdn.ing/assets/files/record/286189/arez6gd2s7isn9i1o6c7sexdq7bl",
500
+ circles: "https://cdn.ing/assets/files/record/286190/gtmia3sncjtzetdshc20zf1d3c17",
501
+ waves: "https://cdn.ing/assets/files/record/286191/mqlb33fzxz9cdth1bx7if0wmpkp1",
502
+ crossPattern: "https://cdn.ing/assets/files/record/286193/9yfqwdbnqaipbp7fsb3wbzzmq472",
503
+ architect: "https://cdn.ing/assets/files/record/286194/vgs88ugpvyhxu13wqgy0acvae6re",
504
+ tinyCheckers: "https://cdn.ing/assets/files/record/286195/65efaknsw8kcpf9o3c2gybytsl5b",
505
+ p6: "https://cdn.ing/assets/i/r/286196/6kl0rqnd6mjk8j7e525fo8fo0vkc/p6.webp"
506
+ };
507
+ var maskTop = "radial-gradient(ellipse 70% 60% at 50% 0%, #000 60%, transparent 100%)";
508
+ var maskBottom = "radial-gradient(ellipse 100% 80% at 50% 100%, #000 50%, transparent 90%)";
509
+ var maskCenter = "radial-gradient(ellipse 60% 60% at 50% 50%, #000 30%, transparent 70%)";
510
+ var maskTopLeft = "radial-gradient(ellipse 80% 80% at 0% 0%, #000 50%, transparent 90%)";
511
+ var maskTopRight = "radial-gradient(ellipse 80% 80% at 100% 0%, #000 50%, transparent 90%)";
512
+ var maskBottomLeft = "radial-gradient(ellipse 80% 80% at 0% 100%, #000 50%, transparent 90%)";
513
+ var maskBottomRight = "radial-gradient(ellipse 80% 80% at 100% 100%, #000 50%, transparent 90%)";
514
+ var circuitBoardPattern = (id, mask) => /* @__PURE__ */ jsxRuntime.jsxs(
515
+ "svg",
516
+ {
517
+ className: "h-full w-full",
518
+ xmlns: "http://www.w3.org/2000/svg",
519
+ style: mask ? {
520
+ maskImage: mask,
521
+ WebkitMaskImage: mask
522
+ } : void 0,
523
+ children: [
524
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsxs(
525
+ "pattern",
526
+ {
527
+ id,
528
+ x: "0",
529
+ y: "0",
530
+ width: "100",
531
+ height: "100",
532
+ patternUnits: "userSpaceOnUse",
533
+ children: [
534
+ /* @__PURE__ */ jsxRuntime.jsx(
535
+ "path",
536
+ {
537
+ d: "M0 50h40M60 50h40M50 0v40M50 60v40",
538
+ stroke: "hsl(var(--muted))",
539
+ strokeWidth: "1",
540
+ fill: "none"
541
+ }
542
+ ),
543
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "50", cy: "50", r: "3", fill: "hsl(var(--muted))" }),
544
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "0", cy: "50", r: "2", fill: "hsl(var(--muted))" }),
545
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "100", cy: "50", r: "2", fill: "hsl(var(--muted))" }),
546
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "50", cy: "0", r: "2", fill: "hsl(var(--muted))" }),
547
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "50", cy: "100", r: "2", fill: "hsl(var(--muted))" })
548
+ ]
549
+ }
550
+ ) }),
551
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "100%", height: "100%", fill: `url(#${id})` })
552
+ ]
553
+ }
554
+ );
555
+ var gridDotsPattern = (id, mask) => /* @__PURE__ */ jsxRuntime.jsxs(
556
+ "svg",
557
+ {
558
+ className: "h-full w-full",
559
+ xmlns: "http://www.w3.org/2000/svg",
560
+ style: mask ? {
561
+ maskImage: mask,
562
+ WebkitMaskImage: mask
563
+ } : void 0,
564
+ children: [
565
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsxs(
566
+ "pattern",
567
+ {
568
+ id,
569
+ x: "0",
570
+ y: "0",
571
+ width: "40",
572
+ height: "40",
573
+ patternUnits: "userSpaceOnUse",
574
+ children: [
575
+ /* @__PURE__ */ jsxRuntime.jsx(
576
+ "path",
577
+ {
578
+ d: "M0 20h40M20 0v40",
579
+ stroke: "hsl(var(--muted))",
580
+ strokeWidth: "0.5",
581
+ fill: "none"
582
+ }
583
+ ),
584
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "20", cy: "20", r: "2", fill: "hsl(var(--muted))" })
585
+ ]
586
+ }
587
+ ) }),
588
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { width: "100%", height: "100%", fill: `url(#${id})` })
589
+ ]
590
+ }
591
+ );
592
+ var gridPattern = (size, mask) => /* @__PURE__ */ jsxRuntime.jsx(
593
+ "div",
594
+ {
595
+ className: "h-full w-full bg-[linear-gradient(to_right,_hsl(var(--muted))_1px,_transparent_1px),linear-gradient(to_bottom,_hsl(var(--muted))_1px,_transparent_1px)]",
596
+ style: {
597
+ backgroundSize: `${size}px ${size}px`,
598
+ ...mask ? {
599
+ maskImage: mask,
600
+ WebkitMaskImage: mask
601
+ } : {}
602
+ }
603
+ }
604
+ );
605
+ var diagonalCrossPattern = (mask) => /* @__PURE__ */ jsxRuntime.jsx(
606
+ "div",
607
+ {
608
+ className: "h-full w-full",
609
+ style: {
610
+ backgroundImage: "repeating-linear-gradient(45deg, transparent, transparent 32px, hsl(var(--muted)) 32px, hsl(var(--muted)) 33px), repeating-linear-gradient(135deg, transparent, transparent 32px, hsl(var(--muted)) 32px, hsl(var(--muted)) 33px)",
611
+ ...mask ? {
612
+ maskImage: mask,
613
+ WebkitMaskImage: mask
614
+ } : {}
615
+ }
616
+ }
617
+ );
618
+ var dashedGridMaskBase = "repeating-linear-gradient(to right, black 0px, black 3px, transparent 3px, transparent 8px), repeating-linear-gradient(to bottom, black 0px, black 3px, transparent 3px, transparent 8px)";
619
+ var dashedGridPattern = (fadeMask) => {
620
+ const mask = fadeMask ? `${dashedGridMaskBase}, ${fadeMask}` : dashedGridMaskBase;
621
+ return /* @__PURE__ */ jsxRuntime.jsx(
622
+ "div",
623
+ {
624
+ className: "h-full w-full",
625
+ style: {
626
+ backgroundImage: "linear-gradient(to right, hsl(var(--muted)) 1px, transparent 1px), linear-gradient(to bottom, hsl(var(--muted)) 1px, transparent 1px)",
627
+ backgroundSize: "20px 20px",
628
+ backgroundPosition: "0 0, 0 0",
629
+ maskImage: mask,
630
+ WebkitMaskImage: mask,
631
+ maskComposite: "intersect",
632
+ WebkitMaskComposite: "source-in"
633
+ }
634
+ }
635
+ );
636
+ };
637
+ var gradientGlow = (position) => /* @__PURE__ */ jsxRuntime.jsx(
638
+ "div",
639
+ {
640
+ className: cn(
641
+ "pointer-events-none absolute left-1/2 z-0 aspect-square w-3/4 -translate-x-1/2 rounded-full opacity-50 blur-3xl",
642
+ position === "top" ? "-top-1/4" : "-bottom-1/4"
643
+ ),
644
+ style: {
645
+ background: "radial-gradient(circle, hsl(var(--primary)) 0%, transparent 70%)"
646
+ }
647
+ }
648
+ );
649
+ var spotlight = (position) => /* @__PURE__ */ jsxRuntime.jsx(
650
+ "div",
651
+ {
652
+ className: cn(
653
+ "pointer-events-none absolute top-1/2 z-0 aspect-square w-3/4 -translate-y-1/2 rounded-full opacity-40 blur-3xl",
654
+ position === "left" ? "-left-1/4" : "-right-1/4"
655
+ ),
656
+ style: {
657
+ background: "radial-gradient(circle, hsl(var(--primary)) 0%, transparent 70%)"
658
+ }
659
+ }
660
+ );
661
+ var patternOverlays = {
662
+ circuitBoardBasic: () => circuitBoardPattern("circuit-board-basic"),
663
+ circuitBoardFadeTop: () => circuitBoardPattern("circuit-board-fade-top", maskTop),
664
+ circuitBoardFadeBottom: () => circuitBoardPattern("circuit-board-fade-bottom", maskBottom),
665
+ circuitBoardFadeCenter: () => circuitBoardPattern("circuit-board-fade-center", maskCenter),
666
+ circuitBoardFadeTopLeft: () => circuitBoardPattern("circuit-board-fade-top-left", maskTopLeft),
667
+ circuitBoardFadeTopRight: () => circuitBoardPattern("circuit-board-fade-top-right", maskTopRight),
668
+ circuitBoardFadeBottomLeft: () => circuitBoardPattern("circuit-board-fade-bottom-left", maskBottomLeft),
669
+ circuitBoardFadeBottomRight: () => circuitBoardPattern("circuit-board-fade-bottom-right", maskBottomRight),
670
+ dashedGridBasic: () => dashedGridPattern(),
671
+ dashedGridFadeTop: () => dashedGridPattern(maskTop),
672
+ dashedGridFadeBottom: () => dashedGridPattern(maskBottom),
673
+ dashedGridFadeCenter: () => dashedGridPattern(maskCenter),
674
+ dashedGridFadeTopLeft: () => dashedGridPattern(maskTopLeft),
675
+ dashedGridFadeTopRight: () => dashedGridPattern(maskTopRight),
676
+ dashedGridFadeBottomLeft: () => dashedGridPattern(maskBottomLeft),
677
+ dashedGridFadeBottomRight: () => dashedGridPattern(maskBottomRight),
678
+ diagonalCrossBasic: () => diagonalCrossPattern(),
679
+ diagonalCrossFadeTop: () => diagonalCrossPattern(maskTop),
680
+ diagonalCrossFadeBottom: () => diagonalCrossPattern(maskBottom),
681
+ diagonalCrossFadeCenter: () => diagonalCrossPattern(maskCenter),
682
+ diagonalCrossFadeTopLeft: () => diagonalCrossPattern(maskTopLeft),
683
+ diagonalCrossFadeTopRight: () => diagonalCrossPattern(maskTopRight),
684
+ diagonalCrossFadeBottomLeft: () => diagonalCrossPattern(maskBottomLeft),
685
+ diagonalCrossFadeBottomRight: () => diagonalCrossPattern(maskBottomRight),
686
+ gridBasic: () => gridPattern(40),
687
+ gridFadeTop: () => gridPattern(32, maskTop),
688
+ gridFadeBottom: () => gridPattern(32, maskBottom),
689
+ gridFadeCenter: () => gridPattern(40, maskCenter),
690
+ gridFadeTopLeft: () => gridPattern(32, maskTopLeft),
691
+ gridFadeTopRight: () => gridPattern(32, maskTopRight),
692
+ gridFadeBottomLeft: () => gridPattern(32, maskBottomLeft),
693
+ gridFadeBottomRight: () => gridPattern(32, maskBottomRight),
694
+ gridDotsBasic: () => gridDotsPattern("grid-dots-basic"),
695
+ gridDotsFadeCenter: () => gridDotsPattern("grid-dots-fade-center", maskCenter),
696
+ gradientGlowTop: () => gradientGlow("top"),
697
+ gradientGlowBottom: () => gradientGlow("bottom"),
698
+ spotlightLeft: () => spotlight("left"),
699
+ spotlightRight: () => spotlight("right")
700
+ };
701
+ var inlinePatternStyles = {
702
+ radialGradientTop: {
703
+ background: "radial-gradient(125% 125% at 50% 10%, hsl(var(--background)) 40%, hsl(var(--primary)) 100%)"
704
+ },
705
+ radialGradientBottom: {
706
+ background: "radial-gradient(125% 125% at 50% 90%, hsl(var(--background)) 40%, hsl(var(--primary)) 100%)"
707
+ }
708
+ };
709
+ function PatternBackground({
710
+ pattern,
711
+ opacity = 0.08,
712
+ className,
713
+ style
714
+ }) {
715
+ if (!pattern) {
716
+ return null;
717
+ }
718
+ if (pattern in inlinePatternStyles) {
719
+ const inlineStyle = inlinePatternStyles[pattern];
720
+ return /* @__PURE__ */ jsxRuntime.jsx(
721
+ "div",
722
+ {
723
+ className: cn("pointer-events-none absolute inset-0 z-0", className),
724
+ style: { ...inlineStyle, opacity, ...style },
725
+ "aria-hidden": "true"
726
+ }
727
+ );
728
+ }
729
+ if (pattern in patternOverlays) {
730
+ const Overlay = patternOverlays[pattern];
731
+ return /* @__PURE__ */ jsxRuntime.jsx(
732
+ "div",
733
+ {
734
+ className: cn("pointer-events-none absolute inset-0 z-0", className),
735
+ style: { opacity, ...style },
736
+ "aria-hidden": "true",
737
+ children: Overlay()
738
+ }
739
+ );
740
+ }
741
+ const patternUrl = pattern in patternSvgs ? patternSvgs[pattern] : pattern;
742
+ return /* @__PURE__ */ jsxRuntime.jsx(
743
+ "div",
744
+ {
745
+ className: cn("pointer-events-none absolute inset-0 z-0", className),
746
+ style: {
747
+ backgroundImage: `url(${patternUrl})`,
748
+ backgroundRepeat: "repeat",
749
+ backgroundSize: "auto",
750
+ opacity,
751
+ ...style
752
+ },
753
+ "aria-hidden": "true"
754
+ }
755
+ );
756
+ }
757
+ var backgroundStyles = {
758
+ default: "bg-background text-foreground",
759
+ white: "bg-white text-dark",
760
+ gray: "bg-muted/30 text-foreground",
761
+ dark: "bg-foreground text-background",
762
+ transparent: "bg-transparent text-foreground",
763
+ gradient: "bg-linear-to-br from-primary via-primary/90 to-foreground text-primary-foreground",
764
+ primary: "bg-primary text-primary-foreground",
765
+ secondary: "bg-secondary text-secondary-foreground",
766
+ muted: "bg-muted text-muted-foreground"
767
+ };
768
+ var spacingStyles = {
769
+ none: "py-0 md:py-0",
770
+ sm: "py-12 md:py-16",
771
+ md: "py-16 md:py-24",
772
+ lg: "py-20 md:py-32",
773
+ xl: "py-24 md:py-40",
774
+ hero: "pt-32 pb-12 md:pt-40 md:pb-40"
775
+ };
776
+ var predefinedSpacings = ["none", "sm", "md", "lg", "xl", "hero"];
777
+ var isPredefinedSpacing = (spacing) => predefinedSpacings.includes(spacing);
778
+ var Section = React2__namespace.default.forwardRef(
779
+ ({
780
+ id,
781
+ title,
782
+ subtitle,
783
+ children,
784
+ className,
785
+ style,
786
+ background = "default",
787
+ spacing = "lg",
788
+ pattern,
789
+ patternOpacity,
790
+ patternClassName,
791
+ containerClassName,
792
+ containerMaxWidth = "xl",
793
+ ...props
794
+ }, ref) => {
795
+ const effectivePatternOpacity = patternOpacity !== void 0 ? patternOpacity : pattern ? 1 : 0;
796
+ return /* @__PURE__ */ jsxRuntime.jsxs(
797
+ "section",
798
+ {
799
+ ref,
800
+ id,
801
+ className: cn(
802
+ "relative",
803
+ pattern ? "overflow-hidden" : null,
804
+ backgroundStyles[background],
805
+ isPredefinedSpacing(spacing) ? spacingStyles[spacing] : spacing,
806
+ className
807
+ ),
808
+ style,
809
+ ...props,
810
+ children: [
811
+ /* @__PURE__ */ jsxRuntime.jsx(
812
+ PatternBackground,
813
+ {
814
+ pattern,
815
+ opacity: effectivePatternOpacity,
816
+ className: patternClassName
817
+ }
818
+ ),
819
+ /* @__PURE__ */ jsxRuntime.jsxs(
820
+ Container,
821
+ {
822
+ maxWidth: containerMaxWidth,
823
+ className: cn("relative z-10", containerClassName),
824
+ children: [
825
+ (title || subtitle) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-6 text-center md:mb-16", children: [
826
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mb-2 text-sm font-semibold uppercase tracking-wider", children: subtitle }),
827
+ title && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-3xl font-bold tracking-tight md:text-4xl lg:text-5xl", children: title })
828
+ ] }),
829
+ children
830
+ ]
831
+ }
832
+ )
833
+ ]
834
+ }
835
+ );
836
+ }
837
+ );
838
+ Section.displayName = "Section";
462
839
  function TestimonialsCarouselImage({
463
840
  testimonials,
464
841
  testimonialsSlot,
465
- height,
466
- overlayOpacity,
842
+ autoPlayInterval,
843
+ height = "h-70dvh lg:h-60dvh",
844
+ overlayOpacity = 0.6,
467
845
  previousButtonAriaLabel,
468
846
  nextButtonAriaLabel,
469
847
  className,
470
848
  contentClassName,
471
849
  quoteIconClassName,
850
+ logoClassName,
472
851
  quoteClassName,
473
852
  authorClassName,
474
853
  navigationClassName,
475
854
  navButtonClassName,
476
855
  dotsClassName,
477
- optixFlowConfig
856
+ optixFlowConfig,
857
+ background,
858
+ containerClassName = "mx-0 w-screen px-0 sm:px-0 lg:px-0 max-w-screen relative z-10 h-full",
859
+ spacing = "none",
860
+ pattern,
861
+ patternOpacity
478
862
  }) {
479
863
  const [currentIndex, setCurrentIndex] = React2.useState(0);
480
864
  const totalTestimonials = testimonials?.length ?? 0;
481
- const goToPrevious = React2.useCallback(() => {
482
- if (totalTestimonials === 0) return;
483
- setCurrentIndex(
484
- (prev) => prev === 0 ? totalTestimonials - 1 : prev - 1
485
- );
486
- }, [totalTestimonials]);
865
+ const autoPlayTimerRef = React2__namespace.useRef(
866
+ null
867
+ );
868
+ const resetAutoPlay = React2.useCallback(() => {
869
+ if (autoPlayTimerRef.current) {
870
+ clearInterval(autoPlayTimerRef.current);
871
+ autoPlayTimerRef.current = null;
872
+ }
873
+ if (!autoPlayInterval || autoPlayInterval <= 0 || totalTestimonials === 0)
874
+ return;
875
+ autoPlayTimerRef.current = setInterval(() => {
876
+ setCurrentIndex((prev) => (prev + 1) % totalTestimonials);
877
+ }, autoPlayInterval);
878
+ }, [autoPlayInterval, totalTestimonials]);
487
879
  const goToNext = React2.useCallback(() => {
488
880
  if (totalTestimonials === 0) return;
489
- setCurrentIndex(
490
- (prev) => prev === totalTestimonials - 1 ? 0 : prev + 1
491
- );
492
- }, [totalTestimonials]);
881
+ setCurrentIndex((prev) => prev === totalTestimonials - 1 ? 0 : prev + 1);
882
+ resetAutoPlay();
883
+ }, [totalTestimonials, resetAutoPlay]);
884
+ const goToPrevious = React2.useCallback(() => {
885
+ if (totalTestimonials === 0) return;
886
+ setCurrentIndex((prev) => prev === 0 ? totalTestimonials - 1 : prev - 1);
887
+ resetAutoPlay();
888
+ }, [totalTestimonials, resetAutoPlay]);
889
+ const goToIndex = React2.useCallback(
890
+ (index) => {
891
+ setCurrentIndex(index);
892
+ resetAutoPlay();
893
+ },
894
+ [resetAutoPlay]
895
+ );
896
+ React2.useEffect(() => {
897
+ resetAutoPlay();
898
+ return () => {
899
+ if (autoPlayTimerRef.current) {
900
+ clearInterval(autoPlayTimerRef.current);
901
+ }
902
+ };
903
+ }, [resetAutoPlay]);
493
904
  const current = testimonials?.[currentIndex];
494
905
  const renderedTestimonialContent = React2.useMemo(() => {
495
906
  if (testimonialsSlot) return testimonialsSlot;
496
907
  if (!current) return null;
497
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mx-auto max-w-4xl text-center text-background", contentClassName), children: [
498
- /* @__PURE__ */ jsxRuntime.jsx(
499
- DynamicIcon,
500
- {
501
- name: "lucide/quote",
502
- size: 48,
503
- className: cn("mx-auto mb-6 opacity-50", quoteIconClassName)
504
- }
505
- ),
506
- current.quote && (typeof current.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: cn("text-2xl font-light leading-relaxed md:text-4xl", quoteClassName), children: [
507
- "\u201C",
508
- current.quote,
509
- "\u201D"
510
- ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: quoteClassName, children: current.quote })),
511
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mt-8", authorClassName), children: [
512
- current.author && (typeof current.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg font-semibold", children: current.author }) : current.author),
513
- (current.role || current.company) && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm opacity-80", children: [
514
- current.role && (typeof current.role === "string" ? current.role : current.role),
515
- current.company && (typeof current.company === "string" ? `, ${current.company}` : current.company)
516
- ] })
517
- ] })
518
- ] });
519
- }, [testimonialsSlot, contentClassName, quoteIconClassName, current, quoteClassName, authorClassName]);
520
- return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: cn("relative", height, className), children: [
521
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0", children: [
522
- current?.backgroundImage && /* @__PURE__ */ jsxRuntime.jsx(
523
- img.Img,
524
- {
525
- src: current.backgroundImage,
526
- alt: "",
527
- className: "size-full object-cover",
528
- optixFlowConfig
529
- }
530
- ),
531
- /* @__PURE__ */ jsxRuntime.jsx(
532
- "div",
533
- {
534
- className: "absolute inset-0 bg-foreground",
535
- style: { opacity: overlayOpacity }
536
- }
537
- )
538
- ] }),
539
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex h-full flex-col items-center justify-center px-4", children: [
540
- renderedTestimonialContent,
541
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("absolute bottom-8 left-0 right-0 flex items-center justify-center gap-4", navigationClassName), children: [
542
- /* @__PURE__ */ jsxRuntime.jsx(
543
- Pressable,
544
- {
545
- asButton: true,
546
- variant: "ghost",
547
- size: "icon",
548
- className: cn("size-10 rounded-full bg-white/10 text-white backdrop-blur-sm hover:bg-white/20", navButtonClassName),
549
- onClick: goToPrevious,
550
- "aria-label": previousButtonAriaLabel ?? "Previous testimonial",
551
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/chevron-left", size: 24 })
552
- }
908
+ return /* @__PURE__ */ jsxRuntime.jsxs(
909
+ "div",
910
+ {
911
+ className: cn(
912
+ "mx-auto max-w-full md:max-w-md text-center text-shadow-lg text-white pb-32 pt-20",
913
+ contentClassName
553
914
  ),
554
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex gap-2", dotsClassName), children: testimonials?.map((_, index) => /* @__PURE__ */ jsxRuntime.jsx(
555
- "button",
556
- {
557
- onClick: () => setCurrentIndex(index),
558
- className: cn(
559
- "size-2 rounded-full transition-all",
560
- index === currentIndex ? "w-6 bg-white" : "bg-white/40 hover:bg-white/60"
561
- ),
562
- "aria-label": `Go to testimonial ${index + 1}`
563
- },
564
- index
565
- )) }),
566
- /* @__PURE__ */ jsxRuntime.jsx(
567
- Pressable,
568
- {
569
- asButton: true,
570
- variant: "ghost",
571
- size: "icon",
572
- className: cn("size-10 rounded-full bg-white/10 text-white backdrop-blur-sm hover:bg-white/20", navButtonClassName),
573
- onClick: goToNext,
574
- "aria-label": nextButtonAriaLabel ?? "Next testimonial",
575
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/chevron-right", size: 24 })
576
- }
577
- )
578
- ] })
579
- ] })
580
- ] });
915
+ children: [
916
+ current?.logoSrc ? /* @__PURE__ */ jsxRuntime.jsx(
917
+ img.Img,
918
+ {
919
+ src: current.logoSrc,
920
+ alt: typeof current.company === "string" ? `${current.company} logo` : typeof current.author === "string" ? `${current.author} company logo` : "Company logo",
921
+ className: cn(
922
+ "mx-auto mb-6 max-h-12 max-w-32 object-contain md:max-h-16 md:max-w-48",
923
+ logoClassName
924
+ ),
925
+ optixFlowConfig
926
+ }
927
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
928
+ DynamicIcon,
929
+ {
930
+ name: "mdi/comment-quote-outline",
931
+ size: 48,
932
+ className: cn("mx-auto mb-6 opacity-50", quoteIconClassName)
933
+ }
934
+ ),
935
+ current.quote && (typeof current.quote === "string" ? /* @__PURE__ */ jsxRuntime.jsxs(
936
+ "blockquote",
937
+ {
938
+ className: cn(
939
+ "text-xl font-light leading-relaxed md:text-2xl text-balance",
940
+ quoteClassName
941
+ ),
942
+ children: [
943
+ "\u201C",
944
+ current.quote,
945
+ "\u201D"
946
+ ]
947
+ }
948
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: quoteClassName, children: current.quote })),
949
+ /* @__PURE__ */ jsxRuntime.jsxs(
950
+ "div",
951
+ {
952
+ className: cn(
953
+ "mt-8 text-balance flex flex-col items-center",
954
+ authorClassName
955
+ ),
956
+ children: [
957
+ current.author && (typeof current.author === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg font-semibold", children: current.author }) : current.author),
958
+ (current.role || current.company) && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm opacity-80", children: [
959
+ current.role && (typeof current.role === "string" ? current.role : current.role),
960
+ current.company && (typeof current.company === "string" ? `, ${current.company}` : current.company)
961
+ ] }),
962
+ current.linkConfig?.href && /* @__PURE__ */ jsxRuntime.jsx(
963
+ Pressable,
964
+ {
965
+ href: current.linkConfig.href,
966
+ className: cn(
967
+ "transition-all duration-500",
968
+ "hover:underline hover:underline-offset-4",
969
+ "text-sm",
970
+ current.linkConfig.className
971
+ ),
972
+ children: current.linkConfig.label
973
+ }
974
+ )
975
+ ]
976
+ }
977
+ )
978
+ ]
979
+ }
980
+ );
981
+ }, [
982
+ testimonialsSlot,
983
+ contentClassName,
984
+ quoteIconClassName,
985
+ logoClassName,
986
+ optixFlowConfig,
987
+ current,
988
+ quoteClassName,
989
+ authorClassName
990
+ ]);
991
+ return /* @__PURE__ */ jsxRuntime.jsxs(
992
+ Section,
993
+ {
994
+ background,
995
+ spacing,
996
+ pattern,
997
+ patternOpacity,
998
+ className: cn("relative", height, className),
999
+ containerClassName,
1000
+ children: [
1001
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0", children: [
1002
+ /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { initial: false, children: current?.backgroundImage && /* @__PURE__ */ jsxRuntime.jsx(
1003
+ framerMotion.motion.div,
1004
+ {
1005
+ initial: { opacity: 0 },
1006
+ animate: { opacity: 1 },
1007
+ exit: { opacity: 0 },
1008
+ transition: { duration: 0.6, ease: "easeInOut" },
1009
+ className: "absolute inset-0",
1010
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1011
+ img.Img,
1012
+ {
1013
+ src: current.backgroundImage,
1014
+ alt: "Testimonial background image",
1015
+ className: "size-full object-cover",
1016
+ optixFlowConfig
1017
+ }
1018
+ )
1019
+ },
1020
+ currentIndex
1021
+ ) }),
1022
+ /* @__PURE__ */ jsxRuntime.jsx(
1023
+ "div",
1024
+ {
1025
+ className: "absolute inset-0 bg-black",
1026
+ style: { opacity: overlayOpacity }
1027
+ }
1028
+ )
1029
+ ] }),
1030
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex h-full flex-col items-center justify-center px-4", children: [
1031
+ /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ jsxRuntime.jsx(
1032
+ framerMotion.motion.div,
1033
+ {
1034
+ initial: { opacity: 0, y: 10 },
1035
+ animate: { opacity: 1, y: 0 },
1036
+ exit: { opacity: 0, y: -10 },
1037
+ transition: { duration: 0.4, ease: "easeInOut" },
1038
+ children: renderedTestimonialContent
1039
+ },
1040
+ currentIndex
1041
+ ) }),
1042
+ /* @__PURE__ */ jsxRuntime.jsxs(
1043
+ "div",
1044
+ {
1045
+ className: cn(
1046
+ "absolute bottom-8 left-0 right-0 flex items-center justify-center gap-4",
1047
+ navigationClassName
1048
+ ),
1049
+ children: [
1050
+ /* @__PURE__ */ jsxRuntime.jsx(
1051
+ Pressable,
1052
+ {
1053
+ asButton: true,
1054
+ variant: "default",
1055
+ size: "icon",
1056
+ className: cn("size-10 rounded-full", navButtonClassName),
1057
+ onClick: goToPrevious,
1058
+ "aria-label": previousButtonAriaLabel ?? "Previous testimonial",
1059
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/chevron-left", size: 24 })
1060
+ }
1061
+ ),
1062
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex gap-2", dotsClassName), children: testimonials?.map((_, index) => /* @__PURE__ */ jsxRuntime.jsx(
1063
+ "button",
1064
+ {
1065
+ onClick: () => goToIndex(index),
1066
+ className: cn(
1067
+ "size-2 rounded-full transition-all",
1068
+ index === currentIndex ? "w-6 bg-primary" : "bg-white/40 hover:bg-white/60"
1069
+ ),
1070
+ "aria-label": `Go to testimonial ${index + 1}`
1071
+ },
1072
+ index
1073
+ )) }),
1074
+ /* @__PURE__ */ jsxRuntime.jsx(
1075
+ Pressable,
1076
+ {
1077
+ asButton: true,
1078
+ variant: "default",
1079
+ size: "icon",
1080
+ className: cn("size-10 rounded-full", navButtonClassName),
1081
+ onClick: goToNext,
1082
+ "aria-label": nextButtonAriaLabel ?? "Next testimonial",
1083
+ children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/chevron-right", size: 24 })
1084
+ }
1085
+ )
1086
+ ]
1087
+ }
1088
+ )
1089
+ ] })
1090
+ ]
1091
+ }
1092
+ );
581
1093
  }
582
1094
 
583
1095
  exports.TestimonialsCarouselImage = TestimonialsCarouselImage;