@opensite/ui 3.6.4 → 3.6.6

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.
@@ -0,0 +1,59 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var clsx = require('clsx');
7
+ var tailwindMerge = require('tailwind-merge');
8
+ var pressable = require('@page-speed/pressable');
9
+ var img = require('@page-speed/img');
10
+ var jsxRuntime = require('react/jsx-runtime');
11
+
12
+ function cn(...inputs) {
13
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
14
+ }
15
+ var SIZE_CLASSES = {
16
+ sm: "max-h-6 sm:max-h-7",
17
+ md: "max-h-8 sm:max-h-9 lg:max-h-10",
18
+ lg: "max-h-10 sm:max-h-12 lg:max-h-14",
19
+ xl: "max-h-12 sm:max-h-14 lg:max-h-16"
20
+ };
21
+ var BrandLogo = ({
22
+ logo,
23
+ logoSlot,
24
+ logoClassName,
25
+ size = "md",
26
+ optixFlowConfig
27
+ }) => {
28
+ if (logoSlot) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: logoSlot });
29
+ if (!logo || !logo.src) return null;
30
+ const imgElement = /* @__PURE__ */ jsxRuntime.jsx(
31
+ img.Img,
32
+ {
33
+ src: logo.src,
34
+ className: cn(
35
+ "w-auto object-contain",
36
+ SIZE_CLASSES[size],
37
+ logo.className
38
+ ),
39
+ alt: logo.alt || "Logo",
40
+ optixFlowConfig,
41
+ loading: "eager"
42
+ }
43
+ );
44
+ if (logo.url) {
45
+ return /* @__PURE__ */ jsxRuntime.jsx(
46
+ pressable.Pressable,
47
+ {
48
+ href: logo.url,
49
+ className: cn("flex items-center", logoClassName),
50
+ children: imgElement
51
+ }
52
+ );
53
+ }
54
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex items-center", logoClassName), children: imgElement });
55
+ };
56
+ var brand_logo_default = BrandLogo;
57
+
58
+ exports.BrandLogo = BrandLogo;
59
+ exports.default = brand_logo_default;
@@ -0,0 +1,21 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { L as LogoConfig } from './types-mWZcgKth.cjs';
4
+ import { O as OptixFlowConfig } from './blocks-DyouPohq.cjs';
5
+ import './dynamic-icon.cjs';
6
+ import '@page-speed/icon';
7
+ import 'class-variance-authority';
8
+ import '@page-speed/pressable';
9
+ import '@opensite/hooks/usePlatformFromUrl';
10
+
11
+ type BrandLogoSize = "sm" | "md" | "lg" | "xl";
12
+ interface BrandLogoProps {
13
+ logo?: LogoConfig;
14
+ logoSlot?: React.ReactNode;
15
+ logoClassName?: string;
16
+ size?: BrandLogoSize;
17
+ optixFlowConfig?: OptixFlowConfig;
18
+ }
19
+ declare const BrandLogo: ({ logo, logoSlot, logoClassName, size, optixFlowConfig, }: BrandLogoProps) => react_jsx_runtime.JSX.Element | null;
20
+
21
+ export { BrandLogo, type BrandLogoProps, type BrandLogoSize, BrandLogo as default };
@@ -0,0 +1,21 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { L as LogoConfig } from './types-hJ2R0GoH.js';
4
+ import { O as OptixFlowConfig } from './blocks-DyouPohq.js';
5
+ import './dynamic-icon.js';
6
+ import '@page-speed/icon';
7
+ import 'class-variance-authority';
8
+ import '@page-speed/pressable';
9
+ import '@opensite/hooks/usePlatformFromUrl';
10
+
11
+ type BrandLogoSize = "sm" | "md" | "lg" | "xl";
12
+ interface BrandLogoProps {
13
+ logo?: LogoConfig;
14
+ logoSlot?: React.ReactNode;
15
+ logoClassName?: string;
16
+ size?: BrandLogoSize;
17
+ optixFlowConfig?: OptixFlowConfig;
18
+ }
19
+ declare const BrandLogo: ({ logo, logoSlot, logoClassName, size, optixFlowConfig, }: BrandLogoProps) => react_jsx_runtime.JSX.Element | null;
20
+
21
+ export { BrandLogo, type BrandLogoProps, type BrandLogoSize, BrandLogo as default };
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ import { clsx } from 'clsx';
3
+ import { twMerge } from 'tailwind-merge';
4
+ import { Pressable } from '@page-speed/pressable';
5
+ import { Img } from '@page-speed/img';
6
+ import { jsx, Fragment } from 'react/jsx-runtime';
7
+
8
+ function cn(...inputs) {
9
+ return twMerge(clsx(inputs));
10
+ }
11
+ var SIZE_CLASSES = {
12
+ sm: "max-h-6 sm:max-h-7",
13
+ md: "max-h-8 sm:max-h-9 lg:max-h-10",
14
+ lg: "max-h-10 sm:max-h-12 lg:max-h-14",
15
+ xl: "max-h-12 sm:max-h-14 lg:max-h-16"
16
+ };
17
+ var BrandLogo = ({
18
+ logo,
19
+ logoSlot,
20
+ logoClassName,
21
+ size = "md",
22
+ optixFlowConfig
23
+ }) => {
24
+ if (logoSlot) return /* @__PURE__ */ jsx(Fragment, { children: logoSlot });
25
+ if (!logo || !logo.src) return null;
26
+ const imgElement = /* @__PURE__ */ jsx(
27
+ Img,
28
+ {
29
+ src: logo.src,
30
+ className: cn(
31
+ "w-auto object-contain",
32
+ SIZE_CLASSES[size],
33
+ logo.className
34
+ ),
35
+ alt: logo.alt || "Logo",
36
+ optixFlowConfig,
37
+ loading: "eager"
38
+ }
39
+ );
40
+ if (logo.url) {
41
+ return /* @__PURE__ */ jsx(
42
+ Pressable,
43
+ {
44
+ href: logo.url,
45
+ className: cn("flex items-center", logoClassName),
46
+ children: imgElement
47
+ }
48
+ );
49
+ }
50
+ return /* @__PURE__ */ jsx("div", { className: cn("flex items-center", logoClassName), children: imgElement });
51
+ };
52
+ var brand_logo_default = BrandLogo;
53
+
54
+ export { BrandLogo, brand_logo_default as default };
@@ -9,6 +9,7 @@ var classVarianceAuthority = require('class-variance-authority');
9
9
  var jsxRuntime = require('react/jsx-runtime');
10
10
  var pressable = require('@page-speed/pressable');
11
11
  var icon = require('@page-speed/icon');
12
+ var img = require('@page-speed/img');
12
13
 
13
14
  function _interopNamespace(e) {
14
15
  if (e && e.__esModule) return e;
@@ -79,6 +80,47 @@ var DynamicIcon = React__namespace.memo(function DynamicIcon2({
79
80
  return /* @__PURE__ */ jsxRuntime.jsx(icon.Icon, { ...props, name, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
80
81
  });
81
82
  DynamicIcon.displayName = "DynamicIcon";
83
+ var SIZE_CLASSES = {
84
+ sm: "max-h-6 sm:max-h-7",
85
+ md: "max-h-8 sm:max-h-9 lg:max-h-10",
86
+ lg: "max-h-10 sm:max-h-12 lg:max-h-14",
87
+ xl: "max-h-12 sm:max-h-14 lg:max-h-16"
88
+ };
89
+ var BrandLogo = ({
90
+ logo,
91
+ logoSlot,
92
+ logoClassName,
93
+ size = "md",
94
+ optixFlowConfig
95
+ }) => {
96
+ if (logoSlot) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: logoSlot });
97
+ if (!logo || !logo.src) return null;
98
+ const imgElement = /* @__PURE__ */ jsxRuntime.jsx(
99
+ img.Img,
100
+ {
101
+ src: logo.src,
102
+ className: cn(
103
+ "w-auto object-contain",
104
+ SIZE_CLASSES[size],
105
+ logo.className
106
+ ),
107
+ alt: logo.alt || "Logo",
108
+ optixFlowConfig,
109
+ loading: "eager"
110
+ }
111
+ );
112
+ if (logo.url) {
113
+ return /* @__PURE__ */ jsxRuntime.jsx(
114
+ pressable.Pressable,
115
+ {
116
+ href: logo.url,
117
+ className: cn("flex items-center", logoClassName),
118
+ children: imgElement
119
+ }
120
+ );
121
+ }
122
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex items-center", logoClassName), children: imgElement });
123
+ };
82
124
  var maxWidthStyles = {
83
125
  sm: "max-w-screen-sm",
84
126
  md: "max-w-screen-md",
@@ -457,6 +499,9 @@ var Section = React__namespace.default.forwardRef(
457
499
  Section.displayName = "Section";
458
500
  function HeroDashedBorderFeatures({
459
501
  sectionId = "hero-dashed-border-features",
502
+ logo,
503
+ logoSlot,
504
+ logoClassName,
460
505
  badgeText,
461
506
  announcementText,
462
507
  announcementHref,
@@ -468,7 +513,7 @@ function HeroDashedBorderFeatures({
468
513
  features,
469
514
  featuresSlot,
470
515
  background,
471
- spacing = "xl",
516
+ spacing = "hero",
472
517
  pattern,
473
518
  patternOpacity,
474
519
  className,
@@ -541,14 +586,18 @@ function HeroDashedBorderFeatures({
541
586
  pressable.Pressable,
542
587
  {
543
588
  className: cn(
544
- "flex items-center gap-6 border-t border-dashed p-4 font-medium md:justify-center lg:p-10 lg:text-lg",
589
+ "flex items-center gap-6 border-t border-dashed p-4 md:justify-center lg:p-10 ",
590
+ feature.href ? "cursor-pointer bg-transparent transition-colors duration-300 hover:bg-card hover:text-card-foreground" : "",
545
591
  index === 1 && "md:border-x",
546
592
  index === 2 ? "border-b" : "md:border-b"
547
593
  ),
548
594
  href: feature.href,
549
595
  children: [
550
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex size-10 shrink-0 items-center justify-center rounded-md text-sm lg:size-12 lg:text-base bg-card text-card-foreground", children: feature.icon ? feature.icon : feature.iconName ? /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: feature.iconName || "lucide/check", size: 20 }) : null }),
551
- feature.title
596
+ feature.icon || feature.iconName ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex size-10 shrink-0 items-center justify-center rounded-md text-sm lg:size-12 lg:text-base bg-card text-card-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: feature.icon || feature.iconName, size: 20 }) }) : null,
597
+ feature.title || feature.description ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-left flex flex-col gap-1", children: [
598
+ feature.title ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium text-base md:text-lg line-clamp-2", children: feature.title }) : null,
599
+ feature.description ? typeof feature.description === "string" && feature.description?.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm md:text-base opacity-70 text-balance line-clamp-1", children: feature.description }) : feature.description : null
600
+ ] }) : null
552
601
  ]
553
602
  },
554
603
  index
@@ -565,6 +614,7 @@ function HeroDashedBorderFeatures({
565
614
  className: cn("relative flex items-center justify-center", className),
566
615
  containerClassName,
567
616
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
617
+ (logo || logoSlot) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mb-6", logoClassName), children: /* @__PURE__ */ jsxRuntime.jsx(BrandLogo, { logo, logoSlot, size: "lg" }) }),
568
618
  /* @__PURE__ */ jsxRuntime.jsx(
569
619
  "div",
570
620
  {
@@ -578,12 +628,12 @@ function HeroDashedBorderFeatures({
578
628
  "h1",
579
629
  {
580
630
  className: cn(
581
- "my-4 mb-6 text-center text-3xl font-semibold lg:text-8xl",
631
+ "my-4 mb-6 text-center text-3xl font-semibold lg:text-8xl leading-tight",
582
632
  headingClassName
583
633
  ),
584
634
  children: heading
585
635
  }
586
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
636
+ ) : heading),
587
637
  description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
588
638
  "p",
589
639
  {
@@ -593,7 +643,7 @@ function HeroDashedBorderFeatures({
593
643
  ),
594
644
  children: description
595
645
  }
596
- ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description })),
646
+ ) : description),
597
647
  renderActions
598
648
  ] })
599
649
  }
@@ -1,12 +1,28 @@
1
1
  import * as React from 'react';
2
2
  import { S as SectionBackground, s as SectionSpacing, t as PatternName } from './community-initiatives-Cgd-IXlI.cjs';
3
+ import { L as LogoConfig } from './types-mWZcgKth.cjs';
3
4
  import { A as ActionConfig, F as FeatureItem } from './blocks-DyouPohq.cjs';
4
5
  import 'react/jsx-runtime';
6
+ import './dynamic-icon.cjs';
7
+ import '@page-speed/icon';
5
8
  import 'class-variance-authority';
6
9
  import '@page-speed/pressable';
7
10
  import '@opensite/hooks/usePlatformFromUrl';
8
11
 
9
12
  interface HeroDashedBorderFeaturesProps {
13
+ /**
14
+ * Brand logo configuration — renders above the announcement badge.
15
+ * LOGO MEDIA ONLY. Do not use photos, hero images, or video assets.
16
+ */
17
+ logo?: LogoConfig;
18
+ /**
19
+ * Custom slot for logo (overrides logo prop)
20
+ */
21
+ logoSlot?: React.ReactNode;
22
+ /**
23
+ * Additional CSS classes for the logo container
24
+ */
25
+ logoClassName?: string;
10
26
  /**
11
27
  * Badge text content
12
28
  */
@@ -96,6 +112,6 @@ interface HeroDashedBorderFeaturesProps {
96
112
  /** Optional Section ID */
97
113
  sectionId?: string;
98
114
  }
99
- declare function HeroDashedBorderFeatures({ sectionId, badgeText, announcementText, announcementHref, announcementSlot, heading, description, actions, actionsSlot, features, featuresSlot, background, spacing, pattern, patternOpacity, className, containerClassName, contentClassName, headingClassName, descriptionClassName, actionsClassName, featuresClassName, }: HeroDashedBorderFeaturesProps): React.JSX.Element;
115
+ declare function HeroDashedBorderFeatures({ sectionId, logo, logoSlot, logoClassName, badgeText, announcementText, announcementHref, announcementSlot, heading, description, actions, actionsSlot, features, featuresSlot, background, spacing, pattern, patternOpacity, className, containerClassName, contentClassName, headingClassName, descriptionClassName, actionsClassName, featuresClassName, }: HeroDashedBorderFeaturesProps): React.JSX.Element;
100
116
 
101
117
  export { HeroDashedBorderFeatures, type HeroDashedBorderFeaturesProps };
@@ -1,12 +1,28 @@
1
1
  import * as React from 'react';
2
2
  import { S as SectionBackground, s as SectionSpacing, t as PatternName } from './community-initiatives-Dud0DKXB.js';
3
+ import { L as LogoConfig } from './types-hJ2R0GoH.js';
3
4
  import { A as ActionConfig, F as FeatureItem } from './blocks-DyouPohq.js';
4
5
  import 'react/jsx-runtime';
6
+ import './dynamic-icon.js';
7
+ import '@page-speed/icon';
5
8
  import 'class-variance-authority';
6
9
  import '@page-speed/pressable';
7
10
  import '@opensite/hooks/usePlatformFromUrl';
8
11
 
9
12
  interface HeroDashedBorderFeaturesProps {
13
+ /**
14
+ * Brand logo configuration — renders above the announcement badge.
15
+ * LOGO MEDIA ONLY. Do not use photos, hero images, or video assets.
16
+ */
17
+ logo?: LogoConfig;
18
+ /**
19
+ * Custom slot for logo (overrides logo prop)
20
+ */
21
+ logoSlot?: React.ReactNode;
22
+ /**
23
+ * Additional CSS classes for the logo container
24
+ */
25
+ logoClassName?: string;
10
26
  /**
11
27
  * Badge text content
12
28
  */
@@ -96,6 +112,6 @@ interface HeroDashedBorderFeaturesProps {
96
112
  /** Optional Section ID */
97
113
  sectionId?: string;
98
114
  }
99
- declare function HeroDashedBorderFeatures({ sectionId, badgeText, announcementText, announcementHref, announcementSlot, heading, description, actions, actionsSlot, features, featuresSlot, background, spacing, pattern, patternOpacity, className, containerClassName, contentClassName, headingClassName, descriptionClassName, actionsClassName, featuresClassName, }: HeroDashedBorderFeaturesProps): React.JSX.Element;
115
+ declare function HeroDashedBorderFeatures({ sectionId, logo, logoSlot, logoClassName, badgeText, announcementText, announcementHref, announcementSlot, heading, description, actions, actionsSlot, features, featuresSlot, background, spacing, pattern, patternOpacity, className, containerClassName, contentClassName, headingClassName, descriptionClassName, actionsClassName, featuresClassName, }: HeroDashedBorderFeaturesProps): React.JSX.Element;
100
116
 
101
117
  export { HeroDashedBorderFeatures, type HeroDashedBorderFeaturesProps };
@@ -8,6 +8,7 @@ import { cva } from 'class-variance-authority';
8
8
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
9
9
  import { Pressable } from '@page-speed/pressable';
10
10
  import { Icon } from '@page-speed/icon';
11
+ import { Img } from '@page-speed/img';
11
12
 
12
13
  // components/blocks/hero/hero-dashed-border-features.tsx
13
14
  function cn(...inputs) {
@@ -58,6 +59,47 @@ var DynamicIcon = React.memo(function DynamicIcon2({
58
59
  return /* @__PURE__ */ jsx(Icon, { ...props, name, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
59
60
  });
60
61
  DynamicIcon.displayName = "DynamicIcon";
62
+ var SIZE_CLASSES = {
63
+ sm: "max-h-6 sm:max-h-7",
64
+ md: "max-h-8 sm:max-h-9 lg:max-h-10",
65
+ lg: "max-h-10 sm:max-h-12 lg:max-h-14",
66
+ xl: "max-h-12 sm:max-h-14 lg:max-h-16"
67
+ };
68
+ var BrandLogo = ({
69
+ logo,
70
+ logoSlot,
71
+ logoClassName,
72
+ size = "md",
73
+ optixFlowConfig
74
+ }) => {
75
+ if (logoSlot) return /* @__PURE__ */ jsx(Fragment, { children: logoSlot });
76
+ if (!logo || !logo.src) return null;
77
+ const imgElement = /* @__PURE__ */ jsx(
78
+ Img,
79
+ {
80
+ src: logo.src,
81
+ className: cn(
82
+ "w-auto object-contain",
83
+ SIZE_CLASSES[size],
84
+ logo.className
85
+ ),
86
+ alt: logo.alt || "Logo",
87
+ optixFlowConfig,
88
+ loading: "eager"
89
+ }
90
+ );
91
+ if (logo.url) {
92
+ return /* @__PURE__ */ jsx(
93
+ Pressable,
94
+ {
95
+ href: logo.url,
96
+ className: cn("flex items-center", logoClassName),
97
+ children: imgElement
98
+ }
99
+ );
100
+ }
101
+ return /* @__PURE__ */ jsx("div", { className: cn("flex items-center", logoClassName), children: imgElement });
102
+ };
61
103
  var maxWidthStyles = {
62
104
  sm: "max-w-screen-sm",
63
105
  md: "max-w-screen-md",
@@ -436,6 +478,9 @@ var Section = React__default.forwardRef(
436
478
  Section.displayName = "Section";
437
479
  function HeroDashedBorderFeatures({
438
480
  sectionId = "hero-dashed-border-features",
481
+ logo,
482
+ logoSlot,
483
+ logoClassName,
439
484
  badgeText,
440
485
  announcementText,
441
486
  announcementHref,
@@ -447,7 +492,7 @@ function HeroDashedBorderFeatures({
447
492
  features,
448
493
  featuresSlot,
449
494
  background,
450
- spacing = "xl",
495
+ spacing = "hero",
451
496
  pattern,
452
497
  patternOpacity,
453
498
  className,
@@ -520,14 +565,18 @@ function HeroDashedBorderFeatures({
520
565
  Pressable,
521
566
  {
522
567
  className: cn(
523
- "flex items-center gap-6 border-t border-dashed p-4 font-medium md:justify-center lg:p-10 lg:text-lg",
568
+ "flex items-center gap-6 border-t border-dashed p-4 md:justify-center lg:p-10 ",
569
+ feature.href ? "cursor-pointer bg-transparent transition-colors duration-300 hover:bg-card hover:text-card-foreground" : "",
524
570
  index === 1 && "md:border-x",
525
571
  index === 2 ? "border-b" : "md:border-b"
526
572
  ),
527
573
  href: feature.href,
528
574
  children: [
529
- /* @__PURE__ */ jsx("span", { className: "flex size-10 shrink-0 items-center justify-center rounded-md text-sm lg:size-12 lg:text-base bg-card text-card-foreground", children: feature.icon ? feature.icon : feature.iconName ? /* @__PURE__ */ jsx(DynamicIcon, { name: feature.iconName || "lucide/check", size: 20 }) : null }),
530
- feature.title
575
+ feature.icon || feature.iconName ? /* @__PURE__ */ jsx("span", { className: "flex size-10 shrink-0 items-center justify-center rounded-md text-sm lg:size-12 lg:text-base bg-card text-card-foreground", children: /* @__PURE__ */ jsx(DynamicIcon, { name: feature.icon || feature.iconName, size: 20 }) }) : null,
576
+ feature.title || feature.description ? /* @__PURE__ */ jsxs("div", { className: "text-left flex flex-col gap-1", children: [
577
+ feature.title ? /* @__PURE__ */ jsx("div", { className: "font-medium text-base md:text-lg line-clamp-2", children: feature.title }) : null,
578
+ feature.description ? typeof feature.description === "string" && feature.description?.length > 0 ? /* @__PURE__ */ jsx("div", { className: "text-sm md:text-base opacity-70 text-balance line-clamp-1", children: feature.description }) : feature.description : null
579
+ ] }) : null
531
580
  ]
532
581
  },
533
582
  index
@@ -544,6 +593,7 @@ function HeroDashedBorderFeatures({
544
593
  className: cn("relative flex items-center justify-center", className),
545
594
  containerClassName,
546
595
  children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
596
+ (logo || logoSlot) && /* @__PURE__ */ jsx("div", { className: cn("mb-6", logoClassName), children: /* @__PURE__ */ jsx(BrandLogo, { logo, logoSlot, size: "lg" }) }),
547
597
  /* @__PURE__ */ jsx(
548
598
  "div",
549
599
  {
@@ -557,12 +607,12 @@ function HeroDashedBorderFeatures({
557
607
  "h1",
558
608
  {
559
609
  className: cn(
560
- "my-4 mb-6 text-center text-3xl font-semibold lg:text-8xl",
610
+ "my-4 mb-6 text-center text-3xl font-semibold lg:text-8xl leading-tight",
561
611
  headingClassName
562
612
  ),
563
613
  children: heading
564
614
  }
565
- ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
615
+ ) : heading),
566
616
  description && (typeof description === "string" ? /* @__PURE__ */ jsx(
567
617
  "p",
568
618
  {
@@ -572,7 +622,7 @@ function HeroDashedBorderFeatures({
572
622
  ),
573
623
  children: description
574
624
  }
575
- ) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description })),
625
+ ) : description),
576
626
  renderActions
577
627
  ] })
578
628
  }
@@ -8,9 +8,9 @@ var clsx = require('clsx');
8
8
  var tailwindMerge = require('tailwind-merge');
9
9
  var icon = require('@page-speed/icon');
10
10
  var jsxRuntime = require('react/jsx-runtime');
11
+ var pressable = require('@page-speed/pressable');
11
12
  var img = require('@page-speed/img');
12
13
  var useEmblaCarousel = require('embla-carousel-react');
13
- var pressable = require('@page-speed/pressable');
14
14
 
15
15
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
16
 
@@ -54,6 +54,47 @@ var DynamicIcon = React2__namespace.memo(function DynamicIcon2({
54
54
  return /* @__PURE__ */ jsxRuntime.jsx(icon.Icon, { ...props, name, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
55
55
  });
56
56
  DynamicIcon.displayName = "DynamicIcon";
57
+ var SIZE_CLASSES = {
58
+ sm: "max-h-6 sm:max-h-7",
59
+ md: "max-h-8 sm:max-h-9 lg:max-h-10",
60
+ lg: "max-h-10 sm:max-h-12 lg:max-h-14",
61
+ xl: "max-h-12 sm:max-h-14 lg:max-h-16"
62
+ };
63
+ var BrandLogo = ({
64
+ logo,
65
+ logoSlot,
66
+ logoClassName,
67
+ size = "md",
68
+ optixFlowConfig
69
+ }) => {
70
+ if (logoSlot) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: logoSlot });
71
+ if (!logo || !logo.src) return null;
72
+ const imgElement = /* @__PURE__ */ jsxRuntime.jsx(
73
+ img.Img,
74
+ {
75
+ src: logo.src,
76
+ className: cn(
77
+ "w-auto object-contain",
78
+ SIZE_CLASSES[size],
79
+ logo.className
80
+ ),
81
+ alt: logo.alt || "Logo",
82
+ optixFlowConfig,
83
+ loading: "eager"
84
+ }
85
+ );
86
+ if (logo.url) {
87
+ return /* @__PURE__ */ jsxRuntime.jsx(
88
+ pressable.Pressable,
89
+ {
90
+ href: logo.url,
91
+ className: cn("flex items-center", logoClassName),
92
+ children: imgElement
93
+ }
94
+ );
95
+ }
96
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex items-center", logoClassName), children: imgElement });
97
+ };
57
98
  var CarouselContext = React2__namespace.createContext(null);
58
99
  function useCarousel() {
59
100
  const context = React2__namespace.useContext(CarouselContext);
@@ -666,13 +707,17 @@ function HeroDesignCarouselPortfolio({
666
707
  const renderLogo = React2.useMemo(() => {
667
708
  if (logoSlot) return logoSlot;
668
709
  if (!logo) return null;
669
- const logoSrc = typeof logo.src === "string" ? logo.src : logo.src.light;
710
+ const logoConfig = {
711
+ src: typeof logo.src === "string" ? logo.src : logo.src.light,
712
+ alt: logo.alt,
713
+ className: logo.className,
714
+ url: logo.href
715
+ };
670
716
  return /* @__PURE__ */ jsxRuntime.jsx(
671
- img.Img,
717
+ BrandLogo,
672
718
  {
673
- src: logoSrc,
674
- className: cn("object-contain w-auto h-12 lg:h-16", logo.className),
675
- alt: logo.alt,
719
+ logo: logoConfig,
720
+ size: "xl",
676
721
  optixFlowConfig
677
722
  }
678
723
  );
@@ -7,9 +7,9 @@ import { clsx } from 'clsx';
7
7
  import { twMerge } from 'tailwind-merge';
8
8
  import { Icon } from '@page-speed/icon';
9
9
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
10
+ import { Pressable, buttonVariants } from '@page-speed/pressable';
10
11
  import { Img } from '@page-speed/img';
11
12
  import useEmblaCarousel from 'embla-carousel-react';
12
- import { Pressable, buttonVariants } from '@page-speed/pressable';
13
13
 
14
14
  // components/blocks/hero/hero-design-carousel-portfolio.tsx
15
15
  function cn(...inputs) {
@@ -28,6 +28,47 @@ var DynamicIcon = React2.memo(function DynamicIcon2({
28
28
  return /* @__PURE__ */ jsx(Icon, { ...props, name, apiKey: apiKey ?? DEFAULT_ICON_API_KEY });
29
29
  });
30
30
  DynamicIcon.displayName = "DynamicIcon";
31
+ var SIZE_CLASSES = {
32
+ sm: "max-h-6 sm:max-h-7",
33
+ md: "max-h-8 sm:max-h-9 lg:max-h-10",
34
+ lg: "max-h-10 sm:max-h-12 lg:max-h-14",
35
+ xl: "max-h-12 sm:max-h-14 lg:max-h-16"
36
+ };
37
+ var BrandLogo = ({
38
+ logo,
39
+ logoSlot,
40
+ logoClassName,
41
+ size = "md",
42
+ optixFlowConfig
43
+ }) => {
44
+ if (logoSlot) return /* @__PURE__ */ jsx(Fragment, { children: logoSlot });
45
+ if (!logo || !logo.src) return null;
46
+ const imgElement = /* @__PURE__ */ jsx(
47
+ Img,
48
+ {
49
+ src: logo.src,
50
+ className: cn(
51
+ "w-auto object-contain",
52
+ SIZE_CLASSES[size],
53
+ logo.className
54
+ ),
55
+ alt: logo.alt || "Logo",
56
+ optixFlowConfig,
57
+ loading: "eager"
58
+ }
59
+ );
60
+ if (logo.url) {
61
+ return /* @__PURE__ */ jsx(
62
+ Pressable,
63
+ {
64
+ href: logo.url,
65
+ className: cn("flex items-center", logoClassName),
66
+ children: imgElement
67
+ }
68
+ );
69
+ }
70
+ return /* @__PURE__ */ jsx("div", { className: cn("flex items-center", logoClassName), children: imgElement });
71
+ };
31
72
  var CarouselContext = React2.createContext(null);
32
73
  function useCarousel() {
33
74
  const context = React2.useContext(CarouselContext);
@@ -640,13 +681,17 @@ function HeroDesignCarouselPortfolio({
640
681
  const renderLogo = useMemo(() => {
641
682
  if (logoSlot) return logoSlot;
642
683
  if (!logo) return null;
643
- const logoSrc = typeof logo.src === "string" ? logo.src : logo.src.light;
684
+ const logoConfig = {
685
+ src: typeof logo.src === "string" ? logo.src : logo.src.light,
686
+ alt: logo.alt,
687
+ className: logo.className,
688
+ url: logo.href
689
+ };
644
690
  return /* @__PURE__ */ jsx(
645
- Img,
691
+ BrandLogo,
646
692
  {
647
- src: logoSrc,
648
- className: cn("object-contain w-auto h-12 lg:h-16", logo.className),
649
- alt: logo.alt,
693
+ logo: logoConfig,
694
+ size: "xl",
650
695
  optixFlowConfig
651
696
  }
652
697
  );