@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.
- package/dist/about-culture-tabs.cjs +174 -174
- package/dist/about-culture-tabs.js +174 -174
- package/dist/about-developer-profile.cjs +200 -200
- package/dist/about-developer-profile.js +198 -198
- package/dist/about-developer-story.cjs +142 -142
- package/dist/about-developer-story.js +142 -142
- package/dist/about-mission-dual-image.cjs +142 -142
- package/dist/about-mission-dual-image.js +142 -142
- package/dist/about-mission-features.cjs +142 -142
- package/dist/about-mission-features.js +142 -142
- package/dist/about-network-spotlight.cjs +142 -142
- package/dist/about-network-spotlight.js +142 -142
- package/dist/about-story-expertise.cjs +142 -142
- package/dist/about-story-expertise.js +142 -142
- package/dist/about-streamline-team.cjs +142 -142
- package/dist/about-streamline-team.js +142 -142
- package/dist/carousel-icon-sidebar.cjs +5 -4
- package/dist/carousel-icon-sidebar.js +5 -4
- package/dist/community-initiatives.cjs +142 -142
- package/dist/community-initiatives.js +142 -142
- package/dist/components.cjs +723 -1364
- package/dist/components.d.cts +0 -2
- package/dist/components.d.ts +0 -2
- package/dist/components.js +633 -1273
- package/dist/contact-map.cjs +14 -1069
- package/dist/contact-map.d.cts +13 -3
- package/dist/contact-map.d.ts +13 -3
- package/dist/contact-map.js +14 -1069
- package/dist/cta-feature-checklist.cjs +142 -142
- package/dist/cta-feature-checklist.js +142 -142
- package/dist/faq-numbered-grid.cjs +142 -142
- package/dist/faq-numbered-grid.js +142 -142
- package/dist/feature-animated-carousel.cjs +142 -142
- package/dist/feature-animated-carousel.js +142 -142
- package/dist/feature-bento-utilities.cjs +142 -142
- package/dist/feature-bento-utilities.js +142 -142
- package/dist/feature-capabilities-grid.cjs +142 -142
- package/dist/feature-capabilities-grid.js +142 -142
- package/dist/feature-category-image-cards.cjs +142 -142
- package/dist/feature-category-image-cards.js +142 -142
- package/dist/feature-icon-grid-bordered.cjs +142 -142
- package/dist/feature-icon-grid-bordered.js +142 -142
- package/dist/feature-icon-grid-muted.cjs +142 -142
- package/dist/feature-icon-grid-muted.js +142 -142
- package/dist/feature-numbered-cards.cjs +142 -142
- package/dist/feature-numbered-cards.js +142 -142
- package/dist/feature-three-column-values.cjs +142 -142
- package/dist/feature-three-column-values.js +142 -142
- package/dist/hero-ad-campaign-expert.cjs +142 -142
- package/dist/hero-ad-campaign-expert.js +142 -142
- package/dist/hero-adaptable-product-grid.cjs +142 -142
- package/dist/hero-adaptable-product-grid.js +142 -142
- package/dist/hero-agency-animated-images.cjs +142 -142
- package/dist/hero-agency-animated-images.js +142 -142
- package/dist/hero-announcement-badge.cjs +142 -142
- package/dist/hero-announcement-badge.js +142 -142
- package/dist/hero-badge-image-split.cjs +142 -142
- package/dist/hero-badge-image-split.js +142 -142
- package/dist/hero-business-carousel-dots.cjs +142 -142
- package/dist/hero-business-carousel-dots.js +142 -142
- package/dist/hero-business-operations-mosaic.cjs +142 -142
- package/dist/hero-business-operations-mosaic.js +142 -142
- package/dist/hero-conversation-intelligence.cjs +142 -142
- package/dist/hero-conversation-intelligence.js +142 -142
- package/dist/hero-creative-studio-stacked.cjs +142 -142
- package/dist/hero-creative-studio-stacked.js +142 -142
- package/dist/hero-crm-streamlined.cjs +142 -142
- package/dist/hero-crm-streamlined.js +142 -142
- package/dist/hero-customer-support-layered.cjs +142 -142
- package/dist/hero-customer-support-layered.js +142 -142
- package/dist/hero-design-showcase-logos.cjs +142 -142
- package/dist/hero-design-showcase-logos.js +142 -142
- package/dist/hero-design-system-3d.cjs +142 -142
- package/dist/hero-design-system-3d.js +142 -142
- package/dist/hero-developer-tools-code.cjs +142 -142
- package/dist/hero-developer-tools-code.js +142 -142
- package/dist/hero-digital-agency-fullscreen.cjs +142 -142
- package/dist/hero-digital-agency-fullscreen.js +142 -142
- package/dist/hero-ecommerce-product-showcase.cjs +174 -174
- package/dist/hero-ecommerce-product-showcase.js +174 -174
- package/dist/hero-event-registration.cjs +142 -142
- package/dist/hero-event-registration.js +142 -142
- package/dist/hero-fullscreen-background-image.cjs +142 -142
- package/dist/hero-fullscreen-background-image.js +142 -142
- package/dist/hero-gradient-avatars-rating.cjs +142 -142
- package/dist/hero-gradient-avatars-rating.js +142 -142
- package/dist/hero-gradient-client-focused.cjs +142 -142
- package/dist/hero-gradient-client-focused.js +142 -142
- package/dist/hero-hiring-animated-text.cjs +142 -142
- package/dist/hero-hiring-animated-text.js +142 -142
- package/dist/hero-image-left-content.cjs +142 -142
- package/dist/hero-image-left-content.js +142 -142
- package/dist/hero-innovation-image-grid.cjs +142 -142
- package/dist/hero-innovation-image-grid.js +142 -142
- package/dist/hero-mental-health-team.cjs +142 -142
- package/dist/hero-mental-health-team.js +142 -142
- package/dist/hero-minimal-centered-dark.cjs +174 -174
- package/dist/hero-minimal-centered-dark.js +174 -174
- package/dist/hero-presentation-platform-video.cjs +142 -142
- package/dist/hero-presentation-platform-video.js +142 -142
- package/dist/hero-product-showcase-floating.cjs +174 -174
- package/dist/hero-product-showcase-floating.js +174 -174
- package/dist/hero-shared-inbox-layered.cjs +142 -142
- package/dist/hero-shared-inbox-layered.js +142 -142
- package/dist/hero-software-growth-video-dialog.cjs +142 -142
- package/dist/hero-software-growth-video-dialog.js +142 -142
- package/dist/hero-spiral-pattern-cards.cjs +174 -174
- package/dist/hero-spiral-pattern-cards.js +174 -174
- package/dist/hero-split-geometric-shapes.cjs +142 -142
- package/dist/hero-split-geometric-shapes.js +142 -142
- package/dist/hero-startup-launch-cta.cjs +174 -174
- package/dist/hero-startup-launch-cta.js +174 -174
- package/dist/hero-stats-social-proof.cjs +174 -174
- package/dist/hero-stats-social-proof.js +174 -174
- package/dist/hero-task-timer-animated.cjs +142 -142
- package/dist/hero-task-timer-animated.js +142 -142
- package/dist/hero-testimonial-image-grid.cjs +142 -142
- package/dist/hero-testimonial-image-grid.js +142 -142
- package/dist/hero-therapy-testimonial-grid.cjs +142 -142
- package/dist/hero-therapy-testimonial-grid.js +142 -142
- package/dist/hero-ui-library-showcase.cjs +142 -142
- package/dist/hero-ui-library-showcase.js +142 -142
- package/dist/hero-video-background-dark.cjs +174 -174
- package/dist/hero-video-background-dark.js +174 -174
- package/dist/hero-video-dialog-gradient.cjs +142 -142
- package/dist/hero-video-dialog-gradient.js +142 -142
- package/dist/hero-video-overlay-stars.cjs +142 -142
- package/dist/hero-video-overlay-stars.js +142 -142
- package/dist/hero-welcome-asymmetric-images.cjs +142 -142
- package/dist/hero-welcome-asymmetric-images.js +142 -142
- package/dist/index.cjs +725 -1366
- package/dist/index.d.cts +0 -2
- package/dist/index.d.ts +0 -2
- package/dist/index.js +634 -1274
- package/dist/registry.cjs +2371 -2915
- package/dist/registry.js +1120 -1664
- package/dist/testimonials-large-quote.cjs +74 -43
- package/dist/testimonials-large-quote.d.cts +5 -1
- package/dist/testimonials-large-quote.d.ts +5 -1
- package/dist/testimonials-large-quote.js +74 -43
- package/dist/testimonials-logo-cards.cjs +8 -2
- package/dist/testimonials-logo-cards.js +8 -2
- package/dist/testimonials-masonry-grid.cjs +486 -69
- package/dist/testimonials-masonry-grid.d.cts +5 -1
- package/dist/testimonials-masonry-grid.d.ts +5 -1
- package/dist/testimonials-masonry-grid.js +483 -63
- package/dist/testimonials-mini-dividers.cjs +2 -3
- package/dist/testimonials-mini-dividers.js +2 -3
- package/dist/testimonials-minimal-numbered.cjs +5 -4
- package/dist/testimonials-minimal-numbered.js +5 -4
- package/dist/testimonials-parallax-number.cjs +5 -4
- package/dist/testimonials-parallax-number.js +5 -4
- package/dist/testimonials-scrolling-columns.cjs +7 -12
- package/dist/testimonials-scrolling-columns.js +7 -12
- package/dist/testimonials-stats-header.cjs +528 -87
- package/dist/testimonials-stats-header.d.cts +39 -3
- package/dist/testimonials-stats-header.d.ts +39 -3
- package/dist/testimonials-stats-header.js +523 -82
- package/package.json +4 -7
- package/dist/geo-map.cjs +0 -1103
- package/dist/geo-map.d.cts +0 -92
- package/dist/geo-map.d.ts +0 -92
- 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
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
const
|
|
542
|
-
|
|
543
|
-
|
|
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
|
-
}
|
|
640
|
-
|
|
641
|
-
if (
|
|
642
|
-
return
|
|
545
|
+
});
|
|
546
|
+
React4.useEffect(() => {
|
|
547
|
+
if (!open) {
|
|
548
|
+
return;
|
|
643
549
|
}
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
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
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
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] =
|
|
869
|
+
const [currentIndex, setCurrentIndex] = React4__namespace.useState(
|
|
1937
870
|
() => normalizeIndex(startIndex, images.length)
|
|
1938
871
|
);
|
|
1939
|
-
const handleNext =
|
|
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 =
|
|
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
|
-
|
|
888
|
+
React4__namespace.useEffect(() => {
|
|
1956
889
|
if (!hasImages) return;
|
|
1957
890
|
setCurrentIndex(normalizeIndex(startIndex, images.length));
|
|
1958
891
|
}, [startIndex, images.length, hasImages]);
|
|
1959
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
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
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
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
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
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
|
-
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
1675
|
+
const smartPlatformName = React4__namespace.useMemo(() => {
|
|
2316
1676
|
return platform || platformName;
|
|
2317
1677
|
}, [platform, platformName]);
|
|
2318
|
-
const iconName =
|
|
1678
|
+
const iconName = React4__namespace.useMemo(() => {
|
|
2319
1679
|
return iconNameOverride || platformIconMap[smartPlatformName];
|
|
2320
1680
|
}, [iconNameOverride, smartPlatformName]);
|
|
2321
|
-
const accessibleLabel =
|
|
1681
|
+
const accessibleLabel = React4__namespace.useMemo(() => {
|
|
2322
1682
|
return label || platformName;
|
|
2323
1683
|
}, [label, platformName]);
|
|
2324
|
-
const icon =
|
|
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 =
|
|
1764
|
+
var Text = React4__namespace.forwardRef(TextInner);
|
|
2405
1765
|
Text.displayName = "Text";
|
|
2406
1766
|
function isContentTextItem(item) {
|
|
2407
|
-
return item !== null && typeof item === "object" && !
|
|
1767
|
+
return item !== null && typeof item === "object" && !React4__namespace.isValidElement(item) && "_type" in item && item._type === "text";
|
|
2408
1768
|
}
|
|
2409
|
-
var ContentGroup =
|
|
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 (
|
|
2423
|
-
return
|
|
1782
|
+
if (React4__namespace.isValidElement(reactNode)) {
|
|
1783
|
+
return React4__namespace.cloneElement(reactNode, { key: reactNode.key ?? idx });
|
|
2424
1784
|
}
|
|
2425
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
2951
|
-
const toggleExpand =
|
|
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
|
-
|
|
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 =
|
|
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] =
|
|
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 =
|
|
2550
|
+
const handleCategoryChange = React4.useCallback(
|
|
3191
2551
|
(e) => {
|
|
3192
2552
|
setActiveCategory(e.target.value);
|
|
3193
2553
|
},
|
|
3194
2554
|
[]
|
|
3195
2555
|
);
|
|
3196
|
-
const categoriesContent =
|
|
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] =
|
|
2810
|
+
const [activeTab, setActiveTab] = React4__namespace.useState(
|
|
3451
2811
|
resolvedAspects[0]?.id || ""
|
|
3452
2812
|
);
|
|
3453
|
-
const headerItems =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
3116
|
+
const [isVisible, setIsVisible] = React4.useState(true);
|
|
3757
3117
|
const dismissLabel = dismissAriaLabel ?? "Dismiss banner";
|
|
3758
|
-
const handleDismiss =
|
|
3118
|
+
const handleDismiss = React4.useCallback(() => {
|
|
3759
3119
|
setIsVisible(false);
|
|
3760
3120
|
onDismiss?.();
|
|
3761
3121
|
}, [onDismiss]);
|
|
3762
|
-
const actionsContent =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
3212
|
+
const [timeLeft, setTimeLeft] = React4.useState({
|
|
3853
3213
|
hours: 0,
|
|
3854
3214
|
minutes: 0,
|
|
3855
3215
|
seconds: 0
|
|
3856
3216
|
});
|
|
3857
|
-
|
|
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 =
|
|
3881
|
-
const timerContent =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
3286
|
+
const [timeLeft, setTimeLeft] = React4.useState({
|
|
3927
3287
|
hours: 0,
|
|
3928
3288
|
minutes: 0,
|
|
3929
3289
|
seconds: 0
|
|
3930
3290
|
});
|
|
3931
|
-
|
|
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 =
|
|
3955
|
-
const iconContent =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
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
|
-
|
|
3450
|
+
React4.useEffect(() => {
|
|
4091
3451
|
if (!isControlled && defaultOpen !== internalOpen) {
|
|
4092
3452
|
setInternalOpen(initialOpen);
|
|
4093
3453
|
}
|
|
4094
3454
|
}, [defaultOpen, initialOpen, isControlled, internalOpen]);
|
|
4095
|
-
const handleDismiss =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
3570
|
+
const [isVisible, setIsVisible] = React4.useState(true);
|
|
4211
3571
|
const dismissLabel = dismissAriaLabel ?? "Dismiss banner";
|
|
4212
|
-
const handleDismiss =
|
|
3572
|
+
const handleDismiss = React4.useCallback(() => {
|
|
4213
3573
|
setIsVisible(false);
|
|
4214
3574
|
onDismiss?.();
|
|
4215
3575
|
}, [onDismiss]);
|
|
4216
|
-
const iconContent =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
3677
|
+
const [isVisible, setIsVisible] = React4.useState(true);
|
|
4318
3678
|
const dismissLabel = dismissAriaLabel ?? "Dismiss banner";
|
|
4319
|
-
const handleDismiss =
|
|
3679
|
+
const handleDismiss = React4.useCallback(() => {
|
|
4320
3680
|
setIsVisible(false);
|
|
4321
3681
|
onDismiss?.();
|
|
4322
3682
|
}, [onDismiss]);
|
|
4323
|
-
const iconContent =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
3840
|
+
const [isVisible, setIsVisible] = React4.useState(true);
|
|
4481
3841
|
const dismissLabel = dismissAriaLabel ?? "Dismiss banner";
|
|
4482
|
-
const handleDismiss =
|
|
3842
|
+
const handleDismiss = React4.useCallback(() => {
|
|
4483
3843
|
setIsVisible(false);
|
|
4484
3844
|
onDismiss?.();
|
|
4485
3845
|
}, [onDismiss]);
|
|
4486
|
-
const iconContent =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
3938
|
+
const [isVisible, setIsVisible] = React4.useState(true);
|
|
4579
3939
|
const dismissLabel = dismissAriaLabel ?? "Dismiss banner";
|
|
4580
|
-
const handleDismiss =
|
|
3940
|
+
const handleDismiss = React4.useCallback(() => {
|
|
4581
3941
|
setIsVisible(false);
|
|
4582
3942
|
onDismiss?.();
|
|
4583
3943
|
}, [onDismiss]);
|
|
4584
|
-
const iconContent =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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] =
|
|
5255
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
5022
|
+
const bottomLinksContent = React4.useMemo(() => {
|
|
5663
5023
|
if (!bottomLinks || bottomLinks.length === 0) return null;
|
|
5664
|
-
return bottomLinks.map((link, idx) => /* @__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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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;
|