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