@opensite/ui 2.8.7 → 2.8.9

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 (163) hide show
  1. package/dist/about-culture-tabs.cjs +174 -174
  2. package/dist/about-culture-tabs.js +174 -174
  3. package/dist/about-developer-profile.cjs +200 -200
  4. package/dist/about-developer-profile.js +198 -198
  5. package/dist/about-developer-story.cjs +142 -142
  6. package/dist/about-developer-story.js +142 -142
  7. package/dist/about-mission-dual-image.cjs +142 -142
  8. package/dist/about-mission-dual-image.js +142 -142
  9. package/dist/about-mission-features.cjs +142 -142
  10. package/dist/about-mission-features.js +142 -142
  11. package/dist/about-network-spotlight.cjs +142 -142
  12. package/dist/about-network-spotlight.js +142 -142
  13. package/dist/about-story-expertise.cjs +142 -142
  14. package/dist/about-story-expertise.js +142 -142
  15. package/dist/about-streamline-team.cjs +142 -142
  16. package/dist/about-streamline-team.js +142 -142
  17. package/dist/carousel-icon-sidebar.cjs +5 -4
  18. package/dist/carousel-icon-sidebar.js +5 -4
  19. package/dist/community-initiatives.cjs +142 -142
  20. package/dist/community-initiatives.js +142 -142
  21. package/dist/components.cjs +723 -1364
  22. package/dist/components.d.cts +0 -2
  23. package/dist/components.d.ts +0 -2
  24. package/dist/components.js +633 -1273
  25. package/dist/contact-map.cjs +14 -1069
  26. package/dist/contact-map.d.cts +13 -3
  27. package/dist/contact-map.d.ts +13 -3
  28. package/dist/contact-map.js +14 -1069
  29. package/dist/cta-feature-checklist.cjs +142 -142
  30. package/dist/cta-feature-checklist.js +142 -142
  31. package/dist/faq-numbered-grid.cjs +142 -142
  32. package/dist/faq-numbered-grid.js +142 -142
  33. package/dist/feature-animated-carousel.cjs +142 -142
  34. package/dist/feature-animated-carousel.js +142 -142
  35. package/dist/feature-bento-utilities.cjs +142 -142
  36. package/dist/feature-bento-utilities.js +142 -142
  37. package/dist/feature-capabilities-grid.cjs +142 -142
  38. package/dist/feature-capabilities-grid.js +142 -142
  39. package/dist/feature-category-image-cards.cjs +142 -142
  40. package/dist/feature-category-image-cards.js +142 -142
  41. package/dist/feature-icon-grid-bordered.cjs +142 -142
  42. package/dist/feature-icon-grid-bordered.js +142 -142
  43. package/dist/feature-icon-grid-muted.cjs +142 -142
  44. package/dist/feature-icon-grid-muted.js +142 -142
  45. package/dist/feature-numbered-cards.cjs +142 -142
  46. package/dist/feature-numbered-cards.js +142 -142
  47. package/dist/feature-three-column-values.cjs +142 -142
  48. package/dist/feature-three-column-values.js +142 -142
  49. package/dist/hero-ad-campaign-expert.cjs +142 -142
  50. package/dist/hero-ad-campaign-expert.js +142 -142
  51. package/dist/hero-adaptable-product-grid.cjs +142 -142
  52. package/dist/hero-adaptable-product-grid.js +142 -142
  53. package/dist/hero-agency-animated-images.cjs +142 -142
  54. package/dist/hero-agency-animated-images.js +142 -142
  55. package/dist/hero-announcement-badge.cjs +142 -142
  56. package/dist/hero-announcement-badge.js +142 -142
  57. package/dist/hero-badge-image-split.cjs +142 -142
  58. package/dist/hero-badge-image-split.js +142 -142
  59. package/dist/hero-business-carousel-dots.cjs +142 -142
  60. package/dist/hero-business-carousel-dots.js +142 -142
  61. package/dist/hero-business-operations-mosaic.cjs +142 -142
  62. package/dist/hero-business-operations-mosaic.js +142 -142
  63. package/dist/hero-conversation-intelligence.cjs +142 -142
  64. package/dist/hero-conversation-intelligence.js +142 -142
  65. package/dist/hero-creative-studio-stacked.cjs +142 -142
  66. package/dist/hero-creative-studio-stacked.js +142 -142
  67. package/dist/hero-crm-streamlined.cjs +142 -142
  68. package/dist/hero-crm-streamlined.js +142 -142
  69. package/dist/hero-customer-support-layered.cjs +142 -142
  70. package/dist/hero-customer-support-layered.js +142 -142
  71. package/dist/hero-design-showcase-logos.cjs +142 -142
  72. package/dist/hero-design-showcase-logos.js +142 -142
  73. package/dist/hero-design-system-3d.cjs +142 -142
  74. package/dist/hero-design-system-3d.js +142 -142
  75. package/dist/hero-developer-tools-code.cjs +142 -142
  76. package/dist/hero-developer-tools-code.js +142 -142
  77. package/dist/hero-digital-agency-fullscreen.cjs +142 -142
  78. package/dist/hero-digital-agency-fullscreen.js +142 -142
  79. package/dist/hero-ecommerce-product-showcase.cjs +174 -174
  80. package/dist/hero-ecommerce-product-showcase.js +174 -174
  81. package/dist/hero-event-registration.cjs +142 -142
  82. package/dist/hero-event-registration.js +142 -142
  83. package/dist/hero-fullscreen-background-image.cjs +142 -142
  84. package/dist/hero-fullscreen-background-image.js +142 -142
  85. package/dist/hero-gradient-avatars-rating.cjs +142 -142
  86. package/dist/hero-gradient-avatars-rating.js +142 -142
  87. package/dist/hero-gradient-client-focused.cjs +142 -142
  88. package/dist/hero-gradient-client-focused.js +142 -142
  89. package/dist/hero-hiring-animated-text.cjs +142 -142
  90. package/dist/hero-hiring-animated-text.js +142 -142
  91. package/dist/hero-image-left-content.cjs +142 -142
  92. package/dist/hero-image-left-content.js +142 -142
  93. package/dist/hero-innovation-image-grid.cjs +142 -142
  94. package/dist/hero-innovation-image-grid.js +142 -142
  95. package/dist/hero-mental-health-team.cjs +142 -142
  96. package/dist/hero-mental-health-team.js +142 -142
  97. package/dist/hero-minimal-centered-dark.cjs +174 -174
  98. package/dist/hero-minimal-centered-dark.js +174 -174
  99. package/dist/hero-presentation-platform-video.cjs +142 -142
  100. package/dist/hero-presentation-platform-video.js +142 -142
  101. package/dist/hero-product-showcase-floating.cjs +174 -174
  102. package/dist/hero-product-showcase-floating.js +174 -174
  103. package/dist/hero-shared-inbox-layered.cjs +142 -142
  104. package/dist/hero-shared-inbox-layered.js +142 -142
  105. package/dist/hero-software-growth-video-dialog.cjs +142 -142
  106. package/dist/hero-software-growth-video-dialog.js +142 -142
  107. package/dist/hero-spiral-pattern-cards.cjs +174 -174
  108. package/dist/hero-spiral-pattern-cards.js +174 -174
  109. package/dist/hero-split-geometric-shapes.cjs +142 -142
  110. package/dist/hero-split-geometric-shapes.js +142 -142
  111. package/dist/hero-startup-launch-cta.cjs +174 -174
  112. package/dist/hero-startup-launch-cta.js +174 -174
  113. package/dist/hero-stats-social-proof.cjs +174 -174
  114. package/dist/hero-stats-social-proof.js +174 -174
  115. package/dist/hero-task-timer-animated.cjs +142 -142
  116. package/dist/hero-task-timer-animated.js +142 -142
  117. package/dist/hero-testimonial-image-grid.cjs +142 -142
  118. package/dist/hero-testimonial-image-grid.js +142 -142
  119. package/dist/hero-therapy-testimonial-grid.cjs +142 -142
  120. package/dist/hero-therapy-testimonial-grid.js +142 -142
  121. package/dist/hero-ui-library-showcase.cjs +142 -142
  122. package/dist/hero-ui-library-showcase.js +142 -142
  123. package/dist/hero-video-background-dark.cjs +174 -174
  124. package/dist/hero-video-background-dark.js +174 -174
  125. package/dist/hero-video-dialog-gradient.cjs +142 -142
  126. package/dist/hero-video-dialog-gradient.js +142 -142
  127. package/dist/hero-video-overlay-stars.cjs +142 -142
  128. package/dist/hero-video-overlay-stars.js +142 -142
  129. package/dist/hero-welcome-asymmetric-images.cjs +142 -142
  130. package/dist/hero-welcome-asymmetric-images.js +142 -142
  131. package/dist/index.cjs +725 -1366
  132. package/dist/index.d.cts +0 -2
  133. package/dist/index.d.ts +0 -2
  134. package/dist/index.js +634 -1274
  135. package/dist/registry.cjs +2371 -2915
  136. package/dist/registry.js +1120 -1664
  137. package/dist/testimonials-large-quote.cjs +74 -43
  138. package/dist/testimonials-large-quote.d.cts +5 -1
  139. package/dist/testimonials-large-quote.d.ts +5 -1
  140. package/dist/testimonials-large-quote.js +74 -43
  141. package/dist/testimonials-logo-cards.cjs +8 -2
  142. package/dist/testimonials-logo-cards.js +8 -2
  143. package/dist/testimonials-masonry-grid.cjs +486 -69
  144. package/dist/testimonials-masonry-grid.d.cts +5 -1
  145. package/dist/testimonials-masonry-grid.d.ts +5 -1
  146. package/dist/testimonials-masonry-grid.js +483 -63
  147. package/dist/testimonials-mini-dividers.cjs +2 -3
  148. package/dist/testimonials-mini-dividers.js +2 -3
  149. package/dist/testimonials-minimal-numbered.cjs +5 -4
  150. package/dist/testimonials-minimal-numbered.js +5 -4
  151. package/dist/testimonials-parallax-number.cjs +5 -4
  152. package/dist/testimonials-parallax-number.js +5 -4
  153. package/dist/testimonials-scrolling-columns.cjs +7 -12
  154. package/dist/testimonials-scrolling-columns.js +7 -12
  155. package/dist/testimonials-stats-header.cjs +528 -87
  156. package/dist/testimonials-stats-header.d.cts +39 -3
  157. package/dist/testimonials-stats-header.d.ts +39 -3
  158. package/dist/testimonials-stats-header.js +523 -82
  159. package/package.json +4 -7
  160. package/dist/geo-map.cjs +0 -1103
  161. package/dist/geo-map.d.cts +0 -92
  162. package/dist/geo-map.d.ts +0 -92
  163. package/dist/geo-map.js +0 -1081
package/dist/index.cjs CHANGED
@@ -1,19 +1,18 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var React6 = require('react');
4
+ var React4 = require('react');
5
5
  var clsx = require('clsx');
6
6
  var tailwindMerge = require('tailwind-merge');
7
7
  var jsxRuntime = require('react/jsx-runtime');
8
- var maps = require('@page-speed/maps');
9
- var classVarianceAuthority = require('class-variance-authority');
10
- var icon = require('@page-speed/icon');
11
- var img = require('@page-speed/img');
12
8
  var framerMotion = require('framer-motion');
13
9
  var useOnClickOutside = require('@opensite/hooks/useOnClickOutside');
14
10
  var react = require('motion/react');
11
+ var img = require('@page-speed/img');
15
12
  var reactSlot = require('@radix-ui/react-slot');
13
+ var classVarianceAuthority = require('class-variance-authority');
16
14
  var PopoverPrimitive = require('@radix-ui/react-popover');
15
+ var icon = require('@page-speed/icon');
17
16
  var usePlatformFromUrl = require('@opensite/hooks/usePlatformFromUrl');
18
17
  var TabsPrimitive = require('@radix-ui/react-tabs');
19
18
  var integration = require('@page-speed/forms/integration');
@@ -36,7 +35,7 @@ function _interopNamespace(e) {
36
35
  return Object.freeze(n);
37
36
  }
38
37
 
39
- var React6__namespace = /*#__PURE__*/_interopNamespace(React6);
38
+ var React4__namespace = /*#__PURE__*/_interopNamespace(React4);
40
39
  var PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespace(PopoverPrimitive);
41
40
  var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
42
41
 
@@ -143,7 +142,7 @@ var maxWidthStyles = {
143
142
  "4xl": "max-w-[1536px]",
144
143
  full: "max-w-full"
145
144
  };
146
- var Container = React6__namespace.default.forwardRef(
145
+ var Container = React4__namespace.default.forwardRef(
147
146
  ({ children, maxWidth = "xl", className, as = "div", ...props }, ref) => {
148
147
  const Component = as;
149
148
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -449,7 +448,7 @@ var spacingStyles = {
449
448
  };
450
449
  var predefinedSpacings = ["none", "sm", "md", "lg", "xl", "hero"];
451
450
  var isPredefinedSpacing = (spacing) => predefinedSpacings.includes(spacing);
452
- var Section = React6__namespace.default.forwardRef(
451
+ var Section = React4__namespace.default.forwardRef(
453
452
  ({
454
453
  id,
455
454
  title,
@@ -510,1131 +509,65 @@ var Section = React6__namespace.default.forwardRef(
510
509
  }
511
510
  );
512
511
  Section.displayName = "Section";
513
- function normalizePhoneNumber(input) {
514
- const trimmed = input.trim();
515
- if (trimmed.toLowerCase().startsWith("tel:")) {
516
- return trimmed;
517
- }
518
- const match = trimmed.match(/^[\s\+\-\(\)]*(\d[\d\s\-\(\)\.]*\d)[\s\-]*(x|ext\.?|extension)?[\s\-]*(\d+)?$/i);
519
- if (match) {
520
- const mainNumber = match[1].replace(/[\s\-\(\)\.]/g, "");
521
- const extension = match[3];
522
- const normalized = mainNumber.length >= 10 && !trimmed.startsWith("+") ? `+${mainNumber}` : mainNumber;
523
- const withExtension = extension ? `${normalized};ext=${extension}` : normalized;
524
- return `tel:${withExtension}`;
525
- }
526
- const cleaned = trimmed.replace(/[\s\-\(\)\.]/g, "");
527
- return `tel:${cleaned}`;
528
- }
529
- function normalizeEmail(input) {
530
- const trimmed = input.trim();
531
- if (trimmed.toLowerCase().startsWith("mailto:")) {
532
- return trimmed;
533
- }
534
- return `mailto:${trimmed}`;
535
- }
536
- function isEmail(input) {
537
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
538
- return emailRegex.test(input.trim());
539
- }
540
- function isPhoneNumber(input) {
541
- const trimmed = input.trim();
542
- if (trimmed.toLowerCase().startsWith("tel:")) {
543
- return true;
544
- }
545
- const phoneRegex = /^[\s\+\-\(\)]*\d[\d\s\-\(\)\.]*\d[\s\-]*(x|ext\.?|extension)?[\s\-]*\d*$/i;
546
- return phoneRegex.test(trimmed);
547
- }
548
- function isInternalUrl(href) {
549
- if (typeof window === "undefined") {
550
- return href.startsWith("/") && !href.startsWith("//");
551
- }
552
- const trimmed = href.trim();
553
- if (trimmed.startsWith("/") && !trimmed.startsWith("//")) {
554
- return true;
555
- }
556
- try {
557
- const url = new URL(trimmed, window.location.href);
558
- const currentOrigin = window.location.origin;
559
- const normalizeOrigin = (origin) => origin.replace(/^(https?:\/\/)(www\.)?/, "$1");
560
- return normalizeOrigin(url.origin) === normalizeOrigin(currentOrigin);
561
- } catch {
562
- return false;
563
- }
564
- }
565
- function toRelativePath(href) {
566
- if (typeof window === "undefined") {
567
- return href;
568
- }
569
- const trimmed = href.trim();
570
- if (trimmed.startsWith("/") && !trimmed.startsWith("//")) {
571
- return trimmed;
572
- }
573
- try {
574
- const url = new URL(trimmed, window.location.href);
575
- const currentOrigin = window.location.origin;
576
- const normalizeOrigin = (origin) => origin.replace(/^(https?:\/\/)(www\.)?/, "$1");
577
- if (normalizeOrigin(url.origin) === normalizeOrigin(currentOrigin)) {
578
- return url.pathname + url.search + url.hash;
579
- }
580
- } catch {
581
- }
582
- return trimmed;
583
- }
584
- function useNavigation({
585
- href,
586
- onClick
587
- } = {}) {
588
- const linkType = React6__namespace.useMemo(() => {
589
- if (!href || href.trim() === "") {
590
- return onClick ? "none" : "none";
591
- }
592
- const trimmed = href.trim();
593
- if (trimmed.toLowerCase().startsWith("mailto:") || isEmail(trimmed)) {
594
- return "mailto";
595
- }
596
- if (trimmed.toLowerCase().startsWith("tel:") || isPhoneNumber(trimmed)) {
597
- return "tel";
598
- }
599
- if (isInternalUrl(trimmed)) {
600
- return "internal";
601
- }
602
- try {
603
- new URL(trimmed, typeof window !== "undefined" ? window.location.href : "http://localhost");
604
- return "external";
605
- } catch {
606
- return "internal";
607
- }
608
- }, [href, onClick]);
609
- const normalizedHref = React6__namespace.useMemo(() => {
610
- if (!href || href.trim() === "") {
611
- return void 0;
612
- }
613
- const trimmed = href.trim();
614
- switch (linkType) {
615
- case "tel":
616
- return normalizePhoneNumber(trimmed);
617
- case "mailto":
618
- return normalizeEmail(trimmed);
619
- case "internal":
620
- return toRelativePath(trimmed);
621
- case "external":
622
- return trimmed;
623
- default:
624
- return trimmed;
625
- }
626
- }, [href, linkType]);
627
- const target = React6__namespace.useMemo(() => {
628
- switch (linkType) {
629
- case "external":
630
- return "_blank";
631
- case "internal":
632
- return "_self";
633
- case "mailto":
634
- case "tel":
635
- return void 0;
636
- default:
637
- return void 0;
512
+ var sizeStyles = {
513
+ sm: "max-w-md",
514
+ md: "max-w-2xl",
515
+ lg: "max-w-4xl",
516
+ xl: "max-w-5xl",
517
+ full: "max-w-7xl",
518
+ compact: "max-w-[700px]"
519
+ };
520
+ var dialogTransition = {
521
+ duration: 0.35,
522
+ ease: [0.16, 1, 0.3, 1]
523
+ };
524
+ function AnimatedDialog({
525
+ open,
526
+ onOpenChange,
527
+ title,
528
+ eyebrow,
529
+ description,
530
+ children,
531
+ header,
532
+ footer,
533
+ size = "lg",
534
+ className,
535
+ contentClassName,
536
+ featuredMediaHeader
537
+ }) {
538
+ const titleId = React4.useId();
539
+ const descriptionId = React4.useId();
540
+ const containerRef = React4.useRef(null);
541
+ useOnClickOutside.useOnClickOutside(containerRef, () => {
542
+ if (open) {
543
+ onOpenChange(false);
638
544
  }
639
- }, [linkType]);
640
- const rel = React6__namespace.useMemo(() => {
641
- if (linkType === "external") {
642
- return "noopener noreferrer";
545
+ });
546
+ React4.useEffect(() => {
547
+ if (!open) {
548
+ return;
643
549
  }
644
- return void 0;
645
- }, [linkType]);
646
- const isExternal = linkType === "external";
647
- const isInternal = linkType === "internal";
648
- const shouldUseRouter = isInternal && typeof normalizedHref === "string" && normalizedHref.startsWith("/");
649
- const handleClick = React6__namespace.useCallback(
650
- (event) => {
651
- if (onClick) {
652
- try {
653
- onClick(event);
654
- } catch (error) {
655
- console.error("Error in user onClick handler:", error);
656
- }
657
- }
658
- if (event.defaultPrevented) {
659
- return;
550
+ const onKeyDown = (event) => {
551
+ if (event.key === "Escape") {
552
+ onOpenChange(false);
660
553
  }
661
- if (shouldUseRouter && normalizedHref && event.button === 0 && // left-click only
662
- !event.metaKey && !event.altKey && !event.ctrlKey && !event.shiftKey) {
663
- if (typeof window !== "undefined") {
664
- const handler = window.__opensiteNavigationHandler;
665
- if (typeof handler === "function") {
666
- try {
667
- const handled = handler(normalizedHref, event.nativeEvent || event);
668
- if (handled !== false) {
669
- event.preventDefault();
670
- }
671
- } catch (error) {
672
- console.error("Error in navigation handler:", error);
673
- }
674
- }
675
- }
676
- }
677
- },
678
- [onClick, shouldUseRouter, normalizedHref]
679
- );
680
- return {
681
- linkType,
682
- normalizedHref,
683
- target,
684
- rel,
685
- isExternal,
686
- isInternal,
687
- shouldUseRouter,
688
- handleClick
689
- };
690
- }
691
- var baseStyles = [
692
- // Layout
693
- "inline-flex items-center justify-center gap-2 whitespace-nowrap shrink-0",
694
- // Typography - using CSS variables with sensible defaults
695
- "font-[var(--button-font-family,inherit)]",
696
- "font-[var(--button-font-weight,500)]",
697
- "tracking-[var(--button-letter-spacing,0)]",
698
- "leading-[var(--button-line-height,1.25)]",
699
- "[text-transform:var(--button-text-transform,none)]",
700
- "text-sm",
701
- // Border radius
702
- "rounded-[var(--button-radius,var(--radius,0.375rem))]",
703
- // Smooth transition - using [transition:...] to set full shorthand property (not just transition-property)
704
- "[transition:var(--button-transition,all_250ms_cubic-bezier(0.4,0,0.2,1))]",
705
- // Box shadow (master level) - using [box-shadow:...] for complex multi-value shadows
706
- "[box-shadow:var(--button-shadow,none)]",
707
- "hover:[box-shadow:var(--button-shadow-hover,var(--button-shadow,none))]",
708
- // Disabled state
709
- "disabled:pointer-events-none disabled:opacity-50",
710
- // SVG handling
711
- "[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0",
712
- // Focus styles
713
- "outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
714
- // Invalid state
715
- "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive"
716
- ].join(" ");
717
- var buttonVariants = classVarianceAuthority.cva(baseStyles, {
718
- variants: {
719
- variant: {
720
- // Default (Primary) variant - full customization
721
- default: [
722
- "bg-[var(--button-default-bg,hsl(var(--primary)))]",
723
- "text-[var(--button-default-fg,hsl(var(--primary-foreground)))]",
724
- "border-[length:var(--button-default-border-width,0px)]",
725
- "border-[color:var(--button-default-border,transparent)]",
726
- "[box-shadow:var(--button-default-shadow,var(--button-shadow,none))]",
727
- "hover:bg-[var(--button-default-hover-bg,hsl(var(--primary)/0.9))]",
728
- "hover:text-[var(--button-default-hover-fg,var(--button-default-fg,hsl(var(--primary-foreground))))]",
729
- "hover:border-[color:var(--button-default-hover-border,var(--button-default-border,transparent))]",
730
- "hover:[box-shadow:var(--button-default-shadow-hover,var(--button-shadow-hover,var(--button-default-shadow,var(--button-shadow,none))))]"
731
- ].join(" "),
732
- // Destructive variant - full customization
733
- destructive: [
734
- "bg-[var(--button-destructive-bg,hsl(var(--destructive)))]",
735
- "text-[var(--button-destructive-fg,white)]",
736
- "border-[length:var(--button-destructive-border-width,0px)]",
737
- "border-[color:var(--button-destructive-border,transparent)]",
738
- "[box-shadow:var(--button-destructive-shadow,var(--button-shadow,none))]",
739
- "hover:bg-[var(--button-destructive-hover-bg,hsl(var(--destructive)/0.9))]",
740
- "hover:text-[var(--button-destructive-hover-fg,var(--button-destructive-fg,white))]",
741
- "hover:border-[color:var(--button-destructive-hover-border,var(--button-destructive-border,transparent))]",
742
- "hover:[box-shadow:var(--button-destructive-shadow-hover,var(--button-shadow-hover,var(--button-destructive-shadow,var(--button-shadow,none))))]",
743
- "focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
744
- "dark:bg-destructive/60"
745
- ].join(" "),
746
- // Outline variant - full customization with proper border handling
747
- outline: [
748
- "bg-[var(--button-outline-bg,hsl(var(--background)))]",
749
- "text-[var(--button-outline-fg,inherit)]",
750
- "border-[length:var(--button-outline-border-width,1px)]",
751
- "border-[color:var(--button-outline-border,hsl(var(--border)))]",
752
- "[box-shadow:var(--button-outline-shadow,var(--button-shadow,0_1px_2px_0_rgb(0_0_0/0.05)))]",
753
- "hover:bg-[var(--button-outline-hover-bg,hsl(var(--accent)))]",
754
- "hover:text-[var(--button-outline-hover-fg,hsl(var(--accent-foreground)))]",
755
- "hover:border-[color:var(--button-outline-hover-border,var(--button-outline-border,hsl(var(--border))))]",
756
- "hover:[box-shadow:var(--button-outline-shadow-hover,var(--button-shadow-hover,var(--button-outline-shadow,var(--button-shadow,none))))]",
757
- "dark:bg-input/30 dark:border-input dark:hover:bg-input/50"
758
- ].join(" "),
759
- // Secondary variant - full customization
760
- secondary: [
761
- "bg-[var(--button-secondary-bg,hsl(var(--secondary)))]",
762
- "text-[var(--button-secondary-fg,hsl(var(--secondary-foreground)))]",
763
- "border-[length:var(--button-secondary-border-width,0px)]",
764
- "border-[color:var(--button-secondary-border,transparent)]",
765
- "[box-shadow:var(--button-secondary-shadow,var(--button-shadow,none))]",
766
- "hover:bg-[var(--button-secondary-hover-bg,hsl(var(--secondary)/0.8))]",
767
- "hover:text-[var(--button-secondary-hover-fg,var(--button-secondary-fg,hsl(var(--secondary-foreground))))]",
768
- "hover:border-[color:var(--button-secondary-hover-border,var(--button-secondary-border,transparent))]",
769
- "hover:[box-shadow:var(--button-secondary-shadow-hover,var(--button-shadow-hover,var(--button-secondary-shadow,var(--button-shadow,none))))]"
770
- ].join(" "),
771
- // Ghost variant - full customization
772
- ghost: [
773
- "bg-[var(--button-ghost-bg,transparent)]",
774
- "text-[var(--button-ghost-fg,inherit)]",
775
- "border-[length:var(--button-ghost-border-width,0px)]",
776
- "border-[color:var(--button-ghost-border,transparent)]",
777
- "[box-shadow:var(--button-ghost-shadow,var(--button-shadow,none))]",
778
- "hover:bg-[var(--button-ghost-hover-bg,hsl(var(--accent)))]",
779
- "hover:text-[var(--button-ghost-hover-fg,hsl(var(--accent-foreground)))]",
780
- "hover:border-[color:var(--button-ghost-hover-border,var(--button-ghost-border,transparent))]",
781
- "hover:[box-shadow:var(--button-ghost-shadow-hover,var(--button-shadow-hover,var(--button-ghost-shadow,var(--button-shadow,none))))]",
782
- "dark:hover:bg-accent/50"
783
- ].join(" "),
784
- // Link variant - full customization
785
- link: [
786
- "bg-[var(--button-link-bg,transparent)]",
787
- "text-[var(--button-link-fg,hsl(var(--primary)))]",
788
- "border-[length:var(--button-link-border-width,0px)]",
789
- "border-[color:var(--button-link-border,transparent)]",
790
- "[box-shadow:var(--button-link-shadow,none)]",
791
- "hover:bg-[var(--button-link-hover-bg,transparent)]",
792
- "hover:text-[var(--button-link-hover-fg,var(--button-link-fg,hsl(var(--primary))))]",
793
- "hover:[box-shadow:var(--button-link-shadow-hover,none)]",
794
- "underline-offset-4 hover:underline"
795
- ].join(" ")
796
- },
797
- size: {
798
- default: [
799
- "h-[var(--button-height-md,2.25rem)]",
800
- "px-[var(--button-padding-x-md,1rem)]",
801
- "py-[var(--button-padding-y-md,0.5rem)]",
802
- "has-[>svg]:px-[calc(var(--button-padding-x-md,1rem)*0.75)]"
803
- ].join(" "),
804
- sm: [
805
- "h-[var(--button-height-sm,2rem)]",
806
- "px-[var(--button-padding-x-sm,0.75rem)]",
807
- "py-[var(--button-padding-y-sm,0.25rem)]",
808
- "gap-1.5",
809
- "has-[>svg]:px-[calc(var(--button-padding-x-sm,0.75rem)*0.83)]"
810
- ].join(" "),
811
- md: [
812
- "h-[var(--button-height-md,2.25rem)]",
813
- "px-[var(--button-padding-x-md,1rem)]",
814
- "py-[var(--button-padding-y-md,0.5rem)]",
815
- "has-[>svg]:px-[calc(var(--button-padding-x-md,1rem)*0.75)]"
816
- ].join(" "),
817
- lg: [
818
- "h-[var(--button-height-lg,2.5rem)]",
819
- "px-[var(--button-padding-x-lg,1.5rem)]",
820
- "py-[var(--button-padding-y-lg,0.5rem)]",
821
- "has-[>svg]:px-[calc(var(--button-padding-x-lg,1.5rem)*0.67)]"
822
- ].join(" "),
823
- icon: "size-[var(--button-height-md,2.25rem)]",
824
- "icon-sm": "size-[var(--button-height-sm,2rem)]",
825
- "icon-lg": "size-[var(--button-height-lg,2.5rem)]"
826
- }
827
- },
828
- defaultVariants: {
829
- variant: "default",
830
- size: "default"
831
- }
832
- });
833
- var Pressable = React6__namespace.forwardRef(
834
- ({
835
- children,
836
- className,
837
- href,
838
- onClick,
839
- variant,
840
- size,
841
- asButton = false,
842
- fallbackComponentType = "span",
843
- componentType,
844
- "aria-label": ariaLabel,
845
- "aria-describedby": ariaDescribedby,
846
- id,
847
- ...props
848
- }, ref) => {
849
- const navigation = useNavigation({ href, onClick });
850
- const {
851
- normalizedHref,
852
- target,
853
- rel,
854
- linkType,
855
- isInternal,
856
- isExternal,
857
- handleClick
858
- } = navigation;
859
- const shouldRenderLink = normalizedHref && linkType !== "none";
860
- const shouldRenderButton = !shouldRenderLink && onClick;
861
- const effectiveComponentType = componentType || (shouldRenderLink ? "a" : shouldRenderButton ? "button" : fallbackComponentType);
862
- const finalComponentType = isInternal && shouldRenderLink ? "a" : effectiveComponentType;
863
- const shouldApplyButtonStyles = asButton || variant || size;
864
- const combinedClassName = cn(
865
- shouldApplyButtonStyles && buttonVariants({ variant, size }),
866
- className
867
- );
868
- const dataProps = Object.fromEntries(
869
- Object.entries(props).filter(([key]) => key.startsWith("data-"))
870
- );
871
- const buttonDataAttributes = shouldApplyButtonStyles ? {
872
- "data-slot": "button",
873
- "data-variant": variant ?? "default",
874
- "data-size": size ?? "default"
875
- } : {};
876
- const commonProps = {
877
- className: combinedClassName,
878
- onClick: handleClick,
879
- "aria-label": ariaLabel,
880
- "aria-describedby": ariaDescribedby,
881
- id,
882
- ...dataProps,
883
- ...buttonDataAttributes
884
- };
885
- if (finalComponentType === "a" && shouldRenderLink) {
886
- return /* @__PURE__ */ jsxRuntime.jsx(
887
- "a",
888
- {
889
- ref,
890
- href: normalizedHref,
891
- target,
892
- rel,
893
- ...commonProps,
894
- ...props,
895
- children
896
- }
897
- );
898
- }
899
- if (finalComponentType === "button") {
900
- return /* @__PURE__ */ jsxRuntime.jsx(
901
- "button",
902
- {
903
- ref,
904
- type: props.type || "button",
905
- ...commonProps,
906
- ...props,
907
- children
908
- }
909
- );
910
- }
911
- if (finalComponentType === "div") {
912
- return /* @__PURE__ */ jsxRuntime.jsx(
913
- "div",
914
- {
915
- ref,
916
- ...commonProps,
917
- children
918
- }
919
- );
920
- }
921
- return /* @__PURE__ */ jsxRuntime.jsx(
922
- "span",
923
- {
924
- ref,
925
- ...commonProps,
926
- children
927
- }
928
- );
929
- }
930
- );
931
- Pressable.displayName = "Pressable";
932
- var DEFAULT_ICON_API_KEY = "au382bi7fsh96w9h9xlrnat2jglx";
933
- var DynamicIcon = React6__namespace.memo(function DynamicIcon2({
934
- apiKey,
935
- ...props
936
- }) {
937
- return /* @__PURE__ */ jsxRuntime.jsx(icon.Icon, { ...props, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
938
- });
939
- DynamicIcon.displayName = "DynamicIcon";
940
- var PANEL_POSITION_CLASS = {
941
- "top-left": "left-4 top-4",
942
- "top-right": "right-4 top-4",
943
- "bottom-left": "bottom-4 left-4",
944
- "bottom-right": "bottom-4 right-4"
945
- };
946
- var DEFAULT_VIEW_STATE = {
947
- latitude: 39.5,
948
- longitude: -98.35,
949
- zoom: 3
950
- };
951
- var VIDEO_FILE_EXTENSION_REGEX = /\.(mp4|webm|ogg|mov|m4v|m3u8)(\?.*)?$/i;
952
- function resolveMediaType(item) {
953
- if (item.type) {
954
- return item.type;
955
- }
956
- return VIDEO_FILE_EXTENSION_REGEX.test(item.src) ? "video" : "image";
957
- }
958
- function normalizeId(value, fallback) {
959
- if (value === null || value === void 0 || value === "") {
960
- return fallback;
961
- }
962
- return String(value);
963
- }
964
- function buildClusterCenter(markers) {
965
- if (!markers.length) {
966
- return null;
967
- }
968
- const total = markers.reduce(
969
- (accumulator, marker) => ({
970
- latitude: accumulator.latitude + marker.latitude,
971
- longitude: accumulator.longitude + marker.longitude
972
- }),
973
- { latitude: 0, longitude: 0 }
974
- );
975
- return {
976
- latitude: total.latitude / markers.length,
977
- longitude: total.longitude / markers.length
978
- };
979
- }
980
- function resolveActionKey(action, index) {
981
- if (typeof action.label === "string" && action.label.trim().length > 0) {
982
- return `label:${action.label}:${index}`;
983
- }
984
- if (action.href) {
985
- return `href:${action.href}:${index}`;
986
- }
987
- return `action:${index}`;
988
- }
989
- function MarkerActions({ actions }) {
990
- if (!actions || actions.length === 0) {
991
- return null;
992
- }
993
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 flex flex-wrap gap-2", children: actions.map((action, index) => {
994
- const {
995
- label,
996
- icon,
997
- iconAfter,
998
- children,
999
- href,
1000
- onClick,
1001
- className: actionClassName,
1002
- variant,
1003
- size,
1004
- asButton,
1005
- ...rest
1006
- } = action;
1007
- return /* @__PURE__ */ jsxRuntime.jsx(
1008
- Pressable,
1009
- {
1010
- href,
1011
- onClick,
1012
- variant: variant ?? (index === 0 ? "default" : "outline"),
1013
- size: size ?? "sm",
1014
- asButton: asButton ?? true,
1015
- className: cn("inline-flex items-center gap-2", actionClassName),
1016
- ...rest,
1017
- children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1018
- icon,
1019
- label,
1020
- iconAfter
1021
- ] })
1022
- },
1023
- resolveActionKey(action, index)
1024
- );
1025
- }) });
1026
- }
1027
- function MarkerMediaCarousel({
1028
- mediaItems,
1029
- optixFlowConfig
1030
- }) {
1031
- const [activeIndex, setActiveIndex] = React6__namespace.useState(0);
1032
- const totalItems = mediaItems.length;
1033
- const mediaResetKey = React6__namespace.useMemo(
1034
- () => mediaItems.map((item, index) => {
1035
- const itemId = normalizeId(item.id, `media-${index}`);
1036
- return `${itemId}:${item.src}:${item.type ?? ""}:${item.poster ?? ""}`;
1037
- }).join("|"),
1038
- [mediaItems]
1039
- );
1040
- const activeItemIndex = Math.min(activeIndex, Math.max(0, totalItems - 1));
1041
- React6__namespace.useEffect(() => {
1042
- setActiveIndex(0);
1043
- }, [mediaResetKey]);
1044
- const activeMediaItem = mediaItems[activeItemIndex];
1045
- const mediaType = resolveMediaType(activeMediaItem);
1046
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative border-b border-border/60 bg-muted/40", children: [
1047
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-44 w-full overflow-hidden", children: mediaType === "video" ? /* @__PURE__ */ jsxRuntime.jsx(
1048
- "video",
1049
- {
1050
- className: "h-full w-full object-cover",
1051
- controls: true,
1052
- preload: "metadata",
1053
- poster: activeMediaItem.poster,
1054
- children: /* @__PURE__ */ jsxRuntime.jsx("source", { src: activeMediaItem.src })
1055
- }
1056
- ) : /* @__PURE__ */ jsxRuntime.jsx(
1057
- img.Img,
1058
- {
1059
- src: activeMediaItem.src,
1060
- alt: activeMediaItem.alt ?? "Map marker media",
1061
- className: "h-full w-full object-cover",
1062
- loading: "eager",
1063
- optixFlowConfig
1064
- }
1065
- ) }),
1066
- totalItems > 1 ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1067
- /* @__PURE__ */ jsxRuntime.jsx(
1068
- "button",
1069
- {
1070
- type: "button",
1071
- "aria-label": "Show previous media",
1072
- className: "absolute left-2 top-1/2 inline-flex size-8 -translate-y-1/2 items-center justify-center rounded-full bg-card text-card-foreground shadow-sm transition hover:bg-muted hover:text-muted-foreground",
1073
- onClick: () => {
1074
- setActiveIndex(
1075
- (current) => (current - 1 + totalItems) % totalItems
1076
- );
1077
- },
1078
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-left", size: 16 })
1079
- }
1080
- ),
1081
- /* @__PURE__ */ jsxRuntime.jsx(
1082
- "button",
1083
- {
1084
- type: "button",
1085
- "aria-label": "Show next media",
1086
- className: "absolute right-2 top-1/2 inline-flex h-8 w-8 -translate-y-1/2 items-center justify-center rounded-full bg-card text-card-foreground shadow-sm transition hover:bg-muted hover:text-muted-foreground",
1087
- onClick: () => {
1088
- setActiveIndex((current) => (current + 1) % totalItems);
1089
- },
1090
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
1091
- }
1092
- ),
1093
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-2 left-1/2 flex -translate-x-1/2 items-center gap-1.5", children: mediaItems.map((item, index) => /* @__PURE__ */ jsxRuntime.jsx(
1094
- "button",
1095
- {
1096
- type: "button",
1097
- "aria-label": `Show media item ${index + 1}`,
1098
- className: cn(
1099
- "h-2 rounded-full transition-all",
1100
- index === activeItemIndex ? "w-6 bg-card" : "w-2 bg-card opacity-50 hover:opacity-100"
1101
- ),
1102
- onClick: () => setActiveIndex(index)
1103
- },
1104
- normalizeId(item.id, `media-dot-${index}`)
1105
- )) })
1106
- ] }) : null
1107
- ] });
1108
- }
1109
- function getMarkerTitle(marker, markerIndex) {
1110
- if (marker.title !== void 0 && marker.title !== null) {
1111
- return marker.title;
1112
- }
1113
- if (marker.label !== void 0 && marker.label !== null) {
1114
- return marker.label;
1115
- }
1116
- return `Location ${markerIndex + 1}`;
1117
- }
1118
- function GeoMap({
1119
- className,
1120
- mapWrapperClassName,
1121
- mapClassName,
1122
- panelClassName,
1123
- panelPosition = "top-left",
1124
- stadiaApiKey = "",
1125
- mapStyle = "osm-bright",
1126
- styleUrl,
1127
- mapLibreCssHref,
1128
- markers = [],
1129
- clusters = [],
1130
- viewState,
1131
- defaultViewState,
1132
- onViewStateChange,
1133
- onMapClick,
1134
- onMarkerDrag,
1135
- showNavigationControl = true,
1136
- showGeolocateControl = false,
1137
- navigationControlPosition = "top-right",
1138
- geolocateControlPosition = "top-left",
1139
- flyToOptions,
1140
- markerFocusZoom = 14,
1141
- clusterFocusZoom = 5,
1142
- selectedMarkerId,
1143
- initialSelectedMarkerId,
1144
- onSelectionChange,
1145
- clearSelectionOnMapClick = true,
1146
- mapChildren,
1147
- optixFlowConfig
1148
- }) {
1149
- const normalizedStandaloneMarkers = React6__namespace.useMemo(
1150
- () => markers.map((marker, index) => ({
1151
- ...marker,
1152
- id: normalizeId(marker.id, `marker-${index}`)
1153
- })),
1154
- [markers]
1155
- );
1156
- const normalizedClusters = React6__namespace.useMemo(() => {
1157
- const results = [];
1158
- clusters.forEach((cluster, clusterIndex) => {
1159
- const clusterId = normalizeId(cluster.id, `cluster-${clusterIndex}`);
1160
- const normalizedClusterMarkers = cluster.markers.map(
1161
- (marker, markerIndex) => ({
1162
- ...marker,
1163
- id: normalizeId(marker.id, `${clusterId}-marker-${markerIndex}`),
1164
- clusterId
1165
- })
1166
- );
1167
- const clusterCenter = cluster.latitude !== void 0 && cluster.longitude !== void 0 ? { latitude: cluster.latitude, longitude: cluster.longitude } : buildClusterCenter(normalizedClusterMarkers);
1168
- if (!clusterCenter) {
1169
- return;
1170
- }
1171
- results.push({
1172
- ...cluster,
1173
- id: clusterId,
1174
- latitude: clusterCenter.latitude,
1175
- longitude: clusterCenter.longitude,
1176
- markers: normalizedClusterMarkers
1177
- });
1178
- });
1179
- return results;
1180
- }, [clusters]);
1181
- const markerLookup = React6__namespace.useMemo(() => {
1182
- const lookup = /* @__PURE__ */ new Map();
1183
- normalizedStandaloneMarkers.forEach((marker) => {
1184
- lookup.set(marker.id, marker);
1185
- });
1186
- normalizedClusters.forEach((cluster) => {
1187
- cluster.markers.forEach((marker) => {
1188
- lookup.set(marker.id, marker);
1189
- });
1190
- });
1191
- return lookup;
1192
- }, [normalizedClusters, normalizedStandaloneMarkers]);
1193
- const clusterLookup = React6__namespace.useMemo(() => {
1194
- const lookup = /* @__PURE__ */ new Map();
1195
- normalizedClusters.forEach((cluster) => {
1196
- lookup.set(cluster.id, cluster);
1197
- });
1198
- return lookup;
1199
- }, [normalizedClusters]);
1200
- const firstCoordinate = React6__namespace.useMemo(() => {
1201
- if (normalizedStandaloneMarkers.length > 0) {
1202
- const firstStandaloneMarker = normalizedStandaloneMarkers[0];
1203
- return {
1204
- latitude: firstStandaloneMarker.latitude,
1205
- longitude: firstStandaloneMarker.longitude
1206
- };
1207
- }
1208
- if (normalizedClusters.length > 0) {
1209
- const firstCluster = normalizedClusters[0];
1210
- return {
1211
- latitude: firstCluster.latitude,
1212
- longitude: firstCluster.longitude
1213
- };
1214
- }
1215
- return {
1216
- latitude: DEFAULT_VIEW_STATE.latitude,
1217
- longitude: DEFAULT_VIEW_STATE.longitude
1218
- };
1219
- }, [normalizedClusters, normalizedStandaloneMarkers]);
1220
- const [uncontrolledViewState, setUncontrolledViewState] = React6__namespace.useState({
1221
- latitude: defaultViewState?.latitude ?? firstCoordinate.latitude,
1222
- longitude: defaultViewState?.longitude ?? firstCoordinate.longitude,
1223
- zoom: defaultViewState?.zoom ?? DEFAULT_VIEW_STATE.zoom
1224
- });
1225
- const isControlledViewState = viewState !== void 0;
1226
- const resolvedViewState = isControlledViewState ? viewState : uncontrolledViewState;
1227
- const applyViewState = React6__namespace.useCallback(
1228
- (nextState) => {
1229
- if (!isControlledViewState) {
1230
- setUncontrolledViewState((current) => {
1231
- const next = { ...current, ...nextState };
1232
- const hasChanged = current.latitude !== next.latitude || current.longitude !== next.longitude || current.zoom !== next.zoom;
1233
- return hasChanged ? next : current;
1234
- });
1235
- }
1236
- onViewStateChange?.(nextState);
1237
- },
1238
- [isControlledViewState, onViewStateChange]
1239
- );
1240
- const [selection, setSelection] = React6__namespace.useState(() => {
1241
- if (initialSelectedMarkerId !== void 0 && initialSelectedMarkerId !== null) {
1242
- return {
1243
- type: "marker",
1244
- markerId: String(initialSelectedMarkerId)
1245
- };
1246
- }
1247
- return { type: "none" };
1248
- });
1249
- React6__namespace.useEffect(() => {
1250
- if (selectedMarkerId === void 0 || selectedMarkerId === null) {
1251
- return;
1252
- }
1253
- setSelection({
1254
- type: "marker",
1255
- markerId: String(selectedMarkerId)
1256
- });
1257
- }, [selectedMarkerId]);
1258
- const selectedMarker = selection.markerId ? markerLookup.get(selection.markerId) : void 0;
1259
- const selectedCluster = selection.clusterId ? clusterLookup.get(selection.clusterId) : void 0;
1260
- React6__namespace.useEffect(() => {
1261
- if (selection.type === "marker" && selection.markerId && !selectedMarker) {
1262
- setSelection({ type: "none" });
1263
- onSelectionChange?.({ type: "none" });
1264
- }
1265
- }, [onSelectionChange, selectedMarker, selection]);
1266
- const emitSelectionChange = React6__namespace.useCallback(
1267
- (nextSelection) => {
1268
- if (nextSelection.type === "none") {
1269
- onSelectionChange?.({ type: "none" });
1270
- return;
1271
- }
1272
- if (nextSelection.type === "marker") {
1273
- const parentCluster = nextSelection.marker.clusterId ? clusterLookup.get(nextSelection.marker.clusterId) : void 0;
1274
- onSelectionChange?.({
1275
- type: "marker",
1276
- marker: nextSelection.marker,
1277
- cluster: parentCluster
1278
- });
1279
- return;
1280
- }
1281
- onSelectionChange?.({
1282
- type: "cluster",
1283
- cluster: nextSelection.cluster
1284
- });
1285
- },
1286
- [clusterLookup, onSelectionChange]
1287
- );
1288
- const selectMarker = React6__namespace.useCallback(
1289
- (marker) => {
1290
- setSelection({
1291
- type: "marker",
1292
- markerId: marker.id,
1293
- clusterId: marker.clusterId
1294
- });
1295
- applyViewState({
1296
- latitude: marker.latitude,
1297
- longitude: marker.longitude,
1298
- zoom: markerFocusZoom
1299
- });
1300
- emitSelectionChange({ type: "marker", marker });
1301
- },
1302
- [applyViewState, emitSelectionChange, markerFocusZoom]
1303
- );
1304
- const selectCluster = React6__namespace.useCallback(
1305
- (cluster) => {
1306
- setSelection({
1307
- type: "cluster",
1308
- clusterId: cluster.id
1309
- });
1310
- applyViewState({
1311
- latitude: cluster.latitude,
1312
- longitude: cluster.longitude,
1313
- zoom: clusterFocusZoom
1314
- });
1315
- emitSelectionChange({ type: "cluster", cluster });
1316
- },
1317
- [applyViewState, clusterFocusZoom, emitSelectionChange]
1318
- );
1319
- const clearSelection = React6__namespace.useCallback(() => {
1320
- setSelection({ type: "none" });
1321
- emitSelectionChange({ type: "none" });
1322
- }, [emitSelectionChange]);
1323
- const mapMarkers = React6__namespace.useMemo(() => {
1324
- const resolvedMarkers = [];
1325
- normalizedClusters.forEach((cluster) => {
1326
- const isSelected = selection.type === "cluster" && selection.clusterId === cluster.id;
1327
- resolvedMarkers.push({
1328
- id: `cluster-pin:${cluster.id}`,
1329
- latitude: cluster.latitude,
1330
- longitude: cluster.longitude,
1331
- element: () => {
1332
- const customMarkerElement = cluster.markerElement;
1333
- const markerBody = typeof customMarkerElement === "function" ? customMarkerElement({
1334
- isSelected,
1335
- count: cluster.markers.length
1336
- }) : customMarkerElement;
1337
- return /* @__PURE__ */ jsxRuntime.jsx(
1338
- "button",
1339
- {
1340
- type: "button",
1341
- className: "group cursor-pointer",
1342
- onClick: (event) => {
1343
- event.preventDefault();
1344
- event.stopPropagation();
1345
- selectCluster(cluster);
1346
- },
1347
- "aria-label": `View ${cluster.markers.length} clustered locations`,
1348
- children: markerBody ?? /* @__PURE__ */ jsxRuntime.jsx(
1349
- "span",
1350
- {
1351
- className: cn(
1352
- "inline-flex min-h-10 min-w-10 items-center justify-center rounded-full border-2 border-white px-2 text-xs font-semibold text-white shadow-lg transition-transform duration-200 group-hover:scale-105",
1353
- isSelected && "ring-4 ring-primary/30",
1354
- cluster.pinClassName
1355
- ),
1356
- style: {
1357
- backgroundColor: cluster.pinColor ?? "var(--foreground)"
1358
- },
1359
- children: cluster.markers.length
1360
- }
1361
- )
1362
- }
1363
- );
1364
- }
1365
- });
1366
- });
1367
- normalizedStandaloneMarkers.forEach((marker) => {
1368
- const isSelected = selection.type === "marker" && selection.markerId === marker.id;
1369
- const customMarkerElement = marker.markerElement;
1370
- resolvedMarkers.push({
1371
- id: marker.id,
1372
- latitude: marker.latitude,
1373
- longitude: marker.longitude,
1374
- draggable: marker.draggable,
1375
- element: () => {
1376
- const markerBody = typeof customMarkerElement === "function" ? customMarkerElement({ isSelected }) : customMarkerElement;
1377
- return /* @__PURE__ */ jsxRuntime.jsx(
1378
- "button",
1379
- {
1380
- type: "button",
1381
- className: "group cursor-pointer",
1382
- onClick: (event) => {
1383
- event.preventDefault();
1384
- event.stopPropagation();
1385
- selectMarker(marker);
1386
- },
1387
- "aria-label": typeof marker.title === "string" ? `View ${marker.title}` : "View location details",
1388
- children: markerBody ?? /* @__PURE__ */ jsxRuntime.jsx(
1389
- "span",
1390
- {
1391
- className: cn(
1392
- "inline-flex h-4 w-4 rounded-full border-2 border-white shadow-md transition-transform duration-200 group-hover:scale-110",
1393
- isSelected && "h-5 w-5 ring-4 ring-primary/30",
1394
- marker.pinClassName
1395
- ),
1396
- style: {
1397
- backgroundColor: marker.pinColor ?? "#f43f5e"
1398
- }
1399
- }
1400
- )
1401
- }
1402
- );
1403
- }
1404
- });
1405
- });
1406
- return resolvedMarkers;
1407
- }, [
1408
- normalizedClusters,
1409
- normalizedStandaloneMarkers,
1410
- selectCluster,
1411
- selectMarker,
1412
- selection
1413
- ]);
1414
- const renderMarkerPanel = () => {
1415
- if (selectedMarker) {
1416
- const markerMediaItems = selectedMarker.mediaItems ?? [];
1417
- return /* @__PURE__ */ jsxRuntime.jsxs(
1418
- "div",
1419
- {
1420
- className: cn(
1421
- "relative w-[min(24rem,calc(100vw-2rem))] overflow-hidden rounded-xl border border-border bg-card text-card-foreground shadow-2xl",
1422
- panelClassName
1423
- ),
1424
- children: [
1425
- /* @__PURE__ */ jsxRuntime.jsx(
1426
- "button",
1427
- {
1428
- type: "button",
1429
- "aria-label": "Close marker details",
1430
- className: "flex size-8 items-center justify-center rounded-full border border-border bg-card text-card-foreground transition hover:bg-muted hover:text-foreground absolute top-2 right-2 z-10",
1431
- onClick: clearSelection,
1432
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", size: 16 })
1433
- }
1434
- ),
1435
- markerMediaItems.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
1436
- MarkerMediaCarousel,
1437
- {
1438
- mediaItems: markerMediaItems,
1439
- optixFlowConfig
1440
- }
1441
- ) : null,
1442
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2 p-4", children: [
1443
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-start justify-between gap-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 space-y-1", children: [
1444
- selectedMarker.eyebrow ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-semibold uppercase tracking-wide", children: selectedMarker.eyebrow }) : null,
1445
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-semibold leading-tight", children: selectedMarker.title ?? selectedMarker.label ?? "Location" })
1446
- ] }) }),
1447
- selectedMarker.summary ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm leading-relaxed", children: selectedMarker.summary }) : null,
1448
- selectedMarker.locationLine ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-row items-center justify-start text-sm gap-2", children: [
1449
- /* @__PURE__ */ jsxRuntime.jsx(
1450
- DynamicIcon,
1451
- {
1452
- name: "lucide:map-pin",
1453
- className: "opacity-50",
1454
- size: 14
1455
- }
1456
- ),
1457
- typeof selectedMarker.locationLine === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1458
- Pressable,
1459
- {
1460
- href: selectedMarker.locationUrl,
1461
- className: cn(
1462
- "transition-all duration-500",
1463
- "font-medium opacity-75 hover:opacity-100",
1464
- selectedMarker.locationUrl ? "underline underline-offset-4" : ""
1465
- ),
1466
- children: selectedMarker.locationLine
1467
- }
1468
- ) : selectedMarker.locationLine
1469
- ] }) : null,
1470
- selectedMarker.hoursLine ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-row items-center justify-start text-sm gap-2", children: [
1471
- /* @__PURE__ */ jsxRuntime.jsx(
1472
- DynamicIcon,
1473
- {
1474
- name: "lucide:clock",
1475
- className: "opacity-50",
1476
- size: 14
1477
- }
1478
- ),
1479
- typeof selectedMarker.hoursLine === "string" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium", children: selectedMarker.hoursLine }) : selectedMarker.hoursLine
1480
- ] }) : null,
1481
- selectedMarker.markerContentComponent ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative", children: selectedMarker.markerContentComponent }) : null,
1482
- /* @__PURE__ */ jsxRuntime.jsx(MarkerActions, { actions: selectedMarker.actions })
1483
- ] })
1484
- ]
1485
- }
1486
- );
1487
- }
1488
- if (selectedCluster) {
1489
- return /* @__PURE__ */ jsxRuntime.jsxs(
1490
- "div",
1491
- {
1492
- className: cn(
1493
- "relative w-[min(24rem,calc(100vw-2rem))] overflow-hidden rounded-xl border border-border bg-card text-card-foreground p-4 shadow-2xl",
1494
- panelClassName
1495
- ),
1496
- children: [
1497
- /* @__PURE__ */ jsxRuntime.jsx(
1498
- "button",
1499
- {
1500
- type: "button",
1501
- "aria-label": "Close cluster details",
1502
- className: "flex size-8 items-center justify-center rounded-full border border-border bg-card text-card-foreground transition hover:bg-muted hover:text-foreground absolute top-2 right-2 z-10",
1503
- onClick: clearSelection,
1504
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", size: 16 })
1505
- }
1506
- ),
1507
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-3 flex items-start justify-between gap-3", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
1508
- selectedCluster.label ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-semibold uppercase tracking-wide text-muted-foreground", children: selectedCluster.label }) : null,
1509
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-semibold leading-tight text-foreground", children: selectedCluster.title ?? "Clustered Locations" }),
1510
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: selectedCluster.summary ?? `${selectedCluster.markers.length} location${selectedCluster.markers.length === 1 ? "" : "s"} in this cluster.` })
1511
- ] }) }),
1512
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-56 space-y-2 overflow-y-auto pr-1", children: selectedCluster.markers.map((marker, markerIndex) => /* @__PURE__ */ jsxRuntime.jsxs(
1513
- "button",
1514
- {
1515
- type: "button",
1516
- className: "w-full rounded-lg border border-border/60 p-3 text-left transition hover:border-border hover:bg-muted/50",
1517
- onClick: () => selectMarker(marker),
1518
- children: [
1519
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "line-clamp-1 text-sm font-semibold text-foreground", children: getMarkerTitle(marker, markerIndex) }),
1520
- marker.summary ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 line-clamp-2 text-xs text-muted-foreground", children: marker.summary }) : null
1521
- ]
1522
- },
1523
- marker.id
1524
- )) })
1525
- ]
1526
- }
1527
- );
1528
- }
1529
- return null;
1530
- };
1531
- return /* @__PURE__ */ jsxRuntime.jsxs(
1532
- "div",
1533
- {
1534
- className: cn(
1535
- "relative overflow-hidden rounded-2xl border border-border bg-background",
1536
- className
1537
- ),
1538
- children: [
1539
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("h-[520px] w-full", mapWrapperClassName), children: /* @__PURE__ */ jsxRuntime.jsx(
1540
- maps.MapLibre,
1541
- {
1542
- stadiaApiKey,
1543
- mapStyle,
1544
- styleUrl,
1545
- mapLibreCssHref,
1546
- viewState: resolvedViewState,
1547
- onViewStateChange: applyViewState,
1548
- markers: mapMarkers,
1549
- onClick: (coord) => {
1550
- onMapClick?.(coord);
1551
- if (clearSelectionOnMapClick) {
1552
- clearSelection();
1553
- }
1554
- },
1555
- onMarkerDrag,
1556
- showNavigationControl,
1557
- showGeolocateControl,
1558
- navigationControlPosition,
1559
- geolocateControlPosition,
1560
- flyToOptions,
1561
- className: cn("h-full w-full", mapClassName),
1562
- children: mapChildren
1563
- }
1564
- ) }),
1565
- selection.type !== "none" ? /* @__PURE__ */ jsxRuntime.jsx(
1566
- "div",
1567
- {
1568
- className: cn(
1569
- "pointer-events-none absolute z-20",
1570
- PANEL_POSITION_CLASS[panelPosition]
1571
- ),
1572
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-auto", children: renderMarkerPanel() })
1573
- }
1574
- ) : null
1575
- ]
1576
- }
1577
- );
1578
- }
1579
- var sizeStyles = {
1580
- sm: "max-w-md",
1581
- md: "max-w-2xl",
1582
- lg: "max-w-4xl",
1583
- xl: "max-w-5xl",
1584
- full: "max-w-7xl",
1585
- compact: "max-w-[700px]"
1586
- };
1587
- var dialogTransition = {
1588
- duration: 0.35,
1589
- ease: [0.16, 1, 0.3, 1]
1590
- };
1591
- function AnimatedDialog({
1592
- open,
1593
- onOpenChange,
1594
- title,
1595
- eyebrow,
1596
- description,
1597
- children,
1598
- header,
1599
- footer,
1600
- size = "lg",
1601
- className,
1602
- contentClassName,
1603
- featuredMediaHeader
1604
- }) {
1605
- const titleId = React6.useId();
1606
- const descriptionId = React6.useId();
1607
- const containerRef = React6.useRef(null);
1608
- useOnClickOutside.useOnClickOutside(containerRef, () => {
1609
- if (open) {
1610
- onOpenChange(false);
1611
- }
1612
- });
1613
- React6.useEffect(() => {
1614
- if (!open) {
1615
- return;
1616
- }
1617
- const onKeyDown = (event) => {
1618
- if (event.key === "Escape") {
1619
- onOpenChange(false);
1620
- }
1621
- };
1622
- const previousOverflow = document.body.style.overflow;
1623
- document.body.style.overflow = "hidden";
1624
- window.addEventListener("keydown", onKeyDown);
1625
- return () => {
1626
- document.body.style.overflow = previousOverflow;
1627
- window.removeEventListener("keydown", onKeyDown);
1628
- };
1629
- }, [open, onOpenChange]);
1630
- return /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { children: open ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "fixed inset-0 z-50 h-screen overflow-y-auto", children: [
1631
- /* @__PURE__ */ jsxRuntime.jsx(
1632
- framerMotion.motion.div,
1633
- {
1634
- initial: { opacity: 0 },
1635
- animate: { opacity: 1, transition: dialogTransition },
1636
- exit: { opacity: 0, transition: dialogTransition },
1637
- className: "fixed inset-0 h-full w-full bg-foreground/80 backdrop-blur-lg"
554
+ };
555
+ const previousOverflow = document.body.style.overflow;
556
+ document.body.style.overflow = "hidden";
557
+ window.addEventListener("keydown", onKeyDown);
558
+ return () => {
559
+ document.body.style.overflow = previousOverflow;
560
+ window.removeEventListener("keydown", onKeyDown);
561
+ };
562
+ }, [open, onOpenChange]);
563
+ return /* @__PURE__ */ jsxRuntime.jsx(framerMotion.AnimatePresence, { children: open ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "fixed inset-0 z-50 h-screen overflow-y-auto", children: [
564
+ /* @__PURE__ */ jsxRuntime.jsx(
565
+ framerMotion.motion.div,
566
+ {
567
+ initial: { opacity: 0 },
568
+ animate: { opacity: 1, transition: dialogTransition },
569
+ exit: { opacity: 0, transition: dialogTransition },
570
+ className: "fixed inset-0 h-full w-full bg-foreground/80 backdrop-blur-lg"
1638
571
  }
1639
572
  ),
1640
573
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -1933,10 +866,10 @@ var ImageSlider = ({
1933
866
  optixFlowConfig
1934
867
  }) => {
1935
868
  const hasImages = images.length > 0;
1936
- const [currentIndex, setCurrentIndex] = React6__namespace.useState(
869
+ const [currentIndex, setCurrentIndex] = React4__namespace.useState(
1937
870
  () => normalizeIndex(startIndex, images.length)
1938
871
  );
1939
- const handleNext = React6__namespace.useCallback(() => {
872
+ const handleNext = React4__namespace.useCallback(() => {
1940
873
  if (!hasImages) return;
1941
874
  setCurrentIndex((prevIndex) => {
1942
875
  const nextIndex = prevIndex + 1 >= images.length ? 0 : prevIndex + 1;
@@ -1944,7 +877,7 @@ var ImageSlider = ({
1944
877
  return nextIndex;
1945
878
  });
1946
879
  }, [hasImages, images.length, onSlideChange]);
1947
- const handlePrevious = React6__namespace.useCallback(() => {
880
+ const handlePrevious = React4__namespace.useCallback(() => {
1948
881
  if (!hasImages) return;
1949
882
  setCurrentIndex((prevIndex) => {
1950
883
  const nextIndex = prevIndex - 1 < 0 ? images.length - 1 : prevIndex - 1;
@@ -1952,11 +885,11 @@ var ImageSlider = ({
1952
885
  return nextIndex;
1953
886
  });
1954
887
  }, [hasImages, images.length, onSlideChange]);
1955
- React6__namespace.useEffect(() => {
888
+ React4__namespace.useEffect(() => {
1956
889
  if (!hasImages) return;
1957
890
  setCurrentIndex(normalizeIndex(startIndex, images.length));
1958
891
  }, [startIndex, images.length, hasImages]);
1959
- React6__namespace.useEffect(() => {
892
+ React4__namespace.useEffect(() => {
1960
893
  if (!enableKeyboard || !hasImages) return;
1961
894
  const handleKeyDown = (event) => {
1962
895
  if (event.key === "ArrowRight") {
@@ -1970,7 +903,7 @@ var ImageSlider = ({
1970
903
  window.removeEventListener("keydown", handleKeyDown);
1971
904
  };
1972
905
  }, [enableKeyboard, handleNext, handlePrevious, hasImages]);
1973
- React6__namespace.useEffect(() => {
906
+ React4__namespace.useEffect(() => {
1974
907
  if (!autoplay || images.length < 2) return;
1975
908
  const interval = window.setInterval(handleNext, autoplayIntervalMs);
1976
909
  return () => window.clearInterval(interval);
@@ -2041,8 +974,150 @@ var ImageSlider = ({
2041
974
  ) : null
2042
975
  ]
2043
976
  }
2044
- );
2045
- };
977
+ );
978
+ };
979
+ var baseStyles = [
980
+ // Layout
981
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap shrink-0",
982
+ // Typography - using CSS variables with sensible defaults
983
+ "font-[var(--button-font-family,inherit)]",
984
+ "font-[var(--button-font-weight,500)]",
985
+ "tracking-[var(--button-letter-spacing,0)]",
986
+ "leading-[var(--button-line-height,1.25)]",
987
+ "[text-transform:var(--button-text-transform,none)]",
988
+ "text-sm",
989
+ // Border radius
990
+ "rounded-[var(--button-radius,var(--radius,0.375rem))]",
991
+ // Smooth transition - using [transition:...] to set full shorthand property (not just transition-property)
992
+ "[transition:var(--button-transition,all_250ms_cubic-bezier(0.4,0,0.2,1))]",
993
+ // Box shadow (master level) - using [box-shadow:...] for complex multi-value shadows
994
+ "[box-shadow:var(--button-shadow,none)]",
995
+ "hover:[box-shadow:var(--button-shadow-hover,var(--button-shadow,none))]",
996
+ // Disabled state
997
+ "disabled:pointer-events-none disabled:opacity-50",
998
+ // SVG handling
999
+ "[&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0",
1000
+ // Focus styles
1001
+ "outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
1002
+ // Invalid state
1003
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive"
1004
+ ].join(" ");
1005
+ var buttonVariants = classVarianceAuthority.cva(baseStyles, {
1006
+ variants: {
1007
+ variant: {
1008
+ // Default (Primary) variant - full customization
1009
+ default: [
1010
+ "bg-[var(--button-default-bg,hsl(var(--primary)))]",
1011
+ "text-[var(--button-default-fg,hsl(var(--primary-foreground)))]",
1012
+ "border-[length:var(--button-default-border-width,0px)]",
1013
+ "border-[color:var(--button-default-border,transparent)]",
1014
+ "[box-shadow:var(--button-default-shadow,var(--button-shadow,none))]",
1015
+ "hover:bg-[var(--button-default-hover-bg,hsl(var(--primary)/0.9))]",
1016
+ "hover:text-[var(--button-default-hover-fg,var(--button-default-fg,hsl(var(--primary-foreground))))]",
1017
+ "hover:border-[color:var(--button-default-hover-border,var(--button-default-border,transparent))]",
1018
+ "hover:[box-shadow:var(--button-default-shadow-hover,var(--button-shadow-hover,var(--button-default-shadow,var(--button-shadow,none))))]"
1019
+ ].join(" "),
1020
+ // Destructive variant - full customization
1021
+ destructive: [
1022
+ "bg-[var(--button-destructive-bg,hsl(var(--destructive)))]",
1023
+ "text-[var(--button-destructive-fg,white)]",
1024
+ "border-[length:var(--button-destructive-border-width,0px)]",
1025
+ "border-[color:var(--button-destructive-border,transparent)]",
1026
+ "[box-shadow:var(--button-destructive-shadow,var(--button-shadow,none))]",
1027
+ "hover:bg-[var(--button-destructive-hover-bg,hsl(var(--destructive)/0.9))]",
1028
+ "hover:text-[var(--button-destructive-hover-fg,var(--button-destructive-fg,white))]",
1029
+ "hover:border-[color:var(--button-destructive-hover-border,var(--button-destructive-border,transparent))]",
1030
+ "hover:[box-shadow:var(--button-destructive-shadow-hover,var(--button-shadow-hover,var(--button-destructive-shadow,var(--button-shadow,none))))]",
1031
+ "focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
1032
+ "dark:bg-destructive/60"
1033
+ ].join(" "),
1034
+ // Outline variant - full customization with proper border handling
1035
+ outline: [
1036
+ "bg-[var(--button-outline-bg,hsl(var(--background)))]",
1037
+ "text-[var(--button-outline-fg,inherit)]",
1038
+ "border-[length:var(--button-outline-border-width,1px)]",
1039
+ "border-[color:var(--button-outline-border,hsl(var(--border)))]",
1040
+ "[box-shadow:var(--button-outline-shadow,var(--button-shadow,0_1px_2px_0_rgb(0_0_0/0.05)))]",
1041
+ "hover:bg-[var(--button-outline-hover-bg,hsl(var(--accent)))]",
1042
+ "hover:text-[var(--button-outline-hover-fg,hsl(var(--accent-foreground)))]",
1043
+ "hover:border-[color:var(--button-outline-hover-border,var(--button-outline-border,hsl(var(--border))))]",
1044
+ "hover:[box-shadow:var(--button-outline-shadow-hover,var(--button-shadow-hover,var(--button-outline-shadow,var(--button-shadow,none))))]",
1045
+ "dark:bg-input/30 dark:border-input dark:hover:bg-input/50"
1046
+ ].join(" "),
1047
+ // Secondary variant - full customization
1048
+ secondary: [
1049
+ "bg-[var(--button-secondary-bg,hsl(var(--secondary)))]",
1050
+ "text-[var(--button-secondary-fg,hsl(var(--secondary-foreground)))]",
1051
+ "border-[length:var(--button-secondary-border-width,0px)]",
1052
+ "border-[color:var(--button-secondary-border,transparent)]",
1053
+ "[box-shadow:var(--button-secondary-shadow,var(--button-shadow,none))]",
1054
+ "hover:bg-[var(--button-secondary-hover-bg,hsl(var(--secondary)/0.8))]",
1055
+ "hover:text-[var(--button-secondary-hover-fg,var(--button-secondary-fg,hsl(var(--secondary-foreground))))]",
1056
+ "hover:border-[color:var(--button-secondary-hover-border,var(--button-secondary-border,transparent))]",
1057
+ "hover:[box-shadow:var(--button-secondary-shadow-hover,var(--button-shadow-hover,var(--button-secondary-shadow,var(--button-shadow,none))))]"
1058
+ ].join(" "),
1059
+ // Ghost variant - full customization
1060
+ ghost: [
1061
+ "bg-[var(--button-ghost-bg,transparent)]",
1062
+ "text-[var(--button-ghost-fg,inherit)]",
1063
+ "border-[length:var(--button-ghost-border-width,0px)]",
1064
+ "border-[color:var(--button-ghost-border,transparent)]",
1065
+ "[box-shadow:var(--button-ghost-shadow,var(--button-shadow,none))]",
1066
+ "hover:bg-[var(--button-ghost-hover-bg,hsl(var(--accent)))]",
1067
+ "hover:text-[var(--button-ghost-hover-fg,hsl(var(--accent-foreground)))]",
1068
+ "hover:border-[color:var(--button-ghost-hover-border,var(--button-ghost-border,transparent))]",
1069
+ "hover:[box-shadow:var(--button-ghost-shadow-hover,var(--button-shadow-hover,var(--button-ghost-shadow,var(--button-shadow,none))))]",
1070
+ "dark:hover:bg-accent/50"
1071
+ ].join(" "),
1072
+ // Link variant - full customization
1073
+ link: [
1074
+ "bg-[var(--button-link-bg,transparent)]",
1075
+ "text-[var(--button-link-fg,hsl(var(--primary)))]",
1076
+ "border-[length:var(--button-link-border-width,0px)]",
1077
+ "border-[color:var(--button-link-border,transparent)]",
1078
+ "[box-shadow:var(--button-link-shadow,none)]",
1079
+ "hover:bg-[var(--button-link-hover-bg,transparent)]",
1080
+ "hover:text-[var(--button-link-hover-fg,var(--button-link-fg,hsl(var(--primary))))]",
1081
+ "hover:[box-shadow:var(--button-link-shadow-hover,none)]",
1082
+ "underline-offset-4 hover:underline"
1083
+ ].join(" ")
1084
+ },
1085
+ size: {
1086
+ default: [
1087
+ "h-[var(--button-height-md,2.25rem)]",
1088
+ "px-[var(--button-padding-x-md,1rem)]",
1089
+ "py-[var(--button-padding-y-md,0.5rem)]",
1090
+ "has-[>svg]:px-[calc(var(--button-padding-x-md,1rem)*0.75)]"
1091
+ ].join(" "),
1092
+ sm: [
1093
+ "h-[var(--button-height-sm,2rem)]",
1094
+ "px-[var(--button-padding-x-sm,0.75rem)]",
1095
+ "py-[var(--button-padding-y-sm,0.25rem)]",
1096
+ "gap-1.5",
1097
+ "has-[>svg]:px-[calc(var(--button-padding-x-sm,0.75rem)*0.83)]"
1098
+ ].join(" "),
1099
+ md: [
1100
+ "h-[var(--button-height-md,2.25rem)]",
1101
+ "px-[var(--button-padding-x-md,1rem)]",
1102
+ "py-[var(--button-padding-y-md,0.5rem)]",
1103
+ "has-[>svg]:px-[calc(var(--button-padding-x-md,1rem)*0.75)]"
1104
+ ].join(" "),
1105
+ lg: [
1106
+ "h-[var(--button-height-lg,2.5rem)]",
1107
+ "px-[var(--button-padding-x-lg,1.5rem)]",
1108
+ "py-[var(--button-padding-y-lg,0.5rem)]",
1109
+ "has-[>svg]:px-[calc(var(--button-padding-x-lg,1.5rem)*0.67)]"
1110
+ ].join(" "),
1111
+ icon: "size-[var(--button-height-md,2.25rem)]",
1112
+ "icon-sm": "size-[var(--button-height-sm,2rem)]",
1113
+ "icon-lg": "size-[var(--button-height-lg,2.5rem)]"
1114
+ }
1115
+ },
1116
+ defaultVariants: {
1117
+ variant: "default",
1118
+ size: "default"
1119
+ }
1120
+ });
2046
1121
  function Button({
2047
1122
  className,
2048
1123
  variant = "default",
@@ -2086,127 +1161,412 @@ function CardHeader({ className, ...props }) {
2086
1161
  ),
2087
1162
  ...props
2088
1163
  }
2089
- );
2090
- }
2091
- function CardTitle({ className, ...props }) {
2092
- return /* @__PURE__ */ jsxRuntime.jsx(
2093
- "div",
2094
- {
2095
- "data-slot": "card-title",
2096
- className: cn("leading-none font-semibold", className),
2097
- ...props
1164
+ );
1165
+ }
1166
+ function CardTitle({ className, ...props }) {
1167
+ return /* @__PURE__ */ jsxRuntime.jsx(
1168
+ "div",
1169
+ {
1170
+ "data-slot": "card-title",
1171
+ className: cn("leading-none font-semibold", className),
1172
+ ...props
1173
+ }
1174
+ );
1175
+ }
1176
+ function CardDescription({ className, ...props }) {
1177
+ return /* @__PURE__ */ jsxRuntime.jsx(
1178
+ "div",
1179
+ {
1180
+ "data-slot": "card-description",
1181
+ className: cn("text-muted-foreground text-sm", className),
1182
+ ...props
1183
+ }
1184
+ );
1185
+ }
1186
+ function CardContent({ className, ...props }) {
1187
+ return /* @__PURE__ */ jsxRuntime.jsx(
1188
+ "div",
1189
+ {
1190
+ "data-slot": "card-content",
1191
+ className: cn("px-6", className),
1192
+ ...props
1193
+ }
1194
+ );
1195
+ }
1196
+ function CardFooter({ className, ...props }) {
1197
+ return /* @__PURE__ */ jsxRuntime.jsx(
1198
+ "div",
1199
+ {
1200
+ "data-slot": "card-footer",
1201
+ className: cn("flex items-center px-6 [.border-t]:pt-6", className),
1202
+ ...props
1203
+ }
1204
+ );
1205
+ }
1206
+ var badgeVariants = classVarianceAuthority.cva(
1207
+ "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
1208
+ {
1209
+ variants: {
1210
+ variant: {
1211
+ default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
1212
+ secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
1213
+ destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
1214
+ outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
1215
+ }
1216
+ },
1217
+ defaultVariants: {
1218
+ variant: "default"
1219
+ }
1220
+ }
1221
+ );
1222
+ function Badge({
1223
+ className,
1224
+ variant,
1225
+ asChild = false,
1226
+ ...props
1227
+ }) {
1228
+ const Comp = asChild ? reactSlot.Slot : "span";
1229
+ return /* @__PURE__ */ jsxRuntime.jsx(
1230
+ Comp,
1231
+ {
1232
+ "data-slot": "badge",
1233
+ className: cn(badgeVariants({ variant }), className),
1234
+ ...props
1235
+ }
1236
+ );
1237
+ }
1238
+ function Popover({
1239
+ ...props
1240
+ }) {
1241
+ return /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Root, { "data-slot": "popover", ...props });
1242
+ }
1243
+ function PopoverTrigger({
1244
+ ...props
1245
+ }) {
1246
+ return /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Trigger, { "data-slot": "popover-trigger", ...props });
1247
+ }
1248
+ function PopoverContent({
1249
+ className,
1250
+ align = "center",
1251
+ sideOffset = 4,
1252
+ ...props
1253
+ }) {
1254
+ return /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
1255
+ PopoverPrimitive__namespace.Content,
1256
+ {
1257
+ "data-slot": "popover-content",
1258
+ align,
1259
+ sideOffset,
1260
+ className: cn(
1261
+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden",
1262
+ className
1263
+ ),
1264
+ ...props
1265
+ }
1266
+ ) });
1267
+ }
1268
+ var DEFAULT_ICON_API_KEY = "au382bi7fsh96w9h9xlrnat2jglx";
1269
+ var DynamicIcon = React4__namespace.memo(function DynamicIcon2({
1270
+ apiKey,
1271
+ ...props
1272
+ }) {
1273
+ return /* @__PURE__ */ jsxRuntime.jsx(icon.Icon, { ...props, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
1274
+ });
1275
+ DynamicIcon.displayName = "DynamicIcon";
1276
+ function StarRating({
1277
+ rating,
1278
+ size = 18,
1279
+ className
1280
+ }) {
1281
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex items-center gap-0.5", className), children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsxRuntime.jsx(
1282
+ DynamicIcon,
1283
+ {
1284
+ name: "icon-park-solid/star",
1285
+ size,
1286
+ className: cn(
1287
+ star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
1288
+ )
1289
+ },
1290
+ star
1291
+ )) });
1292
+ }
1293
+ function normalizePhoneNumber(input) {
1294
+ const trimmed = input.trim();
1295
+ if (trimmed.toLowerCase().startsWith("tel:")) {
1296
+ return trimmed;
1297
+ }
1298
+ const match = trimmed.match(/^[\s\+\-\(\)]*(\d[\d\s\-\(\)\.]*\d)[\s\-]*(x|ext\.?|extension)?[\s\-]*(\d+)?$/i);
1299
+ if (match) {
1300
+ const mainNumber = match[1].replace(/[\s\-\(\)\.]/g, "");
1301
+ const extension = match[3];
1302
+ const normalized = mainNumber.length >= 10 && !trimmed.startsWith("+") ? `+${mainNumber}` : mainNumber;
1303
+ const withExtension = extension ? `${normalized};ext=${extension}` : normalized;
1304
+ return `tel:${withExtension}`;
1305
+ }
1306
+ const cleaned = trimmed.replace(/[\s\-\(\)\.]/g, "");
1307
+ return `tel:${cleaned}`;
1308
+ }
1309
+ function normalizeEmail(input) {
1310
+ const trimmed = input.trim();
1311
+ if (trimmed.toLowerCase().startsWith("mailto:")) {
1312
+ return trimmed;
1313
+ }
1314
+ return `mailto:${trimmed}`;
1315
+ }
1316
+ function isEmail(input) {
1317
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
1318
+ return emailRegex.test(input.trim());
1319
+ }
1320
+ function isPhoneNumber(input) {
1321
+ const trimmed = input.trim();
1322
+ if (trimmed.toLowerCase().startsWith("tel:")) {
1323
+ return true;
1324
+ }
1325
+ const phoneRegex = /^[\s\+\-\(\)]*\d[\d\s\-\(\)\.]*\d[\s\-]*(x|ext\.?|extension)?[\s\-]*\d*$/i;
1326
+ return phoneRegex.test(trimmed);
1327
+ }
1328
+ function isInternalUrl(href) {
1329
+ if (typeof window === "undefined") {
1330
+ return href.startsWith("/") && !href.startsWith("//");
1331
+ }
1332
+ const trimmed = href.trim();
1333
+ if (trimmed.startsWith("/") && !trimmed.startsWith("//")) {
1334
+ return true;
1335
+ }
1336
+ try {
1337
+ const url = new URL(trimmed, window.location.href);
1338
+ const currentOrigin = window.location.origin;
1339
+ const normalizeOrigin = (origin) => origin.replace(/^(https?:\/\/)(www\.)?/, "$1");
1340
+ return normalizeOrigin(url.origin) === normalizeOrigin(currentOrigin);
1341
+ } catch {
1342
+ return false;
1343
+ }
1344
+ }
1345
+ function toRelativePath(href) {
1346
+ if (typeof window === "undefined") {
1347
+ return href;
1348
+ }
1349
+ const trimmed = href.trim();
1350
+ if (trimmed.startsWith("/") && !trimmed.startsWith("//")) {
1351
+ return trimmed;
1352
+ }
1353
+ try {
1354
+ const url = new URL(trimmed, window.location.href);
1355
+ const currentOrigin = window.location.origin;
1356
+ const normalizeOrigin = (origin) => origin.replace(/^(https?:\/\/)(www\.)?/, "$1");
1357
+ if (normalizeOrigin(url.origin) === normalizeOrigin(currentOrigin)) {
1358
+ return url.pathname + url.search + url.hash;
1359
+ }
1360
+ } catch {
1361
+ }
1362
+ return trimmed;
1363
+ }
1364
+ function useNavigation({
1365
+ href,
1366
+ onClick
1367
+ } = {}) {
1368
+ const linkType = React4__namespace.useMemo(() => {
1369
+ if (!href || href.trim() === "") {
1370
+ return onClick ? "none" : "none";
1371
+ }
1372
+ const trimmed = href.trim();
1373
+ if (trimmed.toLowerCase().startsWith("mailto:") || isEmail(trimmed)) {
1374
+ return "mailto";
1375
+ }
1376
+ if (trimmed.toLowerCase().startsWith("tel:") || isPhoneNumber(trimmed)) {
1377
+ return "tel";
1378
+ }
1379
+ if (isInternalUrl(trimmed)) {
1380
+ return "internal";
1381
+ }
1382
+ try {
1383
+ new URL(trimmed, typeof window !== "undefined" ? window.location.href : "http://localhost");
1384
+ return "external";
1385
+ } catch {
1386
+ return "internal";
1387
+ }
1388
+ }, [href, onClick]);
1389
+ const normalizedHref = React4__namespace.useMemo(() => {
1390
+ if (!href || href.trim() === "") {
1391
+ return void 0;
1392
+ }
1393
+ const trimmed = href.trim();
1394
+ switch (linkType) {
1395
+ case "tel":
1396
+ return normalizePhoneNumber(trimmed);
1397
+ case "mailto":
1398
+ return normalizeEmail(trimmed);
1399
+ case "internal":
1400
+ return toRelativePath(trimmed);
1401
+ case "external":
1402
+ return trimmed;
1403
+ default:
1404
+ return trimmed;
1405
+ }
1406
+ }, [href, linkType]);
1407
+ const target = React4__namespace.useMemo(() => {
1408
+ switch (linkType) {
1409
+ case "external":
1410
+ return "_blank";
1411
+ case "internal":
1412
+ return "_self";
1413
+ case "mailto":
1414
+ case "tel":
1415
+ return void 0;
1416
+ default:
1417
+ return void 0;
1418
+ }
1419
+ }, [linkType]);
1420
+ const rel = React4__namespace.useMemo(() => {
1421
+ if (linkType === "external") {
1422
+ return "noopener noreferrer";
2098
1423
  }
1424
+ return void 0;
1425
+ }, [linkType]);
1426
+ const isExternal = linkType === "external";
1427
+ const isInternal = linkType === "internal";
1428
+ const shouldUseRouter = isInternal && typeof normalizedHref === "string" && normalizedHref.startsWith("/");
1429
+ const handleClick = React4__namespace.useCallback(
1430
+ (event) => {
1431
+ if (onClick) {
1432
+ try {
1433
+ onClick(event);
1434
+ } catch (error) {
1435
+ console.error("Error in user onClick handler:", error);
1436
+ }
1437
+ }
1438
+ if (event.defaultPrevented) {
1439
+ return;
1440
+ }
1441
+ if (shouldUseRouter && normalizedHref && event.button === 0 && // left-click only
1442
+ !event.metaKey && !event.altKey && !event.ctrlKey && !event.shiftKey) {
1443
+ if (typeof window !== "undefined") {
1444
+ const handler = window.__opensiteNavigationHandler;
1445
+ if (typeof handler === "function") {
1446
+ try {
1447
+ const handled = handler(normalizedHref, event.nativeEvent || event);
1448
+ if (handled !== false) {
1449
+ event.preventDefault();
1450
+ }
1451
+ } catch (error) {
1452
+ console.error("Error in navigation handler:", error);
1453
+ }
1454
+ }
1455
+ }
1456
+ }
1457
+ },
1458
+ [onClick, shouldUseRouter, normalizedHref]
2099
1459
  );
1460
+ return {
1461
+ linkType,
1462
+ normalizedHref,
1463
+ target,
1464
+ rel,
1465
+ isExternal,
1466
+ isInternal,
1467
+ shouldUseRouter,
1468
+ handleClick
1469
+ };
2100
1470
  }
2101
- function CardDescription({ className, ...props }) {
2102
- return /* @__PURE__ */ jsxRuntime.jsx(
2103
- "div",
2104
- {
2105
- "data-slot": "card-description",
2106
- className: cn("text-muted-foreground text-sm", className),
2107
- ...props
1471
+ var Pressable = React4__namespace.forwardRef(
1472
+ ({
1473
+ children,
1474
+ className,
1475
+ href,
1476
+ onClick,
1477
+ variant,
1478
+ size,
1479
+ asButton = false,
1480
+ fallbackComponentType = "span",
1481
+ componentType,
1482
+ "aria-label": ariaLabel,
1483
+ "aria-describedby": ariaDescribedby,
1484
+ id,
1485
+ ...props
1486
+ }, ref) => {
1487
+ const navigation = useNavigation({ href, onClick });
1488
+ const {
1489
+ normalizedHref,
1490
+ target,
1491
+ rel,
1492
+ linkType,
1493
+ isInternal,
1494
+ isExternal,
1495
+ handleClick
1496
+ } = navigation;
1497
+ const shouldRenderLink = normalizedHref && linkType !== "none";
1498
+ const shouldRenderButton = !shouldRenderLink && onClick;
1499
+ const effectiveComponentType = componentType || (shouldRenderLink ? "a" : shouldRenderButton ? "button" : fallbackComponentType);
1500
+ const finalComponentType = isInternal && shouldRenderLink ? "a" : effectiveComponentType;
1501
+ const shouldApplyButtonStyles = asButton || variant || size;
1502
+ const combinedClassName = cn(
1503
+ shouldApplyButtonStyles && buttonVariants({ variant, size }),
1504
+ className
1505
+ );
1506
+ const dataProps = Object.fromEntries(
1507
+ Object.entries(props).filter(([key]) => key.startsWith("data-"))
1508
+ );
1509
+ const buttonDataAttributes = shouldApplyButtonStyles ? {
1510
+ "data-slot": "button",
1511
+ "data-variant": variant ?? "default",
1512
+ "data-size": size ?? "default"
1513
+ } : {};
1514
+ const commonProps = {
1515
+ className: combinedClassName,
1516
+ onClick: handleClick,
1517
+ "aria-label": ariaLabel,
1518
+ "aria-describedby": ariaDescribedby,
1519
+ id,
1520
+ ...dataProps,
1521
+ ...buttonDataAttributes
1522
+ };
1523
+ if (finalComponentType === "a" && shouldRenderLink) {
1524
+ return /* @__PURE__ */ jsxRuntime.jsx(
1525
+ "a",
1526
+ {
1527
+ ref,
1528
+ href: normalizedHref,
1529
+ target,
1530
+ rel,
1531
+ ...commonProps,
1532
+ ...props,
1533
+ children
1534
+ }
1535
+ );
2108
1536
  }
2109
- );
2110
- }
2111
- function CardContent({ className, ...props }) {
2112
- return /* @__PURE__ */ jsxRuntime.jsx(
2113
- "div",
2114
- {
2115
- "data-slot": "card-content",
2116
- className: cn("px-6", className),
2117
- ...props
1537
+ if (finalComponentType === "button") {
1538
+ return /* @__PURE__ */ jsxRuntime.jsx(
1539
+ "button",
1540
+ {
1541
+ ref,
1542
+ type: props.type || "button",
1543
+ ...commonProps,
1544
+ ...props,
1545
+ children
1546
+ }
1547
+ );
2118
1548
  }
2119
- );
2120
- }
2121
- function CardFooter({ className, ...props }) {
2122
- return /* @__PURE__ */ jsxRuntime.jsx(
2123
- "div",
2124
- {
2125
- "data-slot": "card-footer",
2126
- className: cn("flex items-center px-6 [.border-t]:pt-6", className),
2127
- ...props
1549
+ if (finalComponentType === "div") {
1550
+ return /* @__PURE__ */ jsxRuntime.jsx(
1551
+ "div",
1552
+ {
1553
+ ref,
1554
+ ...commonProps,
1555
+ children
1556
+ }
1557
+ );
2128
1558
  }
2129
- );
2130
- }
2131
- var badgeVariants = classVarianceAuthority.cva(
2132
- "inline-flex items-center justify-center rounded-full border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
2133
- {
2134
- variants: {
2135
- variant: {
2136
- default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
2137
- secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
2138
- destructive: "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
2139
- outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
1559
+ return /* @__PURE__ */ jsxRuntime.jsx(
1560
+ "span",
1561
+ {
1562
+ ref,
1563
+ ...commonProps,
1564
+ children
2140
1565
  }
2141
- },
2142
- defaultVariants: {
2143
- variant: "default"
2144
- }
1566
+ );
2145
1567
  }
2146
1568
  );
2147
- function Badge({
2148
- className,
2149
- variant,
2150
- asChild = false,
2151
- ...props
2152
- }) {
2153
- const Comp = asChild ? reactSlot.Slot : "span";
2154
- return /* @__PURE__ */ jsxRuntime.jsx(
2155
- Comp,
2156
- {
2157
- "data-slot": "badge",
2158
- className: cn(badgeVariants({ variant }), className),
2159
- ...props
2160
- }
2161
- );
2162
- }
2163
- function Popover({
2164
- ...props
2165
- }) {
2166
- return /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Root, { "data-slot": "popover", ...props });
2167
- }
2168
- function PopoverTrigger({
2169
- ...props
2170
- }) {
2171
- return /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Trigger, { "data-slot": "popover-trigger", ...props });
2172
- }
2173
- function PopoverContent({
2174
- className,
2175
- align = "center",
2176
- sideOffset = 4,
2177
- ...props
2178
- }) {
2179
- return /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
2180
- PopoverPrimitive__namespace.Content,
2181
- {
2182
- "data-slot": "popover-content",
2183
- align,
2184
- sideOffset,
2185
- className: cn(
2186
- "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-72 origin-(--radix-popover-content-transform-origin) rounded-md border p-4 shadow-md outline-hidden",
2187
- className
2188
- ),
2189
- ...props
2190
- }
2191
- ) });
2192
- }
2193
- function StarRating({
2194
- rating,
2195
- size = 18,
2196
- className
2197
- }) {
2198
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex items-center gap-0.5", className), children: [1, 2, 3, 4, 5].map((star) => /* @__PURE__ */ jsxRuntime.jsx(
2199
- DynamicIcon,
2200
- {
2201
- name: "icon-park-solid/star",
2202
- size,
2203
- className: cn(
2204
- star <= rating ? "fill-primary text-primary" : "fill-muted text-muted"
2205
- )
2206
- },
2207
- star
2208
- )) });
2209
- }
1569
+ Pressable.displayName = "Pressable";
2210
1570
  var BUTTON_SIZES = {
2211
1571
  sm: { buttonSize: "size-8", iconSize: 16 },
2212
1572
  md: { buttonSize: "size-10", iconSize: 20 },
@@ -2298,7 +1658,7 @@ var platformIconMap = {
2298
1658
  dribbble: "cib/dribbble",
2299
1659
  unknown: "icon-park-solid/circular-connection"
2300
1660
  };
2301
- var SocialLinkIcon = React6__namespace.forwardRef(
1661
+ var SocialLinkIcon = React4__namespace.forwardRef(
2302
1662
  ({
2303
1663
  platformName,
2304
1664
  label,
@@ -2312,16 +1672,16 @@ var SocialLinkIcon = React6__namespace.forwardRef(
2312
1672
  ...pressableProps
2313
1673
  }, ref) => {
2314
1674
  const platform = usePlatformFromUrl.usePlatformFromUrl(href);
2315
- const smartPlatformName = React6__namespace.useMemo(() => {
1675
+ const smartPlatformName = React4__namespace.useMemo(() => {
2316
1676
  return platform || platformName;
2317
1677
  }, [platform, platformName]);
2318
- const iconName = React6__namespace.useMemo(() => {
1678
+ const iconName = React4__namespace.useMemo(() => {
2319
1679
  return iconNameOverride || platformIconMap[smartPlatformName];
2320
1680
  }, [iconNameOverride, smartPlatformName]);
2321
- const accessibleLabel = React6__namespace.useMemo(() => {
1681
+ const accessibleLabel = React4__namespace.useMemo(() => {
2322
1682
  return label || platformName;
2323
1683
  }, [label, platformName]);
2324
- const icon = React6__namespace.useMemo(() => {
1684
+ const icon = React4__namespace.useMemo(() => {
2325
1685
  return /* @__PURE__ */ jsxRuntime.jsx(
2326
1686
  DynamicIcon,
2327
1687
  {
@@ -2401,12 +1761,12 @@ function TextInner({ as, className, children, ...props }, ref) {
2401
1761
  const Component = as || "span";
2402
1762
  return /* @__PURE__ */ jsxRuntime.jsx(Component, { ref, className: cn(className), ...props, children });
2403
1763
  }
2404
- var Text = React6__namespace.forwardRef(TextInner);
1764
+ var Text = React4__namespace.forwardRef(TextInner);
2405
1765
  Text.displayName = "Text";
2406
1766
  function isContentTextItem(item) {
2407
- return item !== null && typeof item === "object" && !React6__namespace.isValidElement(item) && "_type" in item && item._type === "text";
1767
+ return item !== null && typeof item === "object" && !React4__namespace.isValidElement(item) && "_type" in item && item._type === "text";
2408
1768
  }
2409
- var ContentGroup = React6__namespace.forwardRef(
1769
+ var ContentGroup = React4__namespace.forwardRef(
2410
1770
  ({ items, className, children, ...props }, ref) => {
2411
1771
  const hasContent = items && items.length > 0;
2412
1772
  if (!hasContent) {
@@ -2419,10 +1779,10 @@ var ContentGroup = React6__namespace.forwardRef(
2419
1779
  return /* @__PURE__ */ jsxRuntime.jsx(Text, { ...textProps }, idx);
2420
1780
  }
2421
1781
  const reactNode = item;
2422
- if (React6__namespace.isValidElement(reactNode)) {
2423
- return React6__namespace.cloneElement(reactNode, { key: reactNode.key ?? idx });
1782
+ if (React4__namespace.isValidElement(reactNode)) {
1783
+ return React4__namespace.cloneElement(reactNode, { key: reactNode.key ?? idx });
2424
1784
  }
2425
- return /* @__PURE__ */ jsxRuntime.jsx(React6__namespace.Fragment, { children: reactNode }, idx);
1785
+ return /* @__PURE__ */ jsxRuntime.jsx(React4__namespace.Fragment, { children: reactNode }, idx);
2426
1786
  }),
2427
1787
  children
2428
1788
  ] });
@@ -2446,7 +1806,7 @@ function AlternatingBlocks({
2446
1806
  pattern,
2447
1807
  patternOpacity
2448
1808
  }) {
2449
- const sectionsContent = React6.useMemo(() => {
1809
+ const sectionsContent = React4.useMemo(() => {
2450
1810
  if (sectionsSlot) return sectionsSlot;
2451
1811
  if (!sections || sections.length === 0) return null;
2452
1812
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("space-y-12", sectionsClassName), children: sections.map((section, index) => /* @__PURE__ */ jsxRuntime.jsxs(
@@ -2490,7 +1850,7 @@ function AlternatingBlocks({
2490
1850
  sectionContentClassName,
2491
1851
  sectionMediaClassName
2492
1852
  ]);
2493
- const headerItems = React6.useMemo(() => {
1853
+ const headerItems = React4.useMemo(() => {
2494
1854
  const items = [];
2495
1855
  if (subtitle) {
2496
1856
  items.push(
@@ -2559,7 +1919,7 @@ function AboutSplitHero({
2559
1919
  patternOpacity,
2560
1920
  directionConfig = { desktop: "mediaRight", mobile: "mediaTop" }
2561
1921
  }) {
2562
- const ctaContent = React6.useMemo(() => {
1922
+ const ctaContent = React4.useMemo(() => {
2563
1923
  if (ctaSlot) return ctaSlot;
2564
1924
  if (!ctaAction) return null;
2565
1925
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -2581,7 +1941,7 @@ function AboutSplitHero({
2581
1941
  }
2582
1942
  );
2583
1943
  }, [ctaSlot, ctaAction, ctaClassName]);
2584
- const bgColorClass = React6.useMemo(() => {
1944
+ const bgColorClass = React4.useMemo(() => {
2585
1945
  switch (background) {
2586
1946
  case "dark":
2587
1947
  return "bg-foreground text-background";
@@ -2709,7 +2069,7 @@ function AboutMissionPrinciples({
2709
2069
  pattern,
2710
2070
  patternOpacity
2711
2071
  }) {
2712
- const missionActionContent = React6.useMemo(() => {
2072
+ const missionActionContent = React4.useMemo(() => {
2713
2073
  if (missionActionSlot) return missionActionSlot;
2714
2074
  if (!missionAction) return null;
2715
2075
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("pt-2", missionActionClassName), children: /* @__PURE__ */ jsxRuntime.jsxs(
@@ -2734,7 +2094,7 @@ function AboutMissionPrinciples({
2734
2094
  }
2735
2095
  ) });
2736
2096
  }, [missionActionSlot, missionAction, missionActionClassName]);
2737
- const principlesContent = React6.useMemo(() => {
2097
+ const principlesContent = React4.useMemo(() => {
2738
2098
  if (principlesSlot) return principlesSlot;
2739
2099
  if (!principles || principles.length === 0) return null;
2740
2100
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -2772,7 +2132,7 @@ function AboutMissionPrinciples({
2772
2132
  }
2773
2133
  );
2774
2134
  }, [principlesSlot, principles, principlesClassName]);
2775
- const visionActionContent = React6.useMemo(() => {
2135
+ const visionActionContent = React4.useMemo(() => {
2776
2136
  if (visionActionSlot) return visionActionSlot;
2777
2137
  if (!visionAction) return null;
2778
2138
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -2947,11 +2307,11 @@ function AboutExpandableValues({
2947
2307
  pattern,
2948
2308
  patternOpacity
2949
2309
  }) {
2950
- const [expandedValue, setExpandedValue] = React6__namespace.useState(null);
2951
- const toggleExpand = React6.useCallback((id) => {
2310
+ const [expandedValue, setExpandedValue] = React4__namespace.useState(null);
2311
+ const toggleExpand = React4.useCallback((id) => {
2952
2312
  setExpandedValue((prev) => prev === id ? null : id);
2953
2313
  }, []);
2954
- React6.useMemo(() => {
2314
+ React4.useMemo(() => {
2955
2315
  if (actionsSlot) return actionsSlot;
2956
2316
  if (!actions || actions.length === 0) return null;
2957
2317
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: actionsClassName, children: actions.map((action, idx) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -2967,7 +2327,7 @@ function AboutExpandableValues({
2967
2327
  idx
2968
2328
  )) });
2969
2329
  }, [actionsSlot, actions, actionsClassName]);
2970
- const valuesContent = React6.useMemo(() => {
2330
+ const valuesContent = React4.useMemo(() => {
2971
2331
  if (valuesSlot) return valuesSlot;
2972
2332
  if (!values || values.length === 0) return null;
2973
2333
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid grid-cols-1 gap-6 mt-8", valuesClassName), children: values.map((value) => /* @__PURE__ */ jsxRuntime.jsxs(
@@ -3183,17 +2543,17 @@ function CommunityInitiatives({
3183
2543
  pattern,
3184
2544
  patternOpacity
3185
2545
  }) {
3186
- const [activeCategory, setActiveCategory] = React6__namespace.useState(
2546
+ const [activeCategory, setActiveCategory] = React4__namespace.useState(
3187
2547
  categories?.[0]?.id || ""
3188
2548
  );
3189
2549
  const currentCategory = categories?.find((category) => category.id === activeCategory) || categories?.[0];
3190
- const handleCategoryChange = React6.useCallback(
2550
+ const handleCategoryChange = React4.useCallback(
3191
2551
  (e) => {
3192
2552
  setActiveCategory(e.target.value);
3193
2553
  },
3194
2554
  []
3195
2555
  );
3196
- const categoriesContent = React6.useMemo(() => {
2556
+ const categoriesContent = React4.useMemo(() => {
3197
2557
  if (categoriesSlot) return categoriesSlot;
3198
2558
  if (!categories || categories.length === 0) return null;
3199
2559
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -3447,10 +2807,10 @@ function AboutCultureTabs({
3447
2807
  patternOpacity
3448
2808
  }) {
3449
2809
  const resolvedAspects = aspects ?? [];
3450
- const [activeTab, setActiveTab] = React6__namespace.useState(
2810
+ const [activeTab, setActiveTab] = React4__namespace.useState(
3451
2811
  resolvedAspects[0]?.id || ""
3452
2812
  );
3453
- const headerItems = React6.useMemo(() => {
2813
+ const headerItems = React4.useMemo(() => {
3454
2814
  const items = [];
3455
2815
  if (badgeText) {
3456
2816
  if (typeof badgeText === "string") {
@@ -3497,7 +2857,7 @@ function AboutCultureTabs({
3497
2857
  description,
3498
2858
  descriptionClassName
3499
2859
  ]);
3500
- const ctaImagesContent = React6.useMemo(() => {
2860
+ const ctaImagesContent = React4.useMemo(() => {
3501
2861
  if (ctaImagesSlot) return ctaImagesSlot;
3502
2862
  if (!ctaImages || ctaImages.length === 0) return null;
3503
2863
  return ctaImages.map((src, i) => /* @__PURE__ */ jsxRuntime.jsx(
@@ -3663,7 +3023,7 @@ function MediaHoverCtas({
3663
3023
  optixFlowConfig
3664
3024
  }) {
3665
3025
  const resolvedItems = items ?? [];
3666
- const itemsContent = React6.useMemo(() => {
3026
+ const itemsContent = React4.useMemo(() => {
3667
3027
  if (itemsSlot) return itemsSlot;
3668
3028
  return resolvedItems.map((item, index) => {
3669
3029
  const CardComponent = item.cardHref ? "a" : "div";
@@ -3753,13 +3113,13 @@ function BannerAnnouncementDismissible({
3753
3113
  actionsClassName,
3754
3114
  dismissButtonClassName
3755
3115
  }) {
3756
- const [isVisible, setIsVisible] = React6.useState(true);
3116
+ const [isVisible, setIsVisible] = React4.useState(true);
3757
3117
  const dismissLabel = dismissAriaLabel ?? "Dismiss banner";
3758
- const handleDismiss = React6.useCallback(() => {
3118
+ const handleDismiss = React4.useCallback(() => {
3759
3119
  setIsVisible(false);
3760
3120
  onDismiss?.();
3761
3121
  }, [onDismiss]);
3762
- const actionsContent = React6.useMemo(() => {
3122
+ const actionsContent = React4.useMemo(() => {
3763
3123
  if (actionsSlot) return actionsSlot;
3764
3124
  if (!actions || actions.length === 0) return null;
3765
3125
  return actions.map((action, index) => {
@@ -3787,7 +3147,7 @@ function BannerAnnouncementDismissible({
3787
3147
  );
3788
3148
  });
3789
3149
  }, [actions, actionsSlot]);
3790
- const iconContent = React6.useMemo(() => {
3150
+ const iconContent = React4.useMemo(() => {
3791
3151
  if (icon) return icon;
3792
3152
  if (!iconName) return null;
3793
3153
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -3799,11 +3159,11 @@ function BannerAnnouncementDismissible({
3799
3159
  }
3800
3160
  );
3801
3161
  }, [icon, iconName, iconClassName]);
3802
- const dismissIconContent = React6.useMemo(() => {
3162
+ const dismissIconContent = React4.useMemo(() => {
3803
3163
  if (dismissIcon) return dismissIcon;
3804
3164
  return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "mynaui/x", size: 16 });
3805
3165
  }, [dismissIcon]);
3806
- const messageContent = React6.useMemo(() => {
3166
+ const messageContent = React4.useMemo(() => {
3807
3167
  if (!message) return null;
3808
3168
  return typeof message === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("font-medium text-sm", messageClassName), children: message }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: messageClassName, children: message });
3809
3169
  }, [message, messageClassName]);
@@ -3849,12 +3209,12 @@ function BannerCountdownSale({
3849
3209
  separatorClassName
3850
3210
  }) {
3851
3211
  const targetTime = endTime;
3852
- const [timeLeft, setTimeLeft] = React6.useState({
3212
+ const [timeLeft, setTimeLeft] = React4.useState({
3853
3213
  hours: 0,
3854
3214
  minutes: 0,
3855
3215
  seconds: 0
3856
3216
  });
3857
- React6.useEffect(() => {
3217
+ React4.useEffect(() => {
3858
3218
  if (!targetTime) {
3859
3219
  return;
3860
3220
  }
@@ -3877,8 +3237,8 @@ function BannerCountdownSale({
3877
3237
  }, 1e3);
3878
3238
  return () => clearInterval(timer);
3879
3239
  }, [targetTime]);
3880
- const pad = React6.useCallback((n) => n.toString().padStart(2, "0"), []);
3881
- const timerContent = React6.useMemo(() => {
3240
+ const pad = React4.useCallback((n) => n.toString().padStart(2, "0"), []);
3241
+ const timerContent = React4.useMemo(() => {
3882
3242
  if (timerSlot) return timerSlot;
3883
3243
  if (renderTimer) return renderTimer(timeLeft);
3884
3244
  if (!targetTime) return null;
@@ -3890,11 +3250,11 @@ function BannerCountdownSale({
3890
3250
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("rounded bg-destructive px-2 py-0.5", timeUnitClassName), children: pad(timeLeft.seconds) })
3891
3251
  ] });
3892
3252
  }, [timerSlot, renderTimer, timeLeft, timerClassName, timeUnitClassName, separatorClassName, pad, targetTime]);
3893
- const messageContent = React6.useMemo(() => {
3253
+ const messageContent = React4.useMemo(() => {
3894
3254
  if (!message) return null;
3895
3255
  return typeof message === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("font-medium", messageClassName), children: message }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: messageClassName, children: message });
3896
3256
  }, [message, messageClassName]);
3897
- const descriptionContent = React6.useMemo(() => {
3257
+ const descriptionContent = React4.useMemo(() => {
3898
3258
  if (!description) return null;
3899
3259
  return typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-destructive-foreground", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description });
3900
3260
  }, [description, descriptionClassName]);
@@ -3923,12 +3283,12 @@ function BannerDeliveryCountdown({
3923
3283
  deliveryDateClassName
3924
3284
  }) {
3925
3285
  const targetTime = cutoffTime;
3926
- const [timeLeft, setTimeLeft] = React6.useState({
3286
+ const [timeLeft, setTimeLeft] = React4.useState({
3927
3287
  hours: 0,
3928
3288
  minutes: 0,
3929
3289
  seconds: 0
3930
3290
  });
3931
- React6.useEffect(() => {
3291
+ React4.useEffect(() => {
3932
3292
  if (!targetTime) {
3933
3293
  return;
3934
3294
  }
@@ -3951,13 +3311,13 @@ function BannerDeliveryCountdown({
3951
3311
  }, 1e3);
3952
3312
  return () => clearInterval(timer);
3953
3313
  }, [targetTime]);
3954
- const pad = React6.useCallback((n) => n.toString().padStart(2, "0"), []);
3955
- const iconContent = React6.useMemo(() => {
3314
+ const pad = React4.useCallback((n) => n.toString().padStart(2, "0"), []);
3315
+ const iconContent = React4.useMemo(() => {
3956
3316
  if (icon) return icon;
3957
3317
  if (!iconName) return null;
3958
3318
  return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: iconName, size: 16, className: iconClassName });
3959
3319
  }, [icon, iconName, iconClassName]);
3960
- const timerContent = React6.useMemo(() => {
3320
+ const timerContent = React4.useMemo(() => {
3961
3321
  if (timerSlot) return timerSlot;
3962
3322
  if (renderTimer) return renderTimer(timeLeft);
3963
3323
  if (!targetTime) return null;
@@ -3969,18 +3329,18 @@ function BannerDeliveryCountdown({
3969
3329
  pad(timeLeft.seconds)
3970
3330
  ] });
3971
3331
  }, [timerSlot, renderTimer, timeLeft, timerClassName, pad, targetTime]);
3972
- const deliveryDateContent = React6.useMemo(() => {
3332
+ const deliveryDateContent = React4.useMemo(() => {
3973
3333
  if (!deliveryDate) return null;
3974
3334
  return typeof deliveryDate === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("font-semibold", deliveryDateClassName), children: deliveryDate }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: deliveryDateClassName, children: deliveryDate });
3975
3335
  }, [deliveryDate, deliveryDateClassName]);
3976
- const messageParts = React6.useMemo(() => {
3336
+ const messageParts = React4.useMemo(() => {
3977
3337
  return [prefixText, timerContent, middleText, deliveryDateContent].filter(
3978
3338
  (part) => part !== null && part !== void 0
3979
3339
  );
3980
3340
  }, [prefixText, timerContent, middleText, deliveryDateContent]);
3981
3341
  return /* @__PURE__ */ jsxRuntime.jsx(Section, { background, spacing: "none", className: cn("bg-accent text-accent-foreground", className), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("container py-2.5", containerClassName), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-wrap items-center justify-center gap-3 text-sm", contentClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex items-center gap-2", messageClassName), children: [
3982
3342
  iconContent,
3983
- messageParts.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { children: messageParts.map((part, index) => /* @__PURE__ */ jsxRuntime.jsxs(React6__namespace.Fragment, { children: [
3343
+ messageParts.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { children: messageParts.map((part, index) => /* @__PURE__ */ jsxRuntime.jsxs(React4__namespace.Fragment, { children: [
3984
3344
  index > 0 ? " " : null,
3985
3345
  part
3986
3346
  ] }, index)) })
@@ -4002,7 +3362,7 @@ function BannerEventPromo({
4002
3362
  eventDetailsClassName,
4003
3363
  actionsClassName
4004
3364
  }) {
4005
- const actionsContent = React6.useMemo(() => {
3365
+ const actionsContent = React4.useMemo(() => {
4006
3366
  if (actionsSlot) return actionsSlot;
4007
3367
  if (!actions || actions.length === 0) return null;
4008
3368
  return actions.map((action, index) => {
@@ -4030,7 +3390,7 @@ function BannerEventPromo({
4030
3390
  );
4031
3391
  });
4032
3392
  }, [actions, actionsSlot]);
4033
- const separatorContent = React6.useMemo(() => {
3393
+ const separatorContent = React4.useMemo(() => {
4034
3394
  if (separator) return separator;
4035
3395
  return /* @__PURE__ */ jsxRuntime.jsx(
4036
3396
  "svg",
@@ -4042,11 +3402,11 @@ function BannerEventPromo({
4042
3402
  }
4043
3403
  );
4044
3404
  }, [separator, separatorClassName]);
4045
- const eventNameContent = React6.useMemo(() => {
3405
+ const eventNameContent = React4.useMemo(() => {
4046
3406
  if (!eventName) return null;
4047
3407
  return typeof eventName === "string" ? /* @__PURE__ */ jsxRuntime.jsx("strong", { className: cn("font-semibold", eventNameClassName), children: eventName }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: eventNameClassName, children: eventName });
4048
3408
  }, [eventName, eventNameClassName]);
4049
- const eventDetailsContent = React6.useMemo(() => {
3409
+ const eventDetailsContent = React4.useMemo(() => {
4050
3410
  if (!eventDetails) return null;
4051
3411
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className: eventDetailsClassName, children: eventDetails });
4052
3412
  }, [eventDetails, eventDetailsClassName]);
@@ -4083,22 +3443,22 @@ function BannerFloatingOffer({
4083
3443
  }) {
4084
3444
  const isControlled = open !== void 0;
4085
3445
  const initialOpen = defaultOpen ?? true;
4086
- const [internalOpen, setInternalOpen] = React6.useState(initialOpen);
3446
+ const [internalOpen, setInternalOpen] = React4.useState(initialOpen);
4087
3447
  const isVisible = isControlled ? open : internalOpen;
4088
3448
  const dismissLabel = dismissAriaLabel ?? "Dismiss banner";
4089
3449
  const isDismissible = dismissible ?? false;
4090
- React6.useEffect(() => {
3450
+ React4.useEffect(() => {
4091
3451
  if (!isControlled && defaultOpen !== internalOpen) {
4092
3452
  setInternalOpen(initialOpen);
4093
3453
  }
4094
3454
  }, [defaultOpen, initialOpen, isControlled, internalOpen]);
4095
- const handleDismiss = React6.useCallback(() => {
3455
+ const handleDismiss = React4.useCallback(() => {
4096
3456
  if (!isControlled) {
4097
3457
  setInternalOpen(false);
4098
3458
  }
4099
3459
  onOpenChange?.(false);
4100
3460
  }, [isControlled, onOpenChange]);
4101
- const actionsContent = React6.useMemo(() => {
3461
+ const actionsContent = React4.useMemo(() => {
4102
3462
  if (actionsSlot) return actionsSlot;
4103
3463
  if (!actions || actions.length === 0) return null;
4104
3464
  return actions.map((action, index) => {
@@ -4126,7 +3486,7 @@ function BannerFloatingOffer({
4126
3486
  );
4127
3487
  });
4128
3488
  }, [actions, actionsSlot]);
4129
- const separatorContent = React6.useMemo(() => {
3489
+ const separatorContent = React4.useMemo(() => {
4130
3490
  if (separator) return separator;
4131
3491
  return /* @__PURE__ */ jsxRuntime.jsx(
4132
3492
  "svg",
@@ -4138,15 +3498,15 @@ function BannerFloatingOffer({
4138
3498
  }
4139
3499
  );
4140
3500
  }, [separator, separatorClassName]);
4141
- const dismissIconContent = React6.useMemo(() => {
3501
+ const dismissIconContent = React4.useMemo(() => {
4142
3502
  if (dismissIcon) return dismissIcon;
4143
3503
  return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "mynaui/x", size: 16 });
4144
3504
  }, [dismissIcon]);
4145
- const offerTitleContent = React6.useMemo(() => {
3505
+ const offerTitleContent = React4.useMemo(() => {
4146
3506
  if (!offerTitle) return null;
4147
3507
  return typeof offerTitle === "string" ? /* @__PURE__ */ jsxRuntime.jsx("strong", { className: cn("font-semibold", offerTitleClassName), children: offerTitle }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: offerTitleClassName, children: offerTitle });
4148
3508
  }, [offerTitle, offerTitleClassName]);
4149
- const offerDescriptionContent = React6.useMemo(() => {
3509
+ const offerDescriptionContent = React4.useMemo(() => {
4150
3510
  if (!offerDescription) return null;
4151
3511
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className: offerDescriptionClassName, children: offerDescription });
4152
3512
  }, [offerDescription, offerDescriptionClassName]);
@@ -4207,13 +3567,13 @@ function BannerGdprRights({
4207
3567
  actionsClassName,
4208
3568
  dismissButtonClassName
4209
3569
  }) {
4210
- const [isVisible, setIsVisible] = React6.useState(true);
3570
+ const [isVisible, setIsVisible] = React4.useState(true);
4211
3571
  const dismissLabel = dismissAriaLabel ?? "Dismiss banner";
4212
- const handleDismiss = React6.useCallback(() => {
3572
+ const handleDismiss = React4.useCallback(() => {
4213
3573
  setIsVisible(false);
4214
3574
  onDismiss?.();
4215
3575
  }, [onDismiss]);
4216
- const iconContent = React6.useMemo(() => {
3576
+ const iconContent = React4.useMemo(() => {
4217
3577
  if (icon) return icon;
4218
3578
  if (!iconName) return null;
4219
3579
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -4225,7 +3585,7 @@ function BannerGdprRights({
4225
3585
  }
4226
3586
  );
4227
3587
  }, [icon, iconName, iconClassName]);
4228
- const actionsContent = React6.useMemo(() => {
3588
+ const actionsContent = React4.useMemo(() => {
4229
3589
  if (actionsSlot) return actionsSlot;
4230
3590
  if (!actions || actions.length === 0) return null;
4231
3591
  return actions.map((action, index) => {
@@ -4252,15 +3612,15 @@ function BannerGdprRights({
4252
3612
  );
4253
3613
  });
4254
3614
  }, [actions, actionsSlot]);
4255
- const dismissIconContent = React6.useMemo(() => {
3615
+ const dismissIconContent = React4.useMemo(() => {
4256
3616
  if (dismissIcon) return dismissIcon;
4257
3617
  return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "mynaui/x", size: 16 });
4258
3618
  }, [dismissIcon]);
4259
- const titleContent = React6.useMemo(() => {
3619
+ const titleContent = React4.useMemo(() => {
4260
3620
  if (!title) return null;
4261
3621
  return typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("font-semibold text-sm", titleClassName), children: title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: titleClassName, children: title });
4262
3622
  }, [title, titleClassName]);
4263
- const descriptionContent = React6.useMemo(() => {
3623
+ const descriptionContent = React4.useMemo(() => {
4264
3624
  if (!description && !actionsContent) return null;
4265
3625
  return /* @__PURE__ */ jsxRuntime.jsxs("p", { className: cn("text-sm text-muted-foreground mt-1", descriptionClassName), children: [
4266
3626
  description,
@@ -4314,13 +3674,13 @@ function BannerPrivacyNotice({
4314
3674
  actionsClassName,
4315
3675
  dismissButtonClassName
4316
3676
  }) {
4317
- const [isVisible, setIsVisible] = React6.useState(true);
3677
+ const [isVisible, setIsVisible] = React4.useState(true);
4318
3678
  const dismissLabel = dismissAriaLabel ?? "Dismiss banner";
4319
- const handleDismiss = React6.useCallback(() => {
3679
+ const handleDismiss = React4.useCallback(() => {
4320
3680
  setIsVisible(false);
4321
3681
  onDismiss?.();
4322
3682
  }, [onDismiss]);
4323
- const iconContent = React6.useMemo(() => {
3683
+ const iconContent = React4.useMemo(() => {
4324
3684
  if (icon) return icon;
4325
3685
  if (!iconName) return null;
4326
3686
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -4332,7 +3692,7 @@ function BannerPrivacyNotice({
4332
3692
  }
4333
3693
  );
4334
3694
  }, [icon, iconName, iconClassName]);
4335
- const actionsContent = React6.useMemo(() => {
3695
+ const actionsContent = React4.useMemo(() => {
4336
3696
  if (actionsSlot) return actionsSlot;
4337
3697
  if (!actions || actions.length === 0) return null;
4338
3698
  return actions.map((action, index) => {
@@ -4359,15 +3719,15 @@ function BannerPrivacyNotice({
4359
3719
  );
4360
3720
  });
4361
3721
  }, [actions, actionsSlot]);
4362
- const dismissIconContent = React6.useMemo(() => {
3722
+ const dismissIconContent = React4.useMemo(() => {
4363
3723
  if (dismissIcon) return dismissIcon;
4364
3724
  return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "mynaui/x", size: 16 });
4365
3725
  }, [dismissIcon]);
4366
- const titleContent = React6.useMemo(() => {
3726
+ const titleContent = React4.useMemo(() => {
4367
3727
  if (!title) return null;
4368
3728
  return typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("font-semibold text-sm", titleClassName), children: title }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: titleClassName, children: title });
4369
3729
  }, [title, titleClassName]);
4370
- const descriptionContent = React6.useMemo(() => {
3730
+ const descriptionContent = React4.useMemo(() => {
4371
3731
  if (!description) return null;
4372
3732
  return typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-sm text-muted-foreground mt-1", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-sm text-muted-foreground mt-1", descriptionClassName), children: description });
4373
3733
  }, [description, descriptionClassName]);
@@ -4414,7 +3774,7 @@ function BannerPromoCta({
4414
3774
  discountClassName,
4415
3775
  actionsClassName
4416
3776
  }) {
4417
- const actionsContent = React6.useMemo(() => {
3777
+ const actionsContent = React4.useMemo(() => {
4418
3778
  if (actionsSlot) return actionsSlot;
4419
3779
  if (!actions || actions.length === 0) return null;
4420
3780
  return actions.map((action, index) => {
@@ -4441,15 +3801,15 @@ function BannerPromoCta({
4441
3801
  );
4442
3802
  });
4443
3803
  }, [actions, actionsSlot]);
4444
- const separatorContent = React6.useMemo(() => {
3804
+ const separatorContent = React4.useMemo(() => {
4445
3805
  if (separator) return separator;
4446
3806
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("hidden sm:inline", separatorClassName), children: "\xB7" });
4447
3807
  }, [separator, separatorClassName]);
4448
- const messageContent = React6.useMemo(() => {
3808
+ const messageContent = React4.useMemo(() => {
4449
3809
  if (!message) return null;
4450
3810
  return typeof message === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("font-semibold", messageClassName), children: message }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: messageClassName, children: message });
4451
3811
  }, [message, messageClassName]);
4452
- const discountContent = React6.useMemo(() => {
3812
+ const discountContent = React4.useMemo(() => {
4453
3813
  if (!discount) return null;
4454
3814
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className: discountClassName, children: discount });
4455
3815
  }, [discount, discountClassName]);
@@ -4477,13 +3837,13 @@ function BannerSocialFollow({
4477
3837
  actionsClassName,
4478
3838
  dismissButtonClassName
4479
3839
  }) {
4480
- const [isVisible, setIsVisible] = React6.useState(true);
3840
+ const [isVisible, setIsVisible] = React4.useState(true);
4481
3841
  const dismissLabel = dismissAriaLabel ?? "Dismiss banner";
4482
- const handleDismiss = React6.useCallback(() => {
3842
+ const handleDismiss = React4.useCallback(() => {
4483
3843
  setIsVisible(false);
4484
3844
  onDismiss?.();
4485
3845
  }, [onDismiss]);
4486
- const iconContent = React6.useMemo(() => {
3846
+ const iconContent = React4.useMemo(() => {
4487
3847
  if (icon) return icon;
4488
3848
  if (!iconName) return null;
4489
3849
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -4495,7 +3855,7 @@ function BannerSocialFollow({
4495
3855
  }
4496
3856
  );
4497
3857
  }, [icon, iconName, iconClassName]);
4498
- const actionsContent = React6.useMemo(() => {
3858
+ const actionsContent = React4.useMemo(() => {
4499
3859
  if (actionsSlot) return actionsSlot;
4500
3860
  if (!actions || actions.length === 0) return null;
4501
3861
  return actions.map((action, index) => {
@@ -4523,11 +3883,11 @@ function BannerSocialFollow({
4523
3883
  );
4524
3884
  });
4525
3885
  }, [actions, actionsSlot]);
4526
- const dismissIconContent = React6.useMemo(() => {
3886
+ const dismissIconContent = React4.useMemo(() => {
4527
3887
  if (dismissIcon) return dismissIcon;
4528
3888
  return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "mynaui/x", size: 16 });
4529
3889
  }, [dismissIcon]);
4530
- const messageContent = React6.useMemo(() => {
3890
+ const messageContent = React4.useMemo(() => {
4531
3891
  if (!message) return null;
4532
3892
  return typeof message === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("font-medium", messageClassName), children: message }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: messageClassName, children: message });
4533
3893
  }, [message, messageClassName]);
@@ -4575,13 +3935,13 @@ function BannerSurveyIncentive({
4575
3935
  actionsClassName,
4576
3936
  dismissButtonClassName
4577
3937
  }) {
4578
- const [isVisible, setIsVisible] = React6.useState(true);
3938
+ const [isVisible, setIsVisible] = React4.useState(true);
4579
3939
  const dismissLabel = dismissAriaLabel ?? "Dismiss banner";
4580
- const handleDismiss = React6.useCallback(() => {
3940
+ const handleDismiss = React4.useCallback(() => {
4581
3941
  setIsVisible(false);
4582
3942
  onDismiss?.();
4583
3943
  }, [onDismiss]);
4584
- const iconContent = React6.useMemo(() => {
3944
+ const iconContent = React4.useMemo(() => {
4585
3945
  if (icon) return icon;
4586
3946
  if (!iconName) return null;
4587
3947
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -4593,7 +3953,7 @@ function BannerSurveyIncentive({
4593
3953
  }
4594
3954
  );
4595
3955
  }, [icon, iconName, iconClassName]);
4596
- const actionsContent = React6.useMemo(() => {
3956
+ const actionsContent = React4.useMemo(() => {
4597
3957
  if (actionsSlot) return actionsSlot;
4598
3958
  if (!actions || actions.length === 0) return null;
4599
3959
  return actions.map((action, index) => {
@@ -4621,15 +3981,15 @@ function BannerSurveyIncentive({
4621
3981
  );
4622
3982
  });
4623
3983
  }, [actions, actionsSlot]);
4624
- const dismissIconContent = React6.useMemo(() => {
3984
+ const dismissIconContent = React4.useMemo(() => {
4625
3985
  if (dismissIcon) return dismissIcon;
4626
3986
  return /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "mynaui/x", size: 16 });
4627
3987
  }, [dismissIcon]);
4628
- const titleContent = React6.useMemo(() => {
3988
+ const titleContent = React4.useMemo(() => {
4629
3989
  if (!title) return null;
4630
3990
  return typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("font-medium", titleClassName), children: title }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: titleClassName, children: title });
4631
3991
  }, [title, titleClassName]);
4632
- const descriptionContent = React6.useMemo(() => {
3992
+ const descriptionContent = React4.useMemo(() => {
4633
3993
  if (!description) return null;
4634
3994
  return typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-muted-foreground", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: descriptionClassName, children: description });
4635
3995
  }, [description, descriptionClassName]);
@@ -4739,7 +4099,7 @@ function FooterCopyright({
4739
4099
  copyright,
4740
4100
  className
4741
4101
  }) {
4742
- const currentYear = React6.useMemo(() => (/* @__PURE__ */ new Date()).getFullYear(), []);
4102
+ const currentYear = React4.useMemo(() => (/* @__PURE__ */ new Date()).getFullYear(), []);
4743
4103
  if (!copyright) {
4744
4104
  return null;
4745
4105
  }
@@ -5251,8 +4611,8 @@ var BrandAttribution = ({
5251
4611
  }
5252
4612
  const { prefix = "", anchorText, href, suffix = "" } = options[optionIndex];
5253
4613
  const ContainerEl = variant;
5254
- const [trackedHref, setTrackedHref] = React6__namespace.useState(href);
5255
- React6__namespace.useEffect(() => {
4614
+ const [trackedHref, setTrackedHref] = React4__namespace.useState(href);
4615
+ React4__namespace.useEffect(() => {
5256
4616
  setTrackedHref(buildTrackedHref(href));
5257
4617
  }, [href]);
5258
4618
  return /* @__PURE__ */ jsxRuntime.jsxs(ContainerEl, { className: containerClassName, children: [
@@ -5372,7 +4732,7 @@ function FooterSocialNewsletter({
5372
4732
  patternOpacity,
5373
4733
  optixFlowConfig
5374
4734
  }) {
5375
- const renderForm = React6__namespace.useMemo(() => {
4735
+ const renderForm = React4__namespace.useMemo(() => {
5376
4736
  if (!formEngineSetup) return null;
5377
4737
  const action = {
5378
4738
  variant: "default",
@@ -5525,14 +4885,14 @@ function FooterSocialApps({
5525
4885
  patternOpacity,
5526
4886
  optixFlowConfig
5527
4887
  }) {
5528
- const sectionsContent = React6.useMemo(() => {
4888
+ const sectionsContent = React4.useMemo(() => {
5529
4889
  if (!sections || sections.length === 0) return null;
5530
4890
  return sections.map((section, sectionIdx) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-8 md:mt-0", children: [
5531
4891
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mb-4 font-bold", children: section.title }),
5532
4892
  /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-4", children: section.links.map((link, linkIdx) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "font-medium ", children: /* @__PURE__ */ jsxRuntime.jsx(Pressable, { href: link.href, children: link.name }) }, linkIdx)) })
5533
4893
  ] }, sectionIdx));
5534
4894
  }, [sections]);
5535
- const socialLinksContent = React6.useMemo(() => {
4895
+ const socialLinksContent = React4.useMemo(() => {
5536
4896
  if (!socialLinks || socialLinks.length === 0) return null;
5537
4897
  return socialLinks.map((social, idx) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "font-medium", children: /* @__PURE__ */ jsxRuntime.jsx(
5538
4898
  SocialLinkIcon,
@@ -5547,7 +4907,7 @@ function FooterSocialApps({
5547
4907
  }
5548
4908
  ) }, idx));
5549
4909
  }, [socialLinks, background]);
5550
- const appLinksContent = React6.useMemo(() => {
4910
+ const appLinksContent = React4.useMemo(() => {
5551
4911
  if (!appLinks || appLinks.length === 0) return null;
5552
4912
  return appLinks.map((app, idx) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: "font-medium", children: /* @__PURE__ */ jsxRuntime.jsx(Pressable, { href: app.href, "aria-label": app.label, children: /* @__PURE__ */ jsxRuntime.jsx(
5553
4913
  "span",
@@ -5636,7 +4996,7 @@ function FooterSimpleCentered({
5636
4996
  patternOpacity,
5637
4997
  optixFlowConfig
5638
4998
  }) {
5639
- const sitemapContent = React6.useMemo(() => {
4999
+ const sitemapContent = React4.useMemo(() => {
5640
5000
  if (!sitemap || sitemap.length === 0) return null;
5641
5001
  return sitemap.map((section) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(sitemapSectionClassName), children: [
5642
5002
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("mb-4 text-sm font-semibold", sitemapTitleClassName), children: section.title }),
@@ -5659,9 +5019,9 @@ function FooterSimpleCentered({
5659
5019
  sitemapLinksClassName,
5660
5020
  sitemapLinkClassName
5661
5021
  ]);
5662
- const bottomLinksContent = React6.useMemo(() => {
5022
+ const bottomLinksContent = React4.useMemo(() => {
5663
5023
  if (!bottomLinks || bottomLinks.length === 0) return null;
5664
- return bottomLinks.map((link, idx) => /* @__PURE__ */ jsxRuntime.jsx(React6__namespace.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(
5024
+ return bottomLinks.map((link, idx) => /* @__PURE__ */ jsxRuntime.jsx(React4__namespace.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(
5665
5025
  Pressable,
5666
5026
  {
5667
5027
  href: link.href,
@@ -5986,7 +5346,7 @@ function FooterNewsletterGrid({
5986
5346
  patternOpacity,
5987
5347
  optixFlowConfig
5988
5348
  }) {
5989
- const sectionsContent = React6.useMemo(() => {
5349
+ const sectionsContent = React4.useMemo(() => {
5990
5350
  if (!sections || sections.length === 0) return null;
5991
5351
  return sections.map((section, sectionIdx) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "col-span-2 md:col-span-1", children: [
5992
5352
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mb-5 font-medium", children: section.title }),
@@ -6000,7 +5360,7 @@ function FooterNewsletterGrid({
6000
5360
  )) })
6001
5361
  ] }, sectionIdx));
6002
5362
  }, [sections]);
6003
- const socialLinksContent = React6.useMemo(() => {
5363
+ const socialLinksContent = React4.useMemo(() => {
6004
5364
  if (!socialLinks || socialLinks.length === 0) return null;
6005
5365
  return socialLinks.map((social, idx) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
6006
5366
  SocialLinkIcon,
@@ -6516,7 +5876,7 @@ function FooterBackgroundCard({
6516
5876
  patternOpacity,
6517
5877
  optixFlowConfig
6518
5878
  }) {
6519
- const sectionStyle = React6.useMemo(
5879
+ const sectionStyle = React4.useMemo(
6520
5880
  () => backgroundImage ? { backgroundImage: `url('${backgroundImage}')` } : void 0,
6521
5881
  [backgroundImage]
6522
5882
  );
@@ -6790,7 +6150,7 @@ function FooterAnimatedSocial({
6790
6150
  pattern,
6791
6151
  patternOpacity
6792
6152
  }) {
6793
- const socialLinksContent = React6.useMemo(() => {
6153
+ const socialLinksContent = React4.useMemo(() => {
6794
6154
  if (!socialLinks || socialLinks.length === 0) return null;
6795
6155
  return socialLinks.map((link, idx) => /* @__PURE__ */ jsxRuntime.jsx(
6796
6156
  framerMotion.motion.div,
@@ -7008,7 +6368,7 @@ function FooterNewsletterMinimal({
7008
6368
  buttonAction,
7009
6369
  formSlot
7010
6370
  }) {
7011
- const navLinksContent = React6__namespace.useMemo(() => {
6371
+ const navLinksContent = React4__namespace.useMemo(() => {
7012
6372
  if (!navLinks || navLinks.length === 0) return null;
7013
6373
  return navLinks.map((item, idx) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
7014
6374
  Pressable,
@@ -7019,7 +6379,7 @@ function FooterNewsletterMinimal({
7019
6379
  }
7020
6380
  ) }, idx));
7021
6381
  }, [navLinks, navLinkClassName]);
7022
- const socialLinksContent = React6__namespace.useMemo(() => {
6382
+ const socialLinksContent = React4__namespace.useMemo(() => {
7023
6383
  if (!socialLinks || socialLinks.length === 0) return null;
7024
6384
  return socialLinks.map((item, idx) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
7025
6385
  SocialLinkIcon,
@@ -7035,7 +6395,7 @@ function FooterNewsletterMinimal({
7035
6395
  }
7036
6396
  ) }, idx));
7037
6397
  }, [socialLinks, socialLinkClassName]);
7038
- const footerLinksContent = React6__namespace.useMemo(() => {
6398
+ const footerLinksContent = React4__namespace.useMemo(() => {
7039
6399
  if (!footerLinks || footerLinks.length === 0) return null;
7040
6400
  return footerLinks.map((item) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
7041
6401
  Pressable,
@@ -7049,7 +6409,7 @@ function FooterNewsletterMinimal({
7049
6409
  }
7050
6410
  ) }, item.label));
7051
6411
  }, [footerLinks, footerLinkClassName]);
7052
- const renderForm = React6__namespace.useMemo(() => {
6412
+ const renderForm = React4__namespace.useMemo(() => {
7053
6413
  if (formSlot) return formSlot;
7054
6414
  if (!formEngineSetup) return null;
7055
6415
  const defaultButtonAction = {
@@ -7284,7 +6644,7 @@ function FooterCtaSocial({
7284
6644
  pattern,
7285
6645
  patternOpacity
7286
6646
  }) {
7287
- const socialLinksContent = React6.useMemo(() => {
6647
+ const socialLinksContent = React4.useMemo(() => {
7288
6648
  if (!socialLinks || socialLinks.length === 0) return null;
7289
6649
  return socialLinks.map((link) => /* @__PURE__ */ jsxRuntime.jsx(
7290
6650
  SocialLinkIcon,
@@ -7402,7 +6762,7 @@ function FooterNavSocial({
7402
6762
  patternOpacity,
7403
6763
  optixFlowConfig
7404
6764
  }) {
7405
- const sectionsContent = React6.useMemo(() => {
6765
+ const sectionsContent = React4.useMemo(() => {
7406
6766
  if (!sections || sections.length === 0) return null;
7407
6767
  return sections.map((section, sectionIdx) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(navSectionClassName), children: [
7408
6768
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("mb-4 font-semibold", navTitleClassName), children: section.title }),
@@ -7415,7 +6775,7 @@ function FooterNavSocial({
7415
6775
  navLinksClassName,
7416
6776
  navLinkClassName
7417
6777
  ]);
7418
- const socialLinksContent = React6.useMemo(() => {
6778
+ const socialLinksContent = React4.useMemo(() => {
7419
6779
  if (!socialLinks || socialLinks.length === 0) return null;
7420
6780
  return socialLinks.map((social, idx) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
7421
6781
  SocialLinkIcon,
@@ -7430,7 +6790,7 @@ function FooterNavSocial({
7430
6790
  }
7431
6791
  ) }, idx));
7432
6792
  }, [socialLinks, socialLinkClassName]);
7433
- const legalLinksContent = React6.useMemo(() => {
6793
+ const legalLinksContent = React4.useMemo(() => {
7434
6794
  if (!legalLinks || legalLinks.length === 0) return null;
7435
6795
  return legalLinks.map((link, idx) => /* @__PURE__ */ jsxRuntime.jsx("li", { className: cn(legalLinkClassName), children: /* @__PURE__ */ jsxRuntime.jsx(Pressable, { href: link.href, className: "hover:opacity-100", children: link.name }) }, idx));
7436
6796
  }, [legalLinks, legalLinkClassName]);
@@ -7598,7 +6958,7 @@ function FooterNavSocial({
7598
6958
  var useResponsiveLayout = ({
7599
6959
  directionConfig = { desktop: "mediaRight", mobile: "mediaTop" }
7600
6960
  }) => {
7601
- const responsiveClassName = React6.useMemo(() => {
6961
+ const responsiveClassName = React4.useMemo(() => {
7602
6962
  const desktopOrder = directionConfig.desktop === "mediaRight" ? "lg:flex-row" : "lg:flex-row-reverse";
7603
6963
  const mobileOrder = directionConfig.mobile === "mediaTop" ? "flex-col-reverse" : "flex-col";
7604
6964
  return `${mobileOrder} ${desktopOrder}`;
@@ -7679,7 +7039,6 @@ exports.FooterNewsletterMinimal = FooterNewsletterMinimal;
7679
7039
  exports.FooterSimpleCentered = FooterSimpleCentered;
7680
7040
  exports.FooterSocialApps = FooterSocialApps;
7681
7041
  exports.FooterSocialNewsletter = FooterSocialNewsletter;
7682
- exports.GeoMap = GeoMap;
7683
7042
  exports.ImageSlider = ImageSlider;
7684
7043
  exports.MediaHoverCtas = MediaHoverCtas;
7685
7044
  exports.PageHeroBanner = PageHeroBanner;