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