@opensite/ui 2.0.5 → 2.0.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 (75) hide show
  1. package/dist/hero-adaptable-product-grid.cjs +11 -8
  2. package/dist/hero-adaptable-product-grid.d.cts +1 -1
  3. package/dist/hero-adaptable-product-grid.d.ts +1 -1
  4. package/dist/hero-adaptable-product-grid.js +11 -8
  5. package/dist/hero-business-operations-mosaic.cjs +542 -22
  6. package/dist/hero-business-operations-mosaic.d.cts +20 -8
  7. package/dist/hero-business-operations-mosaic.d.ts +20 -8
  8. package/dist/hero-business-operations-mosaic.js +542 -19
  9. package/dist/hero-centered-gradient-cta.cjs +3 -3
  10. package/dist/hero-centered-gradient-cta.js +3 -3
  11. package/dist/hero-community-survey-cta.cjs +3 -2
  12. package/dist/hero-community-survey-cta.js +3 -2
  13. package/dist/hero-conversion-video-play.cjs +1 -1
  14. package/dist/hero-conversion-video-play.js +1 -1
  15. package/dist/hero-crm-streamlined.cjs +4 -4
  16. package/dist/hero-crm-streamlined.js +4 -4
  17. package/dist/hero-design-showcase-logos.cjs +4 -1
  18. package/dist/hero-design-showcase-logos.js +4 -1
  19. package/dist/hero-design-system-3d.cjs +1 -1
  20. package/dist/hero-design-system-3d.js +1 -1
  21. package/dist/hero-feature-cards-grid.cjs +2 -2
  22. package/dist/hero-feature-cards-grid.js +2 -2
  23. package/dist/hero-fullscreen-background-image.cjs +4 -3
  24. package/dist/hero-fullscreen-background-image.js +4 -3
  25. package/dist/hero-fullscreen-logo-cta.cjs +7 -5
  26. package/dist/hero-fullscreen-logo-cta.js +7 -5
  27. package/dist/hero-gradient-avatars-rating.cjs +3 -3
  28. package/dist/hero-gradient-avatars-rating.js +3 -3
  29. package/dist/hero-gradient-client-focused.cjs +2 -2
  30. package/dist/hero-gradient-client-focused.js +2 -2
  31. package/dist/hero-grid-pattern-solutions.cjs +2 -2
  32. package/dist/hero-grid-pattern-solutions.d.cts +1 -1
  33. package/dist/hero-grid-pattern-solutions.d.ts +1 -1
  34. package/dist/hero-grid-pattern-solutions.js +2 -2
  35. package/dist/hero-innovation-image-grid.cjs +48 -42
  36. package/dist/hero-innovation-image-grid.js +48 -42
  37. package/dist/hero-mental-health-team.cjs +633 -89
  38. package/dist/hero-mental-health-team.d.cts +26 -6
  39. package/dist/hero-mental-health-team.d.ts +26 -6
  40. package/dist/hero-mental-health-team.js +614 -85
  41. package/dist/hero-minimal-centered-dark.cjs +841 -807
  42. package/dist/hero-minimal-centered-dark.d.cts +1 -1
  43. package/dist/hero-minimal-centered-dark.d.ts +1 -1
  44. package/dist/hero-minimal-centered-dark.js +840 -806
  45. package/dist/hero-presentation-platform-video.cjs +8 -2
  46. package/dist/hero-presentation-platform-video.js +8 -2
  47. package/dist/hero-product-showcase-floating.cjs +715 -612
  48. package/dist/hero-product-showcase-floating.d.cts +5 -1
  49. package/dist/hero-product-showcase-floating.d.ts +5 -1
  50. package/dist/hero-product-showcase-floating.js +712 -609
  51. package/dist/hero-saas-dashboard-preview.cjs +82 -107
  52. package/dist/hero-saas-dashboard-preview.d.cts +1 -1
  53. package/dist/hero-saas-dashboard-preview.d.ts +1 -1
  54. package/dist/hero-saas-dashboard-preview.js +82 -107
  55. package/dist/hero-software-growth-video-dialog.cjs +5 -5
  56. package/dist/hero-software-growth-video-dialog.js +5 -5
  57. package/dist/hero-split-image-newsletter.cjs +41 -32
  58. package/dist/hero-split-image-newsletter.js +41 -32
  59. package/dist/hero-stats-social-proof.cjs +1 -1
  60. package/dist/hero-stats-social-proof.js +1 -1
  61. package/dist/hero-testimonial-image-grid.cjs +2 -2
  62. package/dist/hero-testimonial-image-grid.js +2 -2
  63. package/dist/hero-therapy-testimonial-grid.cjs +682 -638
  64. package/dist/hero-therapy-testimonial-grid.d.cts +5 -1
  65. package/dist/hero-therapy-testimonial-grid.d.ts +5 -1
  66. package/dist/hero-therapy-testimonial-grid.js +671 -627
  67. package/dist/hero-ui-library-showcase.cjs +51 -42
  68. package/dist/hero-ui-library-showcase.js +51 -42
  69. package/dist/hero-video-dialog-gradient.cjs +2 -2
  70. package/dist/hero-video-dialog-gradient.js +2 -2
  71. package/dist/hero-video-overlay-stars.cjs +7 -15
  72. package/dist/hero-video-overlay-stars.js +7 -15
  73. package/dist/registry.cjs +608 -438
  74. package/dist/registry.js +608 -438
  75. package/package.json +1 -1
@@ -1,50 +1,37 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var React = require('react');
4
+ var React3 = require('react');
5
5
  var clsx = require('clsx');
6
6
  var tailwindMerge = require('tailwind-merge');
7
7
  var img = require('@page-speed/img');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
+ var classVarianceAuthority = require('class-variance-authority');
9
10
 
10
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
13
+ var n = Object.create(null);
14
+ if (e) {
15
+ Object.keys(e).forEach(function (k) {
16
+ if (k !== 'default') {
17
+ var d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: function () { return e[k]; }
21
+ });
22
+ }
23
+ });
24
+ }
25
+ n.default = e;
26
+ return Object.freeze(n);
27
+ }
11
28
 
12
- var React__default = /*#__PURE__*/_interopDefault(React);
29
+ var React3__namespace = /*#__PURE__*/_interopNamespace(React3);
13
30
 
14
31
  // components/blocks/hero/hero-mental-health-team.tsx
15
32
  function cn(...inputs) {
16
33
  return tailwindMerge.twMerge(clsx.clsx(inputs));
17
34
  }
18
- function getNestedCardBg(parentBg, variant = "muted", options) {
19
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
20
- if (isDark) {
21
- switch (variant) {
22
- case "muted":
23
- return "bg-background";
24
- case "card":
25
- return "bg-card";
26
- case "accent":
27
- return "bg-accent";
28
- case "subtle":
29
- return "bg-background/50";
30
- }
31
- } else {
32
- switch (variant) {
33
- case "muted":
34
- return "bg-muted";
35
- case "card":
36
- return "bg-card";
37
- case "accent":
38
- return "bg-accent";
39
- case "subtle":
40
- return "bg-muted/50";
41
- }
42
- }
43
- }
44
- function getNestedCardTextColor(parentBg, options) {
45
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
46
- return isDark ? "text-foreground" : "";
47
- }
48
35
  var maxWidthStyles = {
49
36
  sm: "max-w-screen-sm",
50
37
  md: "max-w-screen-md",
@@ -54,7 +41,7 @@ var maxWidthStyles = {
54
41
  "4xl": "max-w-[1536px]",
55
42
  full: "max-w-full"
56
43
  };
57
- var Container = React__default.default.forwardRef(
44
+ var Container = React3__namespace.default.forwardRef(
58
45
  ({ children, maxWidth = "xl", className, as = "div", ...props }, ref) => {
59
46
  const Component = as;
60
47
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -359,7 +346,7 @@ var spacingStyles = {
359
346
  };
360
347
  var predefinedSpacings = ["none", "sm", "md", "lg", "xl"];
361
348
  var isPredefinedSpacing = (spacing) => predefinedSpacings.includes(spacing);
362
- var Section = React__default.default.forwardRef(
349
+ var Section = React3__namespace.default.forwardRef(
363
350
  ({
364
351
  id,
365
352
  title,
@@ -420,79 +407,575 @@ var Section = React__default.default.forwardRef(
420
407
  }
421
408
  );
422
409
  Section.displayName = "Section";
410
+ var baseStyles = [
411
+ // Layout
412
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap shrink-0",
413
+ // Typography - using CSS variables with sensible defaults
414
+ "font-[var(--button-font-family,inherit)]",
415
+ "font-[var(--button-font-weight,500)]",
416
+ "tracking-[var(--button-letter-spacing,0)]",
417
+ "leading-[var(--button-line-height,1.25)]",
418
+ "[text-transform:var(--button-text-transform,none)]",
419
+ "text-sm",
420
+ // Border radius
421
+ "rounded-[var(--button-radius,var(--radius,0.375rem))]",
422
+ // Smooth transition - using [transition:...] to set full shorthand property (not just transition-property)
423
+ "[transition:var(--button-transition,all_250ms_cubic-bezier(0.4,0,0.2,1))]",
424
+ // Box shadow (master level) - using [box-shadow:...] for complex multi-value shadows
425
+ "[box-shadow:var(--button-shadow,none)]",
426
+ "hover:[box-shadow:var(--button-shadow-hover,var(--button-shadow,none))]",
427
+ // Disabled state
428
+ "disabled:pointer-events-none disabled:opacity-50",
429
+ // SVG handling
430
+ "[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0",
431
+ // Focus styles
432
+ "outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
433
+ // Invalid state
434
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive"
435
+ ].join(" ");
436
+ var buttonVariants = classVarianceAuthority.cva(baseStyles, {
437
+ variants: {
438
+ variant: {
439
+ // Default (Primary) variant - full customization
440
+ default: [
441
+ "bg-[var(--button-default-bg,hsl(var(--primary)))]",
442
+ "text-[var(--button-default-fg,hsl(var(--primary-foreground)))]",
443
+ "border-[length:var(--button-default-border-width,0px)]",
444
+ "border-[color:var(--button-default-border,transparent)]",
445
+ "[box-shadow:var(--button-default-shadow,var(--button-shadow,none))]",
446
+ "hover:bg-[var(--button-default-hover-bg,hsl(var(--primary)/0.9))]",
447
+ "hover:text-[var(--button-default-hover-fg,var(--button-default-fg,hsl(var(--primary-foreground))))]",
448
+ "hover:border-[color:var(--button-default-hover-border,var(--button-default-border,transparent))]",
449
+ "hover:[box-shadow:var(--button-default-shadow-hover,var(--button-shadow-hover,var(--button-default-shadow,var(--button-shadow,none))))]"
450
+ ].join(" "),
451
+ // Destructive variant - full customization
452
+ destructive: [
453
+ "bg-[var(--button-destructive-bg,hsl(var(--destructive)))]",
454
+ "text-[var(--button-destructive-fg,white)]",
455
+ "border-[length:var(--button-destructive-border-width,0px)]",
456
+ "border-[color:var(--button-destructive-border,transparent)]",
457
+ "[box-shadow:var(--button-destructive-shadow,var(--button-shadow,none))]",
458
+ "hover:bg-[var(--button-destructive-hover-bg,hsl(var(--destructive)/0.9))]",
459
+ "hover:text-[var(--button-destructive-hover-fg,var(--button-destructive-fg,white))]",
460
+ "hover:border-[color:var(--button-destructive-hover-border,var(--button-destructive-border,transparent))]",
461
+ "hover:[box-shadow:var(--button-destructive-shadow-hover,var(--button-shadow-hover,var(--button-destructive-shadow,var(--button-shadow,none))))]",
462
+ "focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
463
+ "dark:bg-destructive/60"
464
+ ].join(" "),
465
+ // Outline variant - full customization with proper border handling
466
+ outline: [
467
+ "bg-[var(--button-outline-bg,hsl(var(--background)))]",
468
+ "text-[var(--button-outline-fg,inherit)]",
469
+ "border-[length:var(--button-outline-border-width,1px)]",
470
+ "border-[color:var(--button-outline-border,hsl(var(--border)))]",
471
+ "[box-shadow:var(--button-outline-shadow,var(--button-shadow,0_1px_2px_0_rgb(0_0_0/0.05)))]",
472
+ "hover:bg-[var(--button-outline-hover-bg,hsl(var(--accent)))]",
473
+ "hover:text-[var(--button-outline-hover-fg,hsl(var(--accent-foreground)))]",
474
+ "hover:border-[color:var(--button-outline-hover-border,var(--button-outline-border,hsl(var(--border))))]",
475
+ "hover:[box-shadow:var(--button-outline-shadow-hover,var(--button-shadow-hover,var(--button-outline-shadow,var(--button-shadow,none))))]",
476
+ "dark:bg-input/30 dark:border-input dark:hover:bg-input/50"
477
+ ].join(" "),
478
+ // Secondary variant - full customization
479
+ secondary: [
480
+ "bg-[var(--button-secondary-bg,hsl(var(--secondary)))]",
481
+ "text-[var(--button-secondary-fg,hsl(var(--secondary-foreground)))]",
482
+ "border-[length:var(--button-secondary-border-width,0px)]",
483
+ "border-[color:var(--button-secondary-border,transparent)]",
484
+ "[box-shadow:var(--button-secondary-shadow,var(--button-shadow,none))]",
485
+ "hover:bg-[var(--button-secondary-hover-bg,hsl(var(--secondary)/0.8))]",
486
+ "hover:text-[var(--button-secondary-hover-fg,var(--button-secondary-fg,hsl(var(--secondary-foreground))))]",
487
+ "hover:border-[color:var(--button-secondary-hover-border,var(--button-secondary-border,transparent))]",
488
+ "hover:[box-shadow:var(--button-secondary-shadow-hover,var(--button-shadow-hover,var(--button-secondary-shadow,var(--button-shadow,none))))]"
489
+ ].join(" "),
490
+ // Ghost variant - full customization
491
+ ghost: [
492
+ "bg-[var(--button-ghost-bg,transparent)]",
493
+ "text-[var(--button-ghost-fg,inherit)]",
494
+ "border-[length:var(--button-ghost-border-width,0px)]",
495
+ "border-[color:var(--button-ghost-border,transparent)]",
496
+ "[box-shadow:var(--button-ghost-shadow,var(--button-shadow,none))]",
497
+ "hover:bg-[var(--button-ghost-hover-bg,hsl(var(--accent)))]",
498
+ "hover:text-[var(--button-ghost-hover-fg,hsl(var(--accent-foreground)))]",
499
+ "hover:border-[color:var(--button-ghost-hover-border,var(--button-ghost-border,transparent))]",
500
+ "hover:[box-shadow:var(--button-ghost-shadow-hover,var(--button-shadow-hover,var(--button-ghost-shadow,var(--button-shadow,none))))]",
501
+ "dark:hover:bg-accent/50"
502
+ ].join(" "),
503
+ // Link variant - full customization
504
+ link: [
505
+ "bg-[var(--button-link-bg,transparent)]",
506
+ "text-[var(--button-link-fg,hsl(var(--primary)))]",
507
+ "border-[length:var(--button-link-border-width,0px)]",
508
+ "border-[color:var(--button-link-border,transparent)]",
509
+ "[box-shadow:var(--button-link-shadow,none)]",
510
+ "hover:bg-[var(--button-link-hover-bg,transparent)]",
511
+ "hover:text-[var(--button-link-hover-fg,var(--button-link-fg,hsl(var(--primary))))]",
512
+ "hover:[box-shadow:var(--button-link-shadow-hover,none)]",
513
+ "underline-offset-4 hover:underline"
514
+ ].join(" ")
515
+ },
516
+ size: {
517
+ default: [
518
+ "h-[var(--button-height-md,2.25rem)]",
519
+ "px-[var(--button-padding-x-md,1rem)]",
520
+ "py-[var(--button-padding-y-md,0.5rem)]",
521
+ "has-[>svg]:px-[calc(var(--button-padding-x-md,1rem)*0.75)]"
522
+ ].join(" "),
523
+ sm: [
524
+ "h-[var(--button-height-sm,2rem)]",
525
+ "px-[var(--button-padding-x-sm,0.75rem)]",
526
+ "py-[var(--button-padding-y-sm,0.25rem)]",
527
+ "gap-1.5",
528
+ "has-[>svg]:px-[calc(var(--button-padding-x-sm,0.75rem)*0.83)]"
529
+ ].join(" "),
530
+ md: [
531
+ "h-[var(--button-height-md,2.25rem)]",
532
+ "px-[var(--button-padding-x-md,1rem)]",
533
+ "py-[var(--button-padding-y-md,0.5rem)]",
534
+ "has-[>svg]:px-[calc(var(--button-padding-x-md,1rem)*0.75)]"
535
+ ].join(" "),
536
+ lg: [
537
+ "h-[var(--button-height-lg,2.5rem)]",
538
+ "px-[var(--button-padding-x-lg,1.5rem)]",
539
+ "py-[var(--button-padding-y-lg,0.5rem)]",
540
+ "has-[>svg]:px-[calc(var(--button-padding-x-lg,1.5rem)*0.67)]"
541
+ ].join(" "),
542
+ icon: "size-[var(--button-height-md,2.25rem)]",
543
+ "icon-sm": "size-[var(--button-height-sm,2rem)]",
544
+ "icon-lg": "size-[var(--button-height-lg,2.5rem)]"
545
+ }
546
+ },
547
+ defaultVariants: {
548
+ variant: "default",
549
+ size: "default"
550
+ }
551
+ });
552
+ function normalizePhoneNumber(input) {
553
+ const trimmed = input.trim();
554
+ if (trimmed.toLowerCase().startsWith("tel:")) {
555
+ return trimmed;
556
+ }
557
+ const match = trimmed.match(/^[\s\+\-\(\)]*(\d[\d\s\-\(\)\.]*\d)[\s\-]*(x|ext\.?|extension)?[\s\-]*(\d+)?$/i);
558
+ if (match) {
559
+ const mainNumber = match[1].replace(/[\s\-\(\)\.]/g, "");
560
+ const extension = match[3];
561
+ const normalized = mainNumber.length >= 10 && !trimmed.startsWith("+") ? `+${mainNumber}` : mainNumber;
562
+ const withExtension = extension ? `${normalized};ext=${extension}` : normalized;
563
+ return `tel:${withExtension}`;
564
+ }
565
+ const cleaned = trimmed.replace(/[\s\-\(\)\.]/g, "");
566
+ return `tel:${cleaned}`;
567
+ }
568
+ function normalizeEmail(input) {
569
+ const trimmed = input.trim();
570
+ if (trimmed.toLowerCase().startsWith("mailto:")) {
571
+ return trimmed;
572
+ }
573
+ return `mailto:${trimmed}`;
574
+ }
575
+ function isEmail(input) {
576
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
577
+ return emailRegex.test(input.trim());
578
+ }
579
+ function isPhoneNumber(input) {
580
+ const trimmed = input.trim();
581
+ if (trimmed.toLowerCase().startsWith("tel:")) {
582
+ return true;
583
+ }
584
+ const phoneRegex = /^[\s\+\-\(\)]*\d[\d\s\-\(\)\.]*\d[\s\-]*(x|ext\.?|extension)?[\s\-]*\d*$/i;
585
+ return phoneRegex.test(trimmed);
586
+ }
587
+ function isInternalUrl(href) {
588
+ if (typeof window === "undefined") {
589
+ return href.startsWith("/") && !href.startsWith("//");
590
+ }
591
+ const trimmed = href.trim();
592
+ if (trimmed.startsWith("/") && !trimmed.startsWith("//")) {
593
+ return true;
594
+ }
595
+ try {
596
+ const url = new URL(trimmed, window.location.href);
597
+ const currentOrigin = window.location.origin;
598
+ const normalizeOrigin = (origin) => origin.replace(/^(https?:\/\/)(www\.)?/, "$1");
599
+ return normalizeOrigin(url.origin) === normalizeOrigin(currentOrigin);
600
+ } catch {
601
+ return false;
602
+ }
603
+ }
604
+ function toRelativePath(href) {
605
+ if (typeof window === "undefined") {
606
+ return href;
607
+ }
608
+ const trimmed = href.trim();
609
+ if (trimmed.startsWith("/") && !trimmed.startsWith("//")) {
610
+ return trimmed;
611
+ }
612
+ try {
613
+ const url = new URL(trimmed, window.location.href);
614
+ const currentOrigin = window.location.origin;
615
+ const normalizeOrigin = (origin) => origin.replace(/^(https?:\/\/)(www\.)?/, "$1");
616
+ if (normalizeOrigin(url.origin) === normalizeOrigin(currentOrigin)) {
617
+ return url.pathname + url.search + url.hash;
618
+ }
619
+ } catch {
620
+ }
621
+ return trimmed;
622
+ }
623
+ function useNavigation({
624
+ href,
625
+ onClick
626
+ } = {}) {
627
+ const linkType = React3__namespace.useMemo(() => {
628
+ if (!href || href.trim() === "") {
629
+ return onClick ? "none" : "none";
630
+ }
631
+ const trimmed = href.trim();
632
+ if (trimmed.toLowerCase().startsWith("mailto:") || isEmail(trimmed)) {
633
+ return "mailto";
634
+ }
635
+ if (trimmed.toLowerCase().startsWith("tel:") || isPhoneNumber(trimmed)) {
636
+ return "tel";
637
+ }
638
+ if (isInternalUrl(trimmed)) {
639
+ return "internal";
640
+ }
641
+ try {
642
+ new URL(trimmed, typeof window !== "undefined" ? window.location.href : "http://localhost");
643
+ return "external";
644
+ } catch {
645
+ return "internal";
646
+ }
647
+ }, [href, onClick]);
648
+ const normalizedHref = React3__namespace.useMemo(() => {
649
+ if (!href || href.trim() === "") {
650
+ return void 0;
651
+ }
652
+ const trimmed = href.trim();
653
+ switch (linkType) {
654
+ case "tel":
655
+ return normalizePhoneNumber(trimmed);
656
+ case "mailto":
657
+ return normalizeEmail(trimmed);
658
+ case "internal":
659
+ return toRelativePath(trimmed);
660
+ case "external":
661
+ return trimmed;
662
+ default:
663
+ return trimmed;
664
+ }
665
+ }, [href, linkType]);
666
+ const target = React3__namespace.useMemo(() => {
667
+ switch (linkType) {
668
+ case "external":
669
+ return "_blank";
670
+ case "internal":
671
+ return "_self";
672
+ case "mailto":
673
+ case "tel":
674
+ return void 0;
675
+ default:
676
+ return void 0;
677
+ }
678
+ }, [linkType]);
679
+ const rel = React3__namespace.useMemo(() => {
680
+ if (linkType === "external") {
681
+ return "noopener noreferrer";
682
+ }
683
+ return void 0;
684
+ }, [linkType]);
685
+ const isExternal = linkType === "external";
686
+ const isInternal = linkType === "internal";
687
+ const shouldUseRouter = isInternal && typeof normalizedHref === "string" && normalizedHref.startsWith("/");
688
+ const handleClick = React3__namespace.useCallback(
689
+ (event) => {
690
+ if (onClick) {
691
+ try {
692
+ onClick(event);
693
+ } catch (error) {
694
+ console.error("Error in user onClick handler:", error);
695
+ }
696
+ }
697
+ if (event.defaultPrevented) {
698
+ return;
699
+ }
700
+ if (shouldUseRouter && normalizedHref && event.button === 0 && // left-click only
701
+ !event.metaKey && !event.altKey && !event.ctrlKey && !event.shiftKey) {
702
+ if (typeof window !== "undefined") {
703
+ const handler = window.__opensiteNavigationHandler;
704
+ if (typeof handler === "function") {
705
+ try {
706
+ const handled = handler(normalizedHref, event.nativeEvent || event);
707
+ if (handled !== false) {
708
+ event.preventDefault();
709
+ }
710
+ } catch (error) {
711
+ console.error("Error in navigation handler:", error);
712
+ }
713
+ }
714
+ }
715
+ }
716
+ },
717
+ [onClick, shouldUseRouter, normalizedHref]
718
+ );
719
+ return {
720
+ linkType,
721
+ normalizedHref,
722
+ target,
723
+ rel,
724
+ isExternal,
725
+ isInternal,
726
+ shouldUseRouter,
727
+ handleClick
728
+ };
729
+ }
730
+ var Pressable = React3__namespace.forwardRef(
731
+ ({
732
+ children,
733
+ className,
734
+ href,
735
+ onClick,
736
+ variant,
737
+ size,
738
+ asButton = false,
739
+ fallbackComponentType = "span",
740
+ componentType,
741
+ "aria-label": ariaLabel,
742
+ "aria-describedby": ariaDescribedby,
743
+ id,
744
+ ...props
745
+ }, ref) => {
746
+ const navigation = useNavigation({ href, onClick });
747
+ const {
748
+ normalizedHref,
749
+ target,
750
+ rel,
751
+ linkType,
752
+ isInternal,
753
+ handleClick
754
+ } = navigation;
755
+ const shouldRenderLink = normalizedHref && linkType !== "none";
756
+ const shouldRenderButton = !shouldRenderLink && onClick;
757
+ const effectiveComponentType = componentType || (shouldRenderLink ? "a" : shouldRenderButton ? "button" : fallbackComponentType);
758
+ const finalComponentType = isInternal && shouldRenderLink ? "a" : effectiveComponentType;
759
+ const shouldApplyButtonStyles = asButton || variant || size;
760
+ const combinedClassName = cn(
761
+ shouldApplyButtonStyles && buttonVariants({ variant, size }),
762
+ className
763
+ );
764
+ const dataProps = Object.fromEntries(
765
+ Object.entries(props).filter(([key]) => key.startsWith("data-"))
766
+ );
767
+ const buttonDataAttributes = shouldApplyButtonStyles ? {
768
+ "data-slot": "button",
769
+ "data-variant": variant ?? "default",
770
+ "data-size": size ?? "default"
771
+ } : {};
772
+ const commonProps = {
773
+ className: combinedClassName,
774
+ onClick: handleClick,
775
+ "aria-label": ariaLabel,
776
+ "aria-describedby": ariaDescribedby,
777
+ id,
778
+ ...dataProps,
779
+ ...buttonDataAttributes
780
+ };
781
+ if (finalComponentType === "a" && shouldRenderLink) {
782
+ return /* @__PURE__ */ jsxRuntime.jsx(
783
+ "a",
784
+ {
785
+ ref,
786
+ href: normalizedHref,
787
+ target,
788
+ rel,
789
+ ...commonProps,
790
+ ...props,
791
+ children
792
+ }
793
+ );
794
+ }
795
+ if (finalComponentType === "button") {
796
+ return /* @__PURE__ */ jsxRuntime.jsx(
797
+ "button",
798
+ {
799
+ ref,
800
+ type: props.type || "button",
801
+ ...commonProps,
802
+ ...props,
803
+ children
804
+ }
805
+ );
806
+ }
807
+ if (finalComponentType === "div") {
808
+ return /* @__PURE__ */ jsxRuntime.jsx(
809
+ "div",
810
+ {
811
+ ref,
812
+ ...commonProps,
813
+ children
814
+ }
815
+ );
816
+ }
817
+ return /* @__PURE__ */ jsxRuntime.jsx(
818
+ "span",
819
+ {
820
+ ref,
821
+ ...commonProps,
822
+ children
823
+ }
824
+ );
825
+ }
826
+ );
827
+ Pressable.displayName = "Pressable";
828
+ var MOBILE_CLASSES = {
829
+ "fit-left": "items-start md:items-center",
830
+ "fit-center": "items-center",
831
+ "fit-right": "items-end md:items-center",
832
+ "full-left": "items-stretch md:items-center",
833
+ "full-center": "items-stretch md:items-center",
834
+ "full-right": "items-stretch md:items-center"
835
+ };
836
+ function BlockActions({
837
+ mobileConfig,
838
+ actionsClassName,
839
+ verticalSpacing = "mt-4 md:mt-8",
840
+ actions,
841
+ actionsSlot
842
+ }) {
843
+ const width = mobileConfig?.width ?? "full";
844
+ const position = mobileConfig?.position ?? "center";
845
+ const mobileLayoutClass = MOBILE_CLASSES[`${width}-${position}`];
846
+ if (actionsSlot) {
847
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { children: actionsSlot });
848
+ } else if (actions && actions?.length > 0) {
849
+ return /* @__PURE__ */ jsxRuntime.jsx(
850
+ "div",
851
+ {
852
+ className: cn(
853
+ "flex flex-col md:flex-row flex-wrap gap-4",
854
+ mobileLayoutClass,
855
+ actionsClassName,
856
+ verticalSpacing
857
+ ),
858
+ children: actions.map((action, index) => /* @__PURE__ */ jsxRuntime.jsx(ActionComponent, { action }, index))
859
+ }
860
+ );
861
+ } else {
862
+ return null;
863
+ }
864
+ }
865
+ function ActionComponent({ action }) {
866
+ const {
867
+ label,
868
+ icon,
869
+ iconAfter,
870
+ children,
871
+ href,
872
+ onClick,
873
+ className: actionClassName,
874
+ ...pressableProps
875
+ } = action;
876
+ return /* @__PURE__ */ jsxRuntime.jsx(
877
+ Pressable,
878
+ {
879
+ href,
880
+ onClick,
881
+ asButton: action.asButton ?? true,
882
+ className: actionClassName,
883
+ ...pressableProps,
884
+ children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
885
+ icon,
886
+ label,
887
+ iconAfter
888
+ ] })
889
+ }
890
+ );
891
+ }
423
892
  function HeroMentalHealthTeam({
424
- subtitle,
893
+ description,
894
+ descriptionClassName,
895
+ actions,
896
+ actionsSlot,
897
+ actionsClassName,
425
898
  heading,
426
- teamImages,
427
- teamImagesSlot,
899
+ smallImages,
900
+ smallImagesSlot,
428
901
  testimonial,
429
902
  testimonialSlot,
430
903
  featureImage,
431
904
  featureImageSlot,
432
905
  background,
433
- spacing,
906
+ spacing = "xl",
434
907
  pattern,
435
908
  patternOpacity,
436
909
  className,
437
- containerClassName,
910
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
438
911
  headerClassName,
439
912
  headingClassName,
440
913
  gridClassName,
441
914
  optixFlowConfig
442
915
  }) {
443
- const renderTeamImages = React.useMemo(() => {
444
- if (teamImagesSlot) return teamImagesSlot;
445
- if (!teamImages || teamImages.length === 0) return null;
916
+ const renderSmallImages = React3.useMemo(() => {
917
+ if (smallImagesSlot) return smallImagesSlot;
918
+ if (!smallImages || smallImages.length === 0) return null;
446
919
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
447
- teamImages[0] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-[1/2] row-[1/2] w-full", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full max-h-77.5 w-full overflow-hidden rounded-2xl", children: /* @__PURE__ */ jsxRuntime.jsx(
920
+ smallImages[0] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-[1/2] row-[1/2] w-full", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full max-h-77.5 w-full overflow-hidden rounded-2xl", children: /* @__PURE__ */ jsxRuntime.jsx(
448
921
  img.Img,
449
922
  {
450
- src: teamImages[0].src,
451
- alt: teamImages[0].alt,
452
- className: cn("block h-full w-full object-cover object-center", teamImages[0].className),
923
+ src: smallImages[0].src,
924
+ alt: smallImages[0].alt,
925
+ className: cn(
926
+ "block h-full w-full object-cover object-center",
927
+ smallImages[0].className
928
+ ),
453
929
  optixFlowConfig
454
930
  }
455
931
  ) }) }),
456
- teamImages[1] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-[2/3] row-[1/2] w-full md:col-[2/3] md:row-[1/2]", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full max-h-77.5 w-full overflow-hidden rounded-2xl", children: /* @__PURE__ */ jsxRuntime.jsx(
932
+ smallImages[1] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-[2/3] row-[1/2] w-full md:col-[2/3] md:row-[1/2]", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full max-h-77.5 w-full overflow-hidden rounded-2xl", children: /* @__PURE__ */ jsxRuntime.jsx(
457
933
  img.Img,
458
934
  {
459
- src: teamImages[1].src,
460
- alt: teamImages[1].alt,
461
- className: cn("block h-full w-full object-cover object-center", teamImages[1].className),
935
+ src: smallImages[1].src,
936
+ alt: smallImages[1].alt,
937
+ className: cn(
938
+ "block h-full w-full object-cover object-center",
939
+ smallImages[1].className
940
+ ),
462
941
  optixFlowConfig
463
942
  }
464
943
  ) }) })
465
944
  ] });
466
- }, [teamImagesSlot, teamImages, optixFlowConfig]);
467
- const renderTestimonial = React.useMemo(() => {
945
+ }, [smallImagesSlot, smallImages, optixFlowConfig]);
946
+ const renderTestimonial = React3.useMemo(() => {
468
947
  if (testimonialSlot) return testimonialSlot;
469
948
  if (!testimonial) return null;
470
949
  const avatarSrc = testimonial.avatarSrc ?? testimonial.avatar?.src;
471
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-[1/3] row-[3/4] w-full md:col-[1/3] md:row-[2/3]", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(
472
- "flex h-full min-h-37.5 flex-col gap-3 overflow-hidden rounded-3xl p-5 px-5 md:flex-row md:items-center md:gap-7 md:py-8",
473
- getNestedCardBg(background),
474
- getNestedCardTextColor(background)
475
- ), children: [
476
- avatarSrc && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 w-20 shrink-0 overflow-hidden rounded-xl md:h-30 md:w-30", children: /* @__PURE__ */ jsxRuntime.jsx(
477
- img.Img,
478
- {
479
- src: avatarSrc,
480
- alt: testimonial.avatar?.alt ?? "",
481
- className: "h-full w-full object-cover object-center",
482
- optixFlowConfig
483
- }
484
- ) }),
485
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full w-full flex-col justify-between gap-2", children: [
486
- /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-lg font-medium ", children: [
487
- '"',
488
- testimonial.quote,
489
- '"'
490
- ] }),
491
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "", children: testimonial.author })
492
- ] })
493
- ] }) });
950
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-[1/3] row-[3/4] w-full md:col-[1/3] md:row-[2/3]", children: /* @__PURE__ */ jsxRuntime.jsxs(
951
+ "div",
952
+ {
953
+ className: cn(
954
+ "flex h-full min-h-37.5 flex-col gap-3 overflow-hidden rounded-3xl p-5 px-5 md:flex-row md:items-center md:gap-7 md:py-8 bg-muted"
955
+ ),
956
+ children: [
957
+ avatarSrc && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-20 w-20 shrink-0 overflow-hidden rounded-xl md:h-30 md:w-30", children: /* @__PURE__ */ jsxRuntime.jsx(
958
+ img.Img,
959
+ {
960
+ src: avatarSrc,
961
+ alt: testimonial.avatar?.alt ?? "",
962
+ className: "h-full w-full object-cover object-center",
963
+ optixFlowConfig
964
+ }
965
+ ) }),
966
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full w-full flex-col justify-between gap-2 text-muted-foreground", children: [
967
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-lg font-medium", children: [
968
+ '"',
969
+ testimonial.quote,
970
+ '"'
971
+ ] }),
972
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "", children: testimonial.author })
973
+ ] })
974
+ ]
975
+ }
976
+ ) });
494
977
  }, [testimonialSlot, testimonial, optixFlowConfig]);
495
- const renderFeatureImage = React.useMemo(() => {
978
+ const renderFeatureImage = React3.useMemo(() => {
496
979
  if (featureImageSlot) return featureImageSlot;
497
980
  if (!featureImage) return null;
498
981
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-[1/3] row-[2/3] h-100 w-full md:col-[3/5] md:row-[1/3] md:h-auto", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full max-h-130.5 w-full overflow-hidden rounded-2xl", children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -500,7 +983,10 @@ function HeroMentalHealthTeam({
500
983
  {
501
984
  src: featureImage.src,
502
985
  alt: featureImage.alt,
503
- className: cn("block h-full w-full object-cover object-center", featureImage.className),
986
+ className: cn(
987
+ "block h-full w-full object-cover object-center",
988
+ featureImage.className
989
+ ),
504
990
  optixFlowConfig
505
991
  }
506
992
  ) }) });
@@ -508,17 +994,75 @@ function HeroMentalHealthTeam({
508
994
  return /* @__PURE__ */ jsxRuntime.jsx(
509
995
  Section,
510
996
  {
511
- className: cn("dark bg-background py-12 font-sans md:py-20", className),
512
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("container", containerClassName), children: [
513
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mx-auto mb-24 flex max-w-[900px] flex-col items-center gap-3", headerClassName), children: [
514
- subtitle && (typeof subtitle === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-center ", children: subtitle }) : subtitle),
515
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h1", { className: cn("text-center text-4xl leading-tight font-medium sm:text-5xl md:text-6xl", headingClassName), children: heading }) : /* @__PURE__ */ jsxRuntime.jsx("h1", { className: cn("text-center text-4xl leading-tight font-medium sm:text-5xl md:text-6xl", headingClassName), children: heading }))
516
- ] }),
517
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("grid w-full max-w-332.5 auto-cols-auto grid-cols-2 grid-rows-[auto_auto] justify-center gap-5 md:grid-cols-[repeat(4,1fr)]", gridClassName), children: [
518
- renderTeamImages,
519
- renderTestimonial,
520
- renderFeatureImage
521
- ] })
997
+ background,
998
+ spacing,
999
+ pattern,
1000
+ patternOpacity,
1001
+ className,
1002
+ containerClassName,
1003
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "pt-10 md:pt-0", children: [
1004
+ /* @__PURE__ */ jsxRuntime.jsxs(
1005
+ "div",
1006
+ {
1007
+ className: cn(
1008
+ "mx-auto mb-16 flex max-w-[900px] flex-col items-center gap-6",
1009
+ headerClassName
1010
+ ),
1011
+ children: [
1012
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1013
+ "h1",
1014
+ {
1015
+ className: cn(
1016
+ "text-center text-4xl leading-tight font-medium sm:text-5xl md:text-6xl text-balance",
1017
+ headingClassName
1018
+ ),
1019
+ children: heading
1020
+ }
1021
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1022
+ "h1",
1023
+ {
1024
+ className: cn(
1025
+ "text-center text-4xl leading-tight font-medium sm:text-5xl md:text-6xl text-balance",
1026
+ headingClassName
1027
+ ),
1028
+ children: heading
1029
+ }
1030
+ )),
1031
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1032
+ "p",
1033
+ {
1034
+ className: cn(
1035
+ "text-center text-lg md:text-xl text-balance",
1036
+ descriptionClassName
1037
+ ),
1038
+ children: description
1039
+ }
1040
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description })),
1041
+ /* @__PURE__ */ jsxRuntime.jsx(
1042
+ BlockActions,
1043
+ {
1044
+ actions,
1045
+ actionsSlot,
1046
+ actionsClassName
1047
+ }
1048
+ )
1049
+ ]
1050
+ }
1051
+ ),
1052
+ /* @__PURE__ */ jsxRuntime.jsxs(
1053
+ "div",
1054
+ {
1055
+ className: cn(
1056
+ "grid w-full max-w-332.5 auto-cols-auto grid-cols-2 grid-rows-[auto_auto] justify-center gap-5 md:grid-cols-[repeat(4,1fr)]",
1057
+ gridClassName
1058
+ ),
1059
+ children: [
1060
+ renderSmallImages,
1061
+ renderTestimonial,
1062
+ renderFeatureImage
1063
+ ]
1064
+ }
1065
+ )
522
1066
  ] })
523
1067
  }
524
1068
  );