@opensite/ui 1.8.2 → 1.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/dist/about-story-gallery.cjs +3 -30
  2. package/dist/about-story-gallery.d.cts +1 -1
  3. package/dist/about-story-gallery.d.ts +1 -1
  4. package/dist/about-story-gallery.js +3 -30
  5. package/dist/components.d.cts +1 -1
  6. package/dist/components.d.ts +1 -1
  7. package/dist/contact-callback.cjs +526 -273
  8. package/dist/contact-callback.d.cts +39 -59
  9. package/dist/contact-callback.d.ts +39 -59
  10. package/dist/contact-callback.js +528 -274
  11. package/dist/contact-card.cjs +459 -183
  12. package/dist/contact-card.d.cts +26 -49
  13. package/dist/contact-card.d.ts +26 -49
  14. package/dist/contact-card.js +461 -183
  15. package/dist/contact-careers.cjs +614 -510
  16. package/dist/contact-careers.d.cts +32 -55
  17. package/dist/contact-careers.d.ts +32 -55
  18. package/dist/contact-careers.js +616 -510
  19. package/dist/contact-catering.cjs +507 -501
  20. package/dist/contact-catering.d.cts +27 -61
  21. package/dist/contact-catering.d.ts +27 -61
  22. package/dist/contact-catering.js +509 -500
  23. package/dist/contact-consultation.cjs +484 -253
  24. package/dist/contact-consultation.d.cts +29 -56
  25. package/dist/contact-consultation.d.ts +29 -56
  26. package/dist/contact-consultation.js +486 -253
  27. package/dist/contact-dark.cjs +296 -296
  28. package/dist/contact-dark.d.cts +1 -1
  29. package/dist/contact-dark.d.ts +1 -1
  30. package/dist/contact-dark.js +297 -296
  31. package/dist/contact-demo.d.cts +1 -1
  32. package/dist/contact-demo.d.ts +1 -1
  33. package/dist/contact-emergency.d.cts +1 -1
  34. package/dist/contact-emergency.d.ts +1 -1
  35. package/dist/contact-event.d.cts +1 -1
  36. package/dist/contact-event.d.ts +1 -1
  37. package/dist/contact-faq.cjs +247 -250
  38. package/dist/contact-faq.d.cts +1 -1
  39. package/dist/contact-faq.d.ts +1 -1
  40. package/dist/contact-faq.js +248 -250
  41. package/dist/contact-feedback.d.cts +1 -1
  42. package/dist/contact-feedback.d.ts +1 -1
  43. package/dist/contact-fitness.d.cts +1 -1
  44. package/dist/contact-fitness.d.ts +1 -1
  45. package/dist/contact-guest.d.cts +1 -1
  46. package/dist/contact-guest.d.ts +1 -1
  47. package/dist/contact-image.d.cts +1 -1
  48. package/dist/contact-image.d.ts +1 -1
  49. package/dist/contact-insurance.d.cts +1 -1
  50. package/dist/contact-insurance.d.ts +1 -1
  51. package/dist/contact-interview.d.cts +1 -1
  52. package/dist/contact-interview.d.ts +1 -1
  53. package/dist/contact-locations.d.cts +1 -1
  54. package/dist/contact-locations.d.ts +1 -1
  55. package/dist/contact-maintenance.d.cts +1 -1
  56. package/dist/contact-maintenance.d.ts +1 -1
  57. package/dist/contact-map.d.cts +1 -1
  58. package/dist/contact-map.d.ts +1 -1
  59. package/dist/contact-minimal.d.cts +1 -1
  60. package/dist/contact-minimal.d.ts +1 -1
  61. package/dist/contact-moving.d.cts +1 -1
  62. package/dist/contact-moving.d.ts +1 -1
  63. package/dist/contact-multistep.d.cts +1 -1
  64. package/dist/contact-multistep.d.ts +1 -1
  65. package/dist/contact-partnership.d.cts +1 -1
  66. package/dist/contact-partnership.d.ts +1 -1
  67. package/dist/contact-photography.cjs +247 -250
  68. package/dist/contact-photography.d.cts +1 -1
  69. package/dist/contact-photography.d.ts +1 -1
  70. package/dist/contact-photography.js +248 -250
  71. package/dist/contact-press.d.cts +1 -1
  72. package/dist/contact-press.d.ts +1 -1
  73. package/dist/contact-quote.d.cts +1 -1
  74. package/dist/contact-quote.d.ts +1 -1
  75. package/dist/contact-referral.d.cts +1 -1
  76. package/dist/contact-referral.d.ts +1 -1
  77. package/dist/contact-report.d.cts +1 -1
  78. package/dist/contact-report.d.ts +1 -1
  79. package/dist/contact-reservation.d.cts +1 -1
  80. package/dist/contact-reservation.d.ts +1 -1
  81. package/dist/contact-retreat.d.cts +1 -1
  82. package/dist/contact-retreat.d.ts +1 -1
  83. package/dist/contact-rsvp.d.cts +1 -1
  84. package/dist/contact-rsvp.d.ts +1 -1
  85. package/dist/contact-sales.d.cts +1 -1
  86. package/dist/contact-sales.d.ts +1 -1
  87. package/dist/contact-schedule.d.cts +1 -1
  88. package/dist/contact-schedule.d.ts +1 -1
  89. package/dist/contact-sponsorship.d.cts +1 -1
  90. package/dist/contact-sponsorship.d.ts +1 -1
  91. package/dist/contact-support.d.cts +1 -1
  92. package/dist/contact-support.d.ts +1 -1
  93. package/dist/contact-tenant.d.cts +1 -1
  94. package/dist/contact-tenant.d.ts +1 -1
  95. package/dist/contact-vendor.d.cts +1 -1
  96. package/dist/contact-vendor.d.ts +1 -1
  97. package/dist/contact-volunteer.d.cts +1 -1
  98. package/dist/contact-volunteer.d.ts +1 -1
  99. package/dist/contact-warranty.d.cts +1 -1
  100. package/dist/contact-warranty.d.ts +1 -1
  101. package/dist/contact-wedding.d.cts +1 -1
  102. package/dist/contact-wedding.d.ts +1 -1
  103. package/dist/cta-app-download-newsletter.d.cts +1 -1
  104. package/dist/cta-app-download-newsletter.d.ts +1 -1
  105. package/dist/cta-newsletter-features.d.cts +1 -1
  106. package/dist/cta-newsletter-features.d.ts +1 -1
  107. package/dist/footer-accordion-social.d.cts +1 -1
  108. package/dist/footer-accordion-social.d.ts +1 -1
  109. package/dist/footer-newsletter-contact.d.cts +1 -1
  110. package/dist/footer-newsletter-contact.d.ts +1 -1
  111. package/dist/footer-newsletter-minimal.d.cts +1 -1
  112. package/dist/footer-newsletter-minimal.d.ts +1 -1
  113. package/dist/footer-split-image-accordion.d.cts +1 -1
  114. package/dist/footer-split-image-accordion.d.ts +1 -1
  115. package/dist/{forms-nGgHUTBw.d.cts → forms-CStlFhnh.d.cts} +41 -0
  116. package/dist/{forms-nGgHUTBw.d.ts → forms-CStlFhnh.d.ts} +41 -0
  117. package/dist/hero-conversation-intelligence.cjs +1 -2
  118. package/dist/hero-conversation-intelligence.d.cts +1 -5
  119. package/dist/hero-conversation-intelligence.d.ts +1 -5
  120. package/dist/hero-conversation-intelligence.js +1 -2
  121. package/dist/hero-conversion-video-play.cjs +2 -2
  122. package/dist/hero-conversion-video-play.js +2 -2
  123. package/dist/hero-design-system-3d.cjs +162 -82
  124. package/dist/hero-design-system-3d.js +162 -82
  125. package/dist/hero-ecommerce-product-showcase.cjs +103 -81
  126. package/dist/hero-ecommerce-product-showcase.d.cts +5 -1
  127. package/dist/hero-ecommerce-product-showcase.d.ts +5 -1
  128. package/dist/hero-ecommerce-product-showcase.js +103 -81
  129. package/dist/hero-floating-images.cjs +1 -1
  130. package/dist/hero-floating-images.js +1 -1
  131. package/dist/hero-hiring-animated-text.cjs +4 -4
  132. package/dist/hero-hiring-animated-text.js +4 -4
  133. package/dist/hero-minimal-centered-dark.cjs +111 -82
  134. package/dist/hero-minimal-centered-dark.d.cts +1 -1
  135. package/dist/hero-minimal-centered-dark.d.ts +1 -1
  136. package/dist/hero-minimal-centered-dark.js +111 -82
  137. package/dist/hero-mobile-app-download.cjs +1 -1
  138. package/dist/hero-mobile-app-download.js +1 -1
  139. package/dist/hero-overlay-cta-grid.cjs +1 -1
  140. package/dist/hero-overlay-cta-grid.js +1 -1
  141. package/dist/hero-spiral-pattern-cards.cjs +1 -1
  142. package/dist/hero-spiral-pattern-cards.js +1 -1
  143. package/dist/hero-startup-launch-cta.cjs +1 -1
  144. package/dist/hero-startup-launch-cta.js +1 -1
  145. package/dist/hero-stats-social-proof.cjs +106 -90
  146. package/dist/hero-stats-social-proof.js +106 -90
  147. package/dist/hero-testimonial-image-grid.cjs +1 -1
  148. package/dist/hero-testimonial-image-grid.js +1 -1
  149. package/dist/hero-therapy-testimonial-grid.cjs +1 -1
  150. package/dist/hero-therapy-testimonial-grid.js +1 -1
  151. package/dist/hero-ui-library-showcase.cjs +63 -15
  152. package/dist/hero-ui-library-showcase.d.cts +5 -1
  153. package/dist/hero-ui-library-showcase.d.ts +5 -1
  154. package/dist/hero-ui-library-showcase.js +63 -15
  155. package/dist/index.cjs +44 -6
  156. package/dist/index.d.cts +3 -2
  157. package/dist/index.d.ts +3 -2
  158. package/dist/index.js +44 -6
  159. package/dist/link-page-newsletter-social.d.cts +1 -1
  160. package/dist/link-page-newsletter-social.d.ts +1 -1
  161. package/dist/offer-modal-membership-image.d.cts +1 -1
  162. package/dist/offer-modal-membership-image.d.ts +1 -1
  163. package/dist/offer-modal-newsletter-discount.d.cts +1 -1
  164. package/dist/offer-modal-newsletter-discount.d.ts +1 -1
  165. package/dist/offer-modal-sheet-newsletter.d.cts +1 -1
  166. package/dist/offer-modal-sheet-newsletter.d.ts +1 -1
  167. package/dist/registry.cjs +14465 -14767
  168. package/dist/registry.js +12664 -12966
  169. package/dist/resource-list-hero-filter.d.cts +1 -1
  170. package/dist/resource-list-hero-filter.d.ts +1 -1
  171. package/package.json +3 -3
@@ -7,6 +7,7 @@ var tailwindMerge = require('tailwind-merge');
7
7
  var classVarianceAuthority = require('class-variance-authority');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
  var img = require('@page-speed/img');
10
+ var reactSlot = require('@radix-ui/react-slot');
10
11
 
11
12
  function _interopNamespace(e) {
12
13
  if (e && e.__esModule) return e;
@@ -32,62 +33,6 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
32
33
  function cn(...inputs) {
33
34
  return tailwindMerge.twMerge(clsx.clsx(inputs));
34
35
  }
35
- function getNestedCardBg(parentBg, variant = "muted", options) {
36
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
37
- if (isDark) {
38
- switch (variant) {
39
- case "muted":
40
- return "bg-background";
41
- case "card":
42
- return "bg-card";
43
- case "accent":
44
- return "bg-accent";
45
- case "subtle":
46
- return "bg-background/50";
47
- }
48
- } else {
49
- switch (variant) {
50
- case "muted":
51
- return "bg-muted";
52
- case "card":
53
- return "bg-card";
54
- case "accent":
55
- return "bg-accent";
56
- case "subtle":
57
- return "bg-muted/50";
58
- }
59
- }
60
- }
61
- function getNestedCardTextColor(parentBg, options) {
62
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
63
- return isDark ? "text-foreground" : "";
64
- }
65
- function getTextColor(parentBg, variant = "default", options) {
66
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
67
- if (isDark) {
68
- switch (variant) {
69
- case "default":
70
- return "text-foreground";
71
- case "muted":
72
- return "text-foreground/80";
73
- case "subtle":
74
- return "text-foreground/60";
75
- case "accent":
76
- return "text-accent-foreground";
77
- }
78
- } else {
79
- switch (variant) {
80
- case "default":
81
- return "text-foreground";
82
- case "muted":
83
- return "text-muted-foreground";
84
- case "subtle":
85
- return "text-muted-foreground/70";
86
- case "accent":
87
- return "text-primary";
88
- }
89
- }
90
- }
91
36
  function normalizePhoneNumber(input) {
92
37
  const trimmed = input.trim();
93
38
  if (trimmed.toLowerCase().startsWith("tel:")) {
@@ -986,6 +931,38 @@ var Section = React__namespace.default.forwardRef(
986
931
  }
987
932
  );
988
933
  Section.displayName = "Section";
934
+ var badgeVariants = classVarianceAuthority.cva(
935
+ "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",
936
+ {
937
+ variants: {
938
+ variant: {
939
+ default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
940
+ secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
941
+ 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",
942
+ outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
943
+ }
944
+ },
945
+ defaultVariants: {
946
+ variant: "default"
947
+ }
948
+ }
949
+ );
950
+ function Badge({
951
+ className,
952
+ variant,
953
+ asChild = false,
954
+ ...props
955
+ }) {
956
+ const Comp = asChild ? reactSlot.Slot : "span";
957
+ return /* @__PURE__ */ jsxRuntime.jsx(
958
+ Comp,
959
+ {
960
+ "data-slot": "badge",
961
+ className: cn(badgeVariants({ variant }), className),
962
+ ...props
963
+ }
964
+ );
965
+ }
989
966
  function HeroEcommerceProductShowcase({
990
967
  badgeText,
991
968
  badgeIcon,
@@ -999,11 +976,12 @@ function HeroEcommerceProductShowcase({
999
976
  images,
1000
977
  imagesSlot,
1001
978
  background,
1002
- spacing,
979
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
980
+ spacing = "py-32 md:py-32",
1003
981
  pattern,
1004
982
  patternOpacity,
983
+ patternClassName,
1005
984
  className,
1006
- containerClassName,
1007
985
  contentClassName,
1008
986
  headingClassName,
1009
987
  descriptionClassName,
@@ -1014,11 +992,7 @@ function HeroEcommerceProductShowcase({
1014
992
  }) {
1015
993
  const renderBadge = React.useMemo(() => {
1016
994
  if (badgeSlot) return badgeSlot;
1017
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(
1018
- "inline-flex w-fit items-center gap-2 rounded-full px-4 py-2 text-sm font-medium",
1019
- getNestedCardBg(background, "accent"),
1020
- getNestedCardTextColor(background)
1021
- ), children: [
995
+ return /* @__PURE__ */ jsxRuntime.jsxs(Badge, { className: cn("px-4 py-2"), children: [
1022
996
  badgeIcon && /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: badgeIcon, size: 16 }),
1023
997
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: badgeText })
1024
998
  ] });
@@ -1027,7 +1001,14 @@ function HeroEcommerceProductShowcase({
1027
1001
  if (actionsSlot) return actionsSlot;
1028
1002
  if (!actions || actions.length === 0) return null;
1029
1003
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col gap-4 sm:flex-row", actionsClassName), children: actions.map((action, index) => {
1030
- const { label, icon, iconAfter, children, className: actionClassName, ...pressableProps } = action;
1004
+ const {
1005
+ label,
1006
+ icon,
1007
+ iconAfter,
1008
+ children,
1009
+ className: actionClassName,
1010
+ ...pressableProps
1011
+ } = action;
1031
1012
  return /* @__PURE__ */ jsxRuntime.jsx(
1032
1013
  Pressable,
1033
1014
  {
@@ -1051,7 +1032,7 @@ function HeroEcommerceProductShowcase({
1051
1032
  index > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-12 w-px bg-border" }),
1052
1033
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
1053
1034
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-2xl font-bold ", children: stat.value }),
1054
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-sm", getTextColor(background, "muted")), children: stat.label })
1035
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("text-sm"), children: stat.label })
1055
1036
  ] })
1056
1037
  ] }, index)) });
1057
1038
  }, [statsSlot, stats, statsClassName]);
@@ -1060,41 +1041,53 @@ function HeroEcommerceProductShowcase({
1060
1041
  if (!images || images.length === 0) return null;
1061
1042
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("grid grid-cols-2 gap-4", imagesClassName), children: [
1062
1043
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
1063
- images[0] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("overflow-hidden rounded-2xl", getNestedCardBg(background, "muted")), children: /* @__PURE__ */ jsxRuntime.jsx(
1044
+ images[0] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("overflow-hidden rounded-2xl"), children: /* @__PURE__ */ jsxRuntime.jsx(
1064
1045
  img.Img,
1065
1046
  {
1066
1047
  src: images[0].src,
1067
1048
  alt: images[0].alt,
1068
- className: cn("aspect-3/4 w-full object-cover", images[0].className),
1049
+ className: cn(
1050
+ "aspect-3/4 w-full object-cover",
1051
+ images[0].className
1052
+ ),
1069
1053
  optixFlowConfig
1070
1054
  }
1071
1055
  ) }),
1072
- images[1] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("overflow-hidden rounded-2xl", getNestedCardBg(background, "muted")), children: /* @__PURE__ */ jsxRuntime.jsx(
1056
+ images[1] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("overflow-hidden rounded-2xl"), children: /* @__PURE__ */ jsxRuntime.jsx(
1073
1057
  img.Img,
1074
1058
  {
1075
1059
  src: images[1].src,
1076
1060
  alt: images[1].alt,
1077
- className: cn("aspect-square w-full object-cover", images[1].className),
1061
+ className: cn(
1062
+ "aspect-square w-full object-cover",
1063
+ images[1].className
1064
+ ),
1078
1065
  optixFlowConfig
1079
1066
  }
1080
1067
  ) })
1081
1068
  ] }),
1082
1069
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4 pt-8", children: [
1083
- images[2] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("overflow-hidden rounded-2xl", getNestedCardBg(background, "muted")), children: /* @__PURE__ */ jsxRuntime.jsx(
1070
+ images[2] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("overflow-hidden rounded-2xl"), children: /* @__PURE__ */ jsxRuntime.jsx(
1084
1071
  img.Img,
1085
1072
  {
1086
1073
  src: images[2].src,
1087
1074
  alt: images[2].alt,
1088
- className: cn("aspect-square w-full object-cover", images[2].className),
1075
+ className: cn(
1076
+ "aspect-square w-full object-cover",
1077
+ images[2].className
1078
+ ),
1089
1079
  optixFlowConfig
1090
1080
  }
1091
1081
  ) }),
1092
- images[3] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("overflow-hidden rounded-2xl", getNestedCardBg(background, "muted")), children: /* @__PURE__ */ jsxRuntime.jsx(
1082
+ images[3] && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("overflow-hidden rounded-2xl"), children: /* @__PURE__ */ jsxRuntime.jsx(
1093
1083
  img.Img,
1094
1084
  {
1095
1085
  src: images[3].src,
1096
1086
  alt: images[3].alt,
1097
- className: cn("aspect-3/4 w-full object-cover", images[3].className),
1087
+ className: cn(
1088
+ "aspect-3/4 w-full object-cover",
1089
+ images[3].className
1090
+ ),
1098
1091
  optixFlowConfig
1099
1092
  }
1100
1093
  ) })
@@ -1108,16 +1101,45 @@ function HeroEcommerceProductShowcase({
1108
1101
  spacing,
1109
1102
  pattern,
1110
1103
  patternOpacity,
1104
+ patternClassName,
1111
1105
  className,
1112
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("container", containerClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid items-center gap-12 lg:grid-cols-2 lg:gap-20", children: [
1106
+ containerClassName,
1107
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid items-center gap-12 lg:grid-cols-2 lg:gap-20", children: [
1113
1108
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "order-2 lg:order-1", children: renderImages }),
1114
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("order-1 flex flex-col gap-8 lg:order-2", contentClassName), children: [
1115
- renderBadge,
1116
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h1", { className: cn("text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl", headingClassName), children: heading }) : /* @__PURE__ */ jsxRuntime.jsx("h1", { className: cn("text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl", headingClassName), children: heading })),
1117
- description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-lg", getTextColor(background, "muted"), descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description })),
1118
- renderActions,
1119
- renderStats
1120
- ] })
1109
+ /* @__PURE__ */ jsxRuntime.jsxs(
1110
+ "div",
1111
+ {
1112
+ className: cn(
1113
+ "order-1 flex flex-col gap-8 lg:order-2",
1114
+ contentClassName
1115
+ ),
1116
+ children: [
1117
+ renderBadge,
1118
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1119
+ "h1",
1120
+ {
1121
+ className: cn(
1122
+ "text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl text-balance",
1123
+ headingClassName
1124
+ ),
1125
+ children: heading
1126
+ }
1127
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1128
+ "h1",
1129
+ {
1130
+ className: cn(
1131
+ "text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl text-balance",
1132
+ headingClassName
1133
+ ),
1134
+ children: heading
1135
+ }
1136
+ )),
1137
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-lg text-balance", descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description })),
1138
+ renderActions,
1139
+ renderStats
1140
+ ]
1141
+ }
1142
+ )
1121
1143
  ] }) })
1122
1144
  }
1123
1145
  );
@@ -67,6 +67,10 @@ interface HeroEcommerceProductShowcaseProps {
67
67
  * Pattern overlay opacity (0-1)
68
68
  */
69
69
  patternOpacity?: number;
70
+ /**
71
+ * Additional CSS classes for the pattern overlay
72
+ */
73
+ patternClassName?: string;
70
74
  /**
71
75
  * Additional CSS classes for the section
72
76
  */
@@ -104,6 +108,6 @@ interface HeroEcommerceProductShowcaseProps {
104
108
  */
105
109
  optixFlowConfig?: OptixFlowConfig;
106
110
  }
107
- declare function HeroEcommerceProductShowcase({ badgeText, badgeIcon, badgeSlot, heading, description, actions, actionsSlot, stats, statsSlot, images, imagesSlot, background, spacing, pattern, patternOpacity, className, containerClassName, contentClassName, headingClassName, descriptionClassName, actionsClassName, statsClassName, imagesClassName, optixFlowConfig, }: HeroEcommerceProductShowcaseProps): React.JSX.Element;
111
+ declare function HeroEcommerceProductShowcase({ badgeText, badgeIcon, badgeSlot, heading, description, actions, actionsSlot, stats, statsSlot, images, imagesSlot, background, containerClassName, spacing, pattern, patternOpacity, patternClassName, className, contentClassName, headingClassName, descriptionClassName, actionsClassName, statsClassName, imagesClassName, optixFlowConfig, }: HeroEcommerceProductShowcaseProps): React.JSX.Element;
108
112
 
109
113
  export { HeroEcommerceProductShowcase, type HeroEcommerceProductShowcaseProps };
@@ -67,6 +67,10 @@ interface HeroEcommerceProductShowcaseProps {
67
67
  * Pattern overlay opacity (0-1)
68
68
  */
69
69
  patternOpacity?: number;
70
+ /**
71
+ * Additional CSS classes for the pattern overlay
72
+ */
73
+ patternClassName?: string;
70
74
  /**
71
75
  * Additional CSS classes for the section
72
76
  */
@@ -104,6 +108,6 @@ interface HeroEcommerceProductShowcaseProps {
104
108
  */
105
109
  optixFlowConfig?: OptixFlowConfig;
106
110
  }
107
- declare function HeroEcommerceProductShowcase({ badgeText, badgeIcon, badgeSlot, heading, description, actions, actionsSlot, stats, statsSlot, images, imagesSlot, background, spacing, pattern, patternOpacity, className, containerClassName, contentClassName, headingClassName, descriptionClassName, actionsClassName, statsClassName, imagesClassName, optixFlowConfig, }: HeroEcommerceProductShowcaseProps): React.JSX.Element;
111
+ declare function HeroEcommerceProductShowcase({ badgeText, badgeIcon, badgeSlot, heading, description, actions, actionsSlot, stats, statsSlot, images, imagesSlot, background, containerClassName, spacing, pattern, patternOpacity, patternClassName, className, contentClassName, headingClassName, descriptionClassName, actionsClassName, statsClassName, imagesClassName, optixFlowConfig, }: HeroEcommerceProductShowcaseProps): React.JSX.Element;
108
112
 
109
113
  export { HeroEcommerceProductShowcase, type HeroEcommerceProductShowcaseProps };
@@ -6,67 +6,12 @@ import { twMerge } from 'tailwind-merge';
6
6
  import { cva } from 'class-variance-authority';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
8
  import { Img } from '@page-speed/img';
9
+ import { Slot } from '@radix-ui/react-slot';
9
10
 
10
11
  // components/blocks/hero/hero-ecommerce-product-showcase.tsx
11
12
  function cn(...inputs) {
12
13
  return twMerge(clsx(inputs));
13
14
  }
14
- function getNestedCardBg(parentBg, variant = "muted", options) {
15
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
16
- if (isDark) {
17
- switch (variant) {
18
- case "muted":
19
- return "bg-background";
20
- case "card":
21
- return "bg-card";
22
- case "accent":
23
- return "bg-accent";
24
- case "subtle":
25
- return "bg-background/50";
26
- }
27
- } else {
28
- switch (variant) {
29
- case "muted":
30
- return "bg-muted";
31
- case "card":
32
- return "bg-card";
33
- case "accent":
34
- return "bg-accent";
35
- case "subtle":
36
- return "bg-muted/50";
37
- }
38
- }
39
- }
40
- function getNestedCardTextColor(parentBg, options) {
41
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
42
- return isDark ? "text-foreground" : "";
43
- }
44
- function getTextColor(parentBg, variant = "default", options) {
45
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
46
- if (isDark) {
47
- switch (variant) {
48
- case "default":
49
- return "text-foreground";
50
- case "muted":
51
- return "text-foreground/80";
52
- case "subtle":
53
- return "text-foreground/60";
54
- case "accent":
55
- return "text-accent-foreground";
56
- }
57
- } else {
58
- switch (variant) {
59
- case "default":
60
- return "text-foreground";
61
- case "muted":
62
- return "text-muted-foreground";
63
- case "subtle":
64
- return "text-muted-foreground/70";
65
- case "accent":
66
- return "text-primary";
67
- }
68
- }
69
- }
70
15
  function normalizePhoneNumber(input) {
71
16
  const trimmed = input.trim();
72
17
  if (trimmed.toLowerCase().startsWith("tel:")) {
@@ -965,6 +910,38 @@ var Section = React__default.forwardRef(
965
910
  }
966
911
  );
967
912
  Section.displayName = "Section";
913
+ var badgeVariants = cva(
914
+ "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",
915
+ {
916
+ variants: {
917
+ variant: {
918
+ default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
919
+ secondary: "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
920
+ 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",
921
+ outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
922
+ }
923
+ },
924
+ defaultVariants: {
925
+ variant: "default"
926
+ }
927
+ }
928
+ );
929
+ function Badge({
930
+ className,
931
+ variant,
932
+ asChild = false,
933
+ ...props
934
+ }) {
935
+ const Comp = asChild ? Slot : "span";
936
+ return /* @__PURE__ */ jsx(
937
+ Comp,
938
+ {
939
+ "data-slot": "badge",
940
+ className: cn(badgeVariants({ variant }), className),
941
+ ...props
942
+ }
943
+ );
944
+ }
968
945
  function HeroEcommerceProductShowcase({
969
946
  badgeText,
970
947
  badgeIcon,
@@ -978,11 +955,12 @@ function HeroEcommerceProductShowcase({
978
955
  images,
979
956
  imagesSlot,
980
957
  background,
981
- spacing,
958
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
959
+ spacing = "py-32 md:py-32",
982
960
  pattern,
983
961
  patternOpacity,
962
+ patternClassName,
984
963
  className,
985
- containerClassName,
986
964
  contentClassName,
987
965
  headingClassName,
988
966
  descriptionClassName,
@@ -993,11 +971,7 @@ function HeroEcommerceProductShowcase({
993
971
  }) {
994
972
  const renderBadge = useMemo(() => {
995
973
  if (badgeSlot) return badgeSlot;
996
- return /* @__PURE__ */ jsxs("div", { className: cn(
997
- "inline-flex w-fit items-center gap-2 rounded-full px-4 py-2 text-sm font-medium",
998
- getNestedCardBg(background, "accent"),
999
- getNestedCardTextColor(background)
1000
- ), children: [
974
+ return /* @__PURE__ */ jsxs(Badge, { className: cn("px-4 py-2"), children: [
1001
975
  badgeIcon && /* @__PURE__ */ jsx(DynamicIcon, { name: badgeIcon, size: 16 }),
1002
976
  /* @__PURE__ */ jsx("span", { children: badgeText })
1003
977
  ] });
@@ -1006,7 +980,14 @@ function HeroEcommerceProductShowcase({
1006
980
  if (actionsSlot) return actionsSlot;
1007
981
  if (!actions || actions.length === 0) return null;
1008
982
  return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col gap-4 sm:flex-row", actionsClassName), children: actions.map((action, index) => {
1009
- const { label, icon, iconAfter, children, className: actionClassName, ...pressableProps } = action;
983
+ const {
984
+ label,
985
+ icon,
986
+ iconAfter,
987
+ children,
988
+ className: actionClassName,
989
+ ...pressableProps
990
+ } = action;
1010
991
  return /* @__PURE__ */ jsx(
1011
992
  Pressable,
1012
993
  {
@@ -1030,7 +1011,7 @@ function HeroEcommerceProductShowcase({
1030
1011
  index > 0 && /* @__PURE__ */ jsx("div", { className: "h-12 w-px bg-border" }),
1031
1012
  /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
1032
1013
  /* @__PURE__ */ jsx("div", { className: "text-2xl font-bold ", children: stat.value }),
1033
- /* @__PURE__ */ jsx("div", { className: cn("text-sm", getTextColor(background, "muted")), children: stat.label })
1014
+ /* @__PURE__ */ jsx("div", { className: cn("text-sm"), children: stat.label })
1034
1015
  ] })
1035
1016
  ] }, index)) });
1036
1017
  }, [statsSlot, stats, statsClassName]);
@@ -1039,41 +1020,53 @@ function HeroEcommerceProductShowcase({
1039
1020
  if (!images || images.length === 0) return null;
1040
1021
  return /* @__PURE__ */ jsxs("div", { className: cn("grid grid-cols-2 gap-4", imagesClassName), children: [
1041
1022
  /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
1042
- images[0] && /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-2xl", getNestedCardBg(background, "muted")), children: /* @__PURE__ */ jsx(
1023
+ images[0] && /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-2xl"), children: /* @__PURE__ */ jsx(
1043
1024
  Img,
1044
1025
  {
1045
1026
  src: images[0].src,
1046
1027
  alt: images[0].alt,
1047
- className: cn("aspect-3/4 w-full object-cover", images[0].className),
1028
+ className: cn(
1029
+ "aspect-3/4 w-full object-cover",
1030
+ images[0].className
1031
+ ),
1048
1032
  optixFlowConfig
1049
1033
  }
1050
1034
  ) }),
1051
- images[1] && /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-2xl", getNestedCardBg(background, "muted")), children: /* @__PURE__ */ jsx(
1035
+ images[1] && /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-2xl"), children: /* @__PURE__ */ jsx(
1052
1036
  Img,
1053
1037
  {
1054
1038
  src: images[1].src,
1055
1039
  alt: images[1].alt,
1056
- className: cn("aspect-square w-full object-cover", images[1].className),
1040
+ className: cn(
1041
+ "aspect-square w-full object-cover",
1042
+ images[1].className
1043
+ ),
1057
1044
  optixFlowConfig
1058
1045
  }
1059
1046
  ) })
1060
1047
  ] }),
1061
1048
  /* @__PURE__ */ jsxs("div", { className: "space-y-4 pt-8", children: [
1062
- images[2] && /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-2xl", getNestedCardBg(background, "muted")), children: /* @__PURE__ */ jsx(
1049
+ images[2] && /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-2xl"), children: /* @__PURE__ */ jsx(
1063
1050
  Img,
1064
1051
  {
1065
1052
  src: images[2].src,
1066
1053
  alt: images[2].alt,
1067
- className: cn("aspect-square w-full object-cover", images[2].className),
1054
+ className: cn(
1055
+ "aspect-square w-full object-cover",
1056
+ images[2].className
1057
+ ),
1068
1058
  optixFlowConfig
1069
1059
  }
1070
1060
  ) }),
1071
- images[3] && /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-2xl", getNestedCardBg(background, "muted")), children: /* @__PURE__ */ jsx(
1061
+ images[3] && /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden rounded-2xl"), children: /* @__PURE__ */ jsx(
1072
1062
  Img,
1073
1063
  {
1074
1064
  src: images[3].src,
1075
1065
  alt: images[3].alt,
1076
- className: cn("aspect-3/4 w-full object-cover", images[3].className),
1066
+ className: cn(
1067
+ "aspect-3/4 w-full object-cover",
1068
+ images[3].className
1069
+ ),
1077
1070
  optixFlowConfig
1078
1071
  }
1079
1072
  ) })
@@ -1087,16 +1080,45 @@ function HeroEcommerceProductShowcase({
1087
1080
  spacing,
1088
1081
  pattern,
1089
1082
  patternOpacity,
1083
+ patternClassName,
1090
1084
  className,
1091
- children: /* @__PURE__ */ jsx("div", { className: cn("container", containerClassName), children: /* @__PURE__ */ jsxs("div", { className: "grid items-center gap-12 lg:grid-cols-2 lg:gap-20", children: [
1085
+ containerClassName,
1086
+ children: /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsxs("div", { className: "grid items-center gap-12 lg:grid-cols-2 lg:gap-20", children: [
1092
1087
  /* @__PURE__ */ jsx("div", { className: "order-2 lg:order-1", children: renderImages }),
1093
- /* @__PURE__ */ jsxs("div", { className: cn("order-1 flex flex-col gap-8 lg:order-2", contentClassName), children: [
1094
- renderBadge,
1095
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsx("h1", { className: cn("text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl", headingClassName), children: heading }) : /* @__PURE__ */ jsx("h1", { className: cn("text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl", headingClassName), children: heading })),
1096
- description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-lg", getTextColor(background, "muted"), descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description })),
1097
- renderActions,
1098
- renderStats
1099
- ] })
1088
+ /* @__PURE__ */ jsxs(
1089
+ "div",
1090
+ {
1091
+ className: cn(
1092
+ "order-1 flex flex-col gap-8 lg:order-2",
1093
+ contentClassName
1094
+ ),
1095
+ children: [
1096
+ renderBadge,
1097
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
1098
+ "h1",
1099
+ {
1100
+ className: cn(
1101
+ "text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl text-balance",
1102
+ headingClassName
1103
+ ),
1104
+ children: heading
1105
+ }
1106
+ ) : /* @__PURE__ */ jsx(
1107
+ "h1",
1108
+ {
1109
+ className: cn(
1110
+ "text-4xl font-bold tracking-tight md:text-5xl lg:text-6xl text-balance",
1111
+ headingClassName
1112
+ ),
1113
+ children: heading
1114
+ }
1115
+ )),
1116
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-lg text-balance", descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description })),
1117
+ renderActions,
1118
+ renderStats
1119
+ ]
1120
+ }
1121
+ )
1100
1122
  ] }) })
1101
1123
  }
1102
1124
  );
@@ -593,7 +593,7 @@ function HeroFloatingImages({
593
593
  {
594
594
  type: "button",
595
595
  className: cn(
596
- "group relative col-span-2 aspect-[4/3] overflow-hidden rounded-2xl sm:col-span-1 sm:row-span-2 sm:aspect-auto sm:h-full",
596
+ "group relative col-span-2 aspect-4/3 overflow-hidden rounded-2xl sm:col-span-1 sm:row-span-2 sm:aspect-auto sm:h-full",
597
597
  featuredImageClassName
598
598
  ),
599
599
  onClick: () => handleImageClick(0),
@@ -572,7 +572,7 @@ function HeroFloatingImages({
572
572
  {
573
573
  type: "button",
574
574
  className: cn(
575
- "group relative col-span-2 aspect-[4/3] overflow-hidden rounded-2xl sm:col-span-1 sm:row-span-2 sm:aspect-auto sm:h-full",
575
+ "group relative col-span-2 aspect-4/3 overflow-hidden rounded-2xl sm:col-span-1 sm:row-span-2 sm:aspect-auto sm:h-full",
576
576
  featuredImageClassName
577
577
  ),
578
578
  onClick: () => handleImageClick(0),
@@ -835,11 +835,11 @@ function HeroHiringAnimatedText({
835
835
  scrollActionSlot,
836
836
  backgroundImage,
837
837
  background,
838
- spacing = "pt-28 pb-8 md:pt-32 md:pb-32",
838
+ spacing = "py-0 md:py-0",
839
839
  pattern,
840
840
  patternOpacity,
841
841
  className,
842
- containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
842
+ containerClassName = "mx-auto h-screen w-full max-w-7xl relative z-10 px-6 md:px-16 lg:px-32 pb-12 md:pb-18",
843
843
  contentClassName,
844
844
  headingClassName,
845
845
  descriptionClassName,
@@ -945,11 +945,11 @@ function HeroHiringAnimatedText({
945
945
  ),
946
946
  containerClassName,
947
947
  style: { backgroundImage: `url('${backgroundImage}')` },
948
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 flex size-full max-w-412.5 flex-col justify-between pt-24 pb-14 md:justify-end", children: /* @__PURE__ */ jsxRuntime.jsxs(
948
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative z-10 flex size-full max-w-md flex-col justify-between md:justify-end", children: /* @__PURE__ */ jsxRuntime.jsxs(
949
949
  "div",
950
950
  {
951
951
  className: cn(
952
- "flex h-full flex-col justify-between gap-6 md:justify-end max-w-full md:max-w-md",
952
+ "flex h-full flex-col gap-6 justify-end max-w-full md:max-w-md",
953
953
  contentClassName
954
954
  ),
955
955
  children: [