@opensite/ui 1.5.2 → 1.5.3

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.
@@ -86,6 +86,10 @@ interface FooterNavSocialProps {
86
86
  navLinkClassName?: string;
87
87
  /** Additional CSS classes for the right column */
88
88
  rightColumnClassName?: string;
89
+ /** Config for submitting forms to server */
90
+ formConfig?: {
91
+ token: string;
92
+ };
89
93
  /** Additional CSS classes for the newsletter section */
90
94
  newsletterClassName?: string;
91
95
  /** Additional CSS classes for the newsletter heading */
@@ -112,6 +116,10 @@ interface FooterNavSocialProps {
112
116
  legalLinkClassName?: string;
113
117
  /** Section background variant */
114
118
  background?: SectionBackground;
119
+ /**
120
+ * Additional CSS classes for the container
121
+ */
122
+ containerClassName?: string;
115
123
  /** Section spacing variant */
116
124
  spacing?: SectionSpacing;
117
125
  /** Optional background pattern */
@@ -129,6 +137,6 @@ interface FooterNavSocialProps {
129
137
  * websites, and businesses that want a complete footer with all essential elements
130
138
  * organized in a clean, professional layout.
131
139
  */
132
- declare function FooterNavSocial({ logo, sections, socialLinks, newsletterHeading, newsletterDescription, newsletterPlaceholder, newsletterButtonText, socialTitle, copyright, legalLinks, className, contentClassName, gridClassName, leftColumnClassName, logoWrapperClassName, logoClassName, navGridClassName, navSectionClassName, navTitleClassName, navLinksClassName, navLinkClassName, rightColumnClassName, newsletterClassName, newsletterHeadingClassName, newsletterDescriptionClassName, newsletterFormClassName, socialSectionClassName, socialTitleClassName, socialLinksClassName, socialLinkClassName, bottomClassName, copyrightClassName, legalLinksClassName, legalLinkClassName, background, spacing, pattern, patternOpacity, optixFlowConfig, }: FooterNavSocialProps): React.JSX.Element;
140
+ declare function FooterNavSocial({ logo, sections, socialLinks, newsletterHeading, newsletterDescription, newsletterPlaceholder, newsletterButtonText, socialTitle, copyright, legalLinks, className, contentClassName, gridClassName, leftColumnClassName, logoWrapperClassName, formConfig, logoClassName, navGridClassName, navSectionClassName, navTitleClassName, navLinksClassName, navLinkClassName, rightColumnClassName, newsletterClassName, newsletterHeadingClassName, newsletterDescriptionClassName, newsletterFormClassName, socialSectionClassName, socialTitleClassName, socialLinksClassName, socialLinkClassName, bottomClassName, copyrightClassName, legalLinksClassName, legalLinkClassName, background, containerClassName, spacing, pattern, patternOpacity, optixFlowConfig, }: FooterNavSocialProps): React.JSX.Element;
133
141
 
134
142
  export { FooterNavSocial, type FooterNavSocialProps, type FooterNavSocialSection };
@@ -1610,6 +1610,7 @@ function FooterNavSocial({
1610
1610
  gridClassName,
1611
1611
  leftColumnClassName,
1612
1612
  logoWrapperClassName,
1613
+ formConfig,
1613
1614
  logoClassName,
1614
1615
  navGridClassName,
1615
1616
  navSectionClassName,
@@ -1630,7 +1631,8 @@ function FooterNavSocial({
1630
1631
  legalLinksClassName,
1631
1632
  legalLinkClassName,
1632
1633
  background,
1633
- spacing,
1634
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
1635
+ spacing = "py-12 md:py-40",
1634
1636
  pattern,
1635
1637
  patternOpacity,
1636
1638
  optixFlowConfig
@@ -1639,16 +1641,15 @@ function FooterNavSocial({
1639
1641
  if (!sections || sections.length === 0) return null;
1640
1642
  return sections.map((section, sectionIdx) => /* @__PURE__ */ jsxs("div", { className: cn(navSectionClassName), children: [
1641
1643
  /* @__PURE__ */ jsx("h3", { className: cn("mb-4 font-semibold", navTitleClassName), children: section.title }),
1642
- /* @__PURE__ */ jsx("ul", { className: cn("space-y-3 text-sm opacity-80", navLinksClassName), children: section.links.map((link, linkIdx) => /* @__PURE__ */ jsx("li", { className: cn(navLinkClassName), children: /* @__PURE__ */ jsx(
1643
- Pressable,
1644
- {
1645
- href: link.href,
1646
- className: "hover:opacity-100",
1647
- children: link.name
1648
- }
1649
- ) }, linkIdx)) })
1644
+ /* @__PURE__ */ jsx("ul", { className: cn("space-y-3 text-sm opacity-80", navLinksClassName), children: section.links.map((link, linkIdx) => /* @__PURE__ */ jsx("li", { className: cn(navLinkClassName), children: /* @__PURE__ */ jsx(Pressable, { href: link.href, className: "hover:opacity-100", children: link.name }) }, linkIdx)) })
1650
1645
  ] }, sectionIdx));
1651
- }, [sections, navSectionClassName, navTitleClassName, navLinksClassName, navLinkClassName]);
1646
+ }, [
1647
+ sections,
1648
+ navSectionClassName,
1649
+ navTitleClassName,
1650
+ navLinksClassName,
1651
+ navLinkClassName
1652
+ ]);
1652
1653
  const socialLinksContent = useMemo(() => {
1653
1654
  if (!socialLinks || socialLinks.length === 0) return null;
1654
1655
  return socialLinks.map((social, idx) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
@@ -1657,7 +1658,10 @@ function FooterNavSocial({
1657
1658
  href: social.href,
1658
1659
  label: social.label,
1659
1660
  iconNameOverride: social.iconNameOverride,
1660
- className: cn("opacity-80 transition-colors hover:opacity-100", socialLinkClassName)
1661
+ className: cn(
1662
+ "opacity-80 transition-colors hover:opacity-100",
1663
+ socialLinkClassName
1664
+ )
1661
1665
  }
1662
1666
  ) }, idx));
1663
1667
  }, [socialLinks, socialLinkClassName]);
@@ -1673,64 +1677,155 @@ function FooterNavSocial({
1673
1677
  pattern,
1674
1678
  patternOpacity,
1675
1679
  className: cn(className),
1680
+ containerClassName,
1676
1681
  children: /* @__PURE__ */ jsx("div", { className: cn(contentClassName), children: /* @__PURE__ */ jsxs("footer", { children: [
1677
- /* @__PURE__ */ jsxs("div", { className: cn("grid gap-10 lg:grid-cols-2", gridClassName), children: [
1678
- /* @__PURE__ */ jsxs("div", { className: cn(leftColumnClassName), children: [
1679
- logo && /* @__PURE__ */ jsx(
1680
- FooterLogo,
1681
- {
1682
- logo,
1683
- logoClassName: cn("mb-8", logoWrapperClassName),
1684
- logoImageClassName: logoClassName,
1685
- optixFlowConfig
1686
- }
1682
+ /* @__PURE__ */ jsxs(
1683
+ "div",
1684
+ {
1685
+ className: cn(
1686
+ "grid gap-12 md:gap-24 lg:grid-cols-2",
1687
+ gridClassName
1687
1688
  ),
1688
- /* @__PURE__ */ jsx("div", { className: cn("grid gap-8 sm:grid-cols-3", navGridClassName), children: sectionsContent })
1689
- ] }),
1690
- /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col justify-between", rightColumnClassName), children: [
1691
- (newsletterHeading || newsletterDescription) && /* @__PURE__ */ jsxs("div", { className: cn("mb-8", newsletterClassName), children: [
1692
- newsletterHeading && /* @__PURE__ */ jsx("h3", { className: cn("mb-2 text-lg font-semibold", newsletterHeadingClassName), children: newsletterHeading }),
1693
- newsletterDescription && /* @__PURE__ */ jsx("p", { className: cn("mb-4 text-sm opacity-80", newsletterDescriptionClassName), children: newsletterDescription }),
1694
- /* @__PURE__ */ jsxs("div", { className: cn("flex max-w-md gap-2", newsletterFormClassName), children: [
1695
- /* @__PURE__ */ jsx(
1696
- "input",
1689
+ children: [
1690
+ /* @__PURE__ */ jsxs("div", { className: cn(leftColumnClassName), children: [
1691
+ logo && /* @__PURE__ */ jsx(
1692
+ FooterLogo,
1697
1693
  {
1698
- type: "email",
1699
- placeholder: newsletterPlaceholder,
1700
- className: "flex h-10 w-full rounded-md border border-input px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
1694
+ logo,
1695
+ logoClassName: cn("mb-8", logoWrapperClassName),
1696
+ logoImageClassName: logoClassName,
1697
+ optixFlowConfig
1701
1698
  }
1702
1699
  ),
1703
- newsletterButtonText && /* @__PURE__ */ jsx(
1704
- "button",
1700
+ /* @__PURE__ */ jsx(
1701
+ "div",
1705
1702
  {
1706
- type: "submit",
1707
- className: "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2",
1708
- children: newsletterButtonText
1703
+ className: cn(
1704
+ "grid md:flex w-full gap-8 md:gap-6 lg:gap-12 md:flex-wrap md:justify-between grid-cols-2",
1705
+ navGridClassName
1706
+ ),
1707
+ children: sectionsContent
1709
1708
  }
1710
1709
  )
1711
- ] })
1712
- ] }),
1713
- (socialTitle || socialLinksContent) && /* @__PURE__ */ jsxs("div", { className: cn(socialSectionClassName), children: [
1714
- socialTitle && /* @__PURE__ */ jsx("p", { className: cn("mb-4 font-medium", socialTitleClassName), children: socialTitle }),
1715
- /* @__PURE__ */ jsx("ul", { className: cn("flex items-center gap-4", socialLinksClassName), children: socialLinksContent })
1716
- ] })
1717
- ] })
1718
- ] }),
1719
- /* @__PURE__ */ jsxs("div", { className: cn("mt-16 flex flex-col justify-between gap-4 border-t pt-8 text-sm opacity-80 md:flex-row md:items-center", bottomClassName), children: [
1720
- /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-2 md:flex-row md:items-center md:gap-4", copyrightClassName), children: [
1721
- /* @__PURE__ */ jsx(FooterCopyright, { copyright }),
1722
- /* @__PURE__ */ jsx(
1723
- BrandAttribution,
1724
- {
1725
- internalBrandSlug: "open_site_ai",
1726
- optionIndex: 1,
1727
- variant: "span",
1728
- linkClassName: "underline underline-offset-4 transition-colors hover:opacity-100"
1729
- }
1730
- )
1731
- ] }),
1732
- legalLinksContent && /* @__PURE__ */ jsx("ul", { className: cn("flex gap-4", legalLinksClassName), children: legalLinksContent })
1733
- ] })
1710
+ ] }),
1711
+ /* @__PURE__ */ jsxs(
1712
+ "div",
1713
+ {
1714
+ className: cn(
1715
+ "flex flex-col justify-between mt-0 md:mt-16 space-y-8 md:space-y-12",
1716
+ rightColumnClassName
1717
+ ),
1718
+ children: [
1719
+ formConfig && /* @__PURE__ */ jsxs("div", { className: cn("", newsletterClassName), children: [
1720
+ newsletterHeading && /* @__PURE__ */ jsx(
1721
+ "h3",
1722
+ {
1723
+ className: cn(
1724
+ "mb-4 font-medium",
1725
+ newsletterHeadingClassName
1726
+ ),
1727
+ children: newsletterHeading
1728
+ }
1729
+ ),
1730
+ newsletterDescription && /* @__PURE__ */ jsx(
1731
+ "p",
1732
+ {
1733
+ className: cn(
1734
+ "mb-4 text-sm opacity-80",
1735
+ newsletterDescriptionClassName
1736
+ ),
1737
+ children: newsletterDescription
1738
+ }
1739
+ ),
1740
+ /* @__PURE__ */ jsxs(
1741
+ "div",
1742
+ {
1743
+ className: cn(
1744
+ "flex max-w-md gap-2",
1745
+ newsletterFormClassName
1746
+ ),
1747
+ children: [
1748
+ /* @__PURE__ */ jsx(
1749
+ "input",
1750
+ {
1751
+ type: "email",
1752
+ placeholder: newsletterPlaceholder,
1753
+ className: "flex h-10 w-full rounded-md border border-input px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50"
1754
+ }
1755
+ ),
1756
+ newsletterButtonText && /* @__PURE__ */ jsx(
1757
+ "button",
1758
+ {
1759
+ type: "submit",
1760
+ className: "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-10 px-4 py-2",
1761
+ children: newsletterButtonText
1762
+ }
1763
+ )
1764
+ ]
1765
+ }
1766
+ )
1767
+ ] }),
1768
+ (socialTitle || socialLinksContent) && /* @__PURE__ */ jsxs("div", { className: cn(socialSectionClassName), children: [
1769
+ socialTitle && /* @__PURE__ */ jsx("p", { className: cn("mb-4 font-medium", socialTitleClassName), children: socialTitle }),
1770
+ /* @__PURE__ */ jsx(
1771
+ "ul",
1772
+ {
1773
+ className: cn(
1774
+ "flex items-center gap-4",
1775
+ socialLinksClassName
1776
+ ),
1777
+ children: socialLinksContent
1778
+ }
1779
+ )
1780
+ ] })
1781
+ ]
1782
+ }
1783
+ )
1784
+ ]
1785
+ }
1786
+ ),
1787
+ /* @__PURE__ */ jsxs(
1788
+ "div",
1789
+ {
1790
+ className: cn(
1791
+ "mt-16 flex flex-col justify-between gap-4 border-t pt-8 text-sm opacity-80 md:flex-row md:items-center",
1792
+ bottomClassName
1793
+ ),
1794
+ children: [
1795
+ /* @__PURE__ */ jsxs(
1796
+ "div",
1797
+ {
1798
+ className: cn(
1799
+ "flex flex-col gap-2 md:flex-row md:items-center md:gap-4",
1800
+ copyrightClassName
1801
+ ),
1802
+ children: [
1803
+ /* @__PURE__ */ jsx(FooterCopyright, { copyright }),
1804
+ /* @__PURE__ */ jsx(
1805
+ BrandAttribution,
1806
+ {
1807
+ internalBrandSlug: "open_site_ai",
1808
+ optionIndex: 1,
1809
+ variant: "span",
1810
+ linkClassName: "underline underline-offset-4 transition-colors hover:opacity-100"
1811
+ }
1812
+ )
1813
+ ]
1814
+ }
1815
+ ),
1816
+ legalLinksContent && /* @__PURE__ */ jsx(
1817
+ "ul",
1818
+ {
1819
+ className: cn(
1820
+ "pt-4 md:pt-0 gap-4 grid md:flex grid-cols-2 items-center w-full md:w-fit",
1821
+ legalLinksClassName
1822
+ ),
1823
+ children: legalLinksContent
1824
+ }
1825
+ )
1826
+ ]
1827
+ }
1828
+ )
1734
1829
  ] }) })
1735
1830
  }
1736
1831
  );
@@ -1436,8 +1436,8 @@ function FooterSimpleCentered({
1436
1436
  bottomLinks,
1437
1437
  className,
1438
1438
  footerClassName,
1439
- containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
1440
1439
  contentClassName,
1440
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
1441
1441
  spacing = "py-12 md:py-32",
1442
1442
  brandClassName,
1443
1443
  logoWrapperClassName,
@@ -105,6 +105,6 @@ interface FooterSimpleCenteredProps {
105
105
  * Ideal for corporate websites, landing pages, and products that prefer a clean,
106
106
  * uncluttered footer design without social media or newsletter elements.
107
107
  */
108
- declare function FooterSimpleCentered({ logo, tagline, sitemap, copyright, bottomLinks, className, footerClassName, containerClassName, contentClassName, spacing, brandClassName, logoWrapperClassName, logoClassName, taglineClassName, sitemapWrapperClassName, sitemapSectionClassName, sitemapTitleClassName, sitemapLinksClassName, sitemapLinkClassName, bottomBarClassName, copyrightClassName, bottomLinksClassName, bottomLinkClassName, background, pattern, patternOpacity, optixFlowConfig, }: FooterSimpleCenteredProps): React.JSX.Element;
108
+ declare function FooterSimpleCentered({ logo, tagline, sitemap, copyright, bottomLinks, className, footerClassName, contentClassName, containerClassName, spacing, brandClassName, logoWrapperClassName, logoClassName, taglineClassName, sitemapWrapperClassName, sitemapSectionClassName, sitemapTitleClassName, sitemapLinksClassName, sitemapLinkClassName, bottomBarClassName, copyrightClassName, bottomLinksClassName, bottomLinkClassName, background, pattern, patternOpacity, optixFlowConfig, }: FooterSimpleCenteredProps): React.JSX.Element;
109
109
 
110
110
  export { FooterSimpleCentered, type FooterSimpleCenteredProps, type FooterSimpleCenteredSection };
@@ -105,6 +105,6 @@ interface FooterSimpleCenteredProps {
105
105
  * Ideal for corporate websites, landing pages, and products that prefer a clean,
106
106
  * uncluttered footer design without social media or newsletter elements.
107
107
  */
108
- declare function FooterSimpleCentered({ logo, tagline, sitemap, copyright, bottomLinks, className, footerClassName, containerClassName, contentClassName, spacing, brandClassName, logoWrapperClassName, logoClassName, taglineClassName, sitemapWrapperClassName, sitemapSectionClassName, sitemapTitleClassName, sitemapLinksClassName, sitemapLinkClassName, bottomBarClassName, copyrightClassName, bottomLinksClassName, bottomLinkClassName, background, pattern, patternOpacity, optixFlowConfig, }: FooterSimpleCenteredProps): React.JSX.Element;
108
+ declare function FooterSimpleCentered({ logo, tagline, sitemap, copyright, bottomLinks, className, footerClassName, contentClassName, containerClassName, spacing, brandClassName, logoWrapperClassName, logoClassName, taglineClassName, sitemapWrapperClassName, sitemapSectionClassName, sitemapTitleClassName, sitemapLinksClassName, sitemapLinkClassName, bottomBarClassName, copyrightClassName, bottomLinksClassName, bottomLinkClassName, background, pattern, patternOpacity, optixFlowConfig, }: FooterSimpleCenteredProps): React.JSX.Element;
109
109
 
110
110
  export { FooterSimpleCentered, type FooterSimpleCenteredProps, type FooterSimpleCenteredSection };
@@ -1415,8 +1415,8 @@ function FooterSimpleCentered({
1415
1415
  bottomLinks,
1416
1416
  className,
1417
1417
  footerClassName,
1418
- containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
1419
1418
  contentClassName,
1419
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
1420
1420
  spacing = "py-12 md:py-32",
1421
1421
  brandClassName,
1422
1422
  logoWrapperClassName,
@@ -32,54 +32,6 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
32
32
  function cn(...inputs) {
33
33
  return tailwindMerge.twMerge(clsx.clsx(inputs));
34
34
  }
35
- function getTextColor(parentBg, variant = "default", options) {
36
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
37
- if (isDark) {
38
- switch (variant) {
39
- case "default":
40
- return "text-foreground";
41
- case "muted":
42
- return "text-foreground/80";
43
- case "subtle":
44
- return "text-foreground/60";
45
- case "accent":
46
- return "text-accent-foreground";
47
- }
48
- } else {
49
- switch (variant) {
50
- case "default":
51
- return "text-foreground";
52
- case "muted":
53
- return "text-muted-foreground";
54
- case "subtle":
55
- return "text-muted-foreground/70";
56
- case "accent":
57
- return "text-primary";
58
- }
59
- }
60
- }
61
- function getBorderColor(parentBg, variant = "default", options) {
62
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
63
- if (isDark) {
64
- switch (variant) {
65
- case "default":
66
- return "border-foreground/20";
67
- case "muted":
68
- return "border-foreground/10";
69
- case "accent":
70
- return "border-accent-foreground";
71
- }
72
- } else {
73
- switch (variant) {
74
- case "default":
75
- return "border-border";
76
- case "muted":
77
- return "border-muted";
78
- case "accent":
79
- return "border-primary";
80
- }
81
- }
82
- }
83
35
  function normalizePhoneNumber(input) {
84
36
  const trimmed = input.trim();
85
37
  if (trimmed.toLowerCase().startsWith("tel:")) {
@@ -881,11 +833,11 @@ function HeroCenteredScreenshot({
881
833
  imageSrc,
882
834
  imageAlt = "placeholder",
883
835
  background,
884
- spacing,
836
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
837
+ spacing = "py-12 md:py-32",
885
838
  pattern,
886
839
  patternOpacity,
887
840
  className,
888
- containerClassName,
889
841
  contentClassName,
890
842
  headingClassName,
891
843
  descriptionClassName,
@@ -897,7 +849,14 @@ function HeroCenteredScreenshot({
897
849
  if (actionsSlot) return actionsSlot;
898
850
  if (!actions || actions.length === 0) return null;
899
851
  return actions.map((action, index) => {
900
- const { label, icon, iconAfter, children, className: actionClassName, ...pressableProps } = action;
852
+ const {
853
+ label,
854
+ icon,
855
+ iconAfter,
856
+ children,
857
+ className: actionClassName,
858
+ ...pressableProps
859
+ } = action;
901
860
  return /* @__PURE__ */ jsxRuntime.jsx(
902
861
  Pressable,
903
862
  {
@@ -922,22 +881,50 @@ function HeroCenteredScreenshot({
922
881
  pattern,
923
882
  patternOpacity,
924
883
  className: cn(className),
925
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("overflow-hidden border-b", getBorderColor(background, "muted")), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("container", containerClassName), children: [
926
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mx-auto flex max-w-5xl flex-col items-center", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("z-10 items-center text-center", contentClassName), children: [
927
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h1", { className: cn("mb-8 text-4xl font-semibold text-pretty lg:text-7xl", headingClassName), children: heading }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
928
- description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mx-auto max-w-3xl lg:text-xl", getTextColor(background, "muted"), descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description })),
929
- (actionsSlot || actions && actions.length > 0) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mt-12 flex w-full flex-col justify-center gap-2 sm:flex-row", actionsClassName), children: renderActions })
930
- ] }) }),
884
+ containerClassName,
885
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(""), children: [
886
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col", children: /* @__PURE__ */ jsxRuntime.jsxs(
887
+ "div",
888
+ {
889
+ className: cn("z-10 items-center text-center", contentClassName),
890
+ children: [
891
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
892
+ "h1",
893
+ {
894
+ className: cn(
895
+ "mb-8 text-4xl font-bold text-balance lg:text-7xl",
896
+ headingClassName
897
+ ),
898
+ children: heading
899
+ }
900
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
901
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
902
+ "p",
903
+ {
904
+ className: cn(
905
+ "mx-auto max-w-3xl lg:text-xl text-balance opacity-80",
906
+ descriptionClassName
907
+ ),
908
+ children: description
909
+ }
910
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description })),
911
+ (actionsSlot || actions && actions.length > 0) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("lazy", actionsClassName), children: renderActions })
912
+ ]
913
+ }
914
+ ) }),
931
915
  imageSrc && /* @__PURE__ */ jsxRuntime.jsx(
932
916
  img.Img,
933
917
  {
934
918
  src: imageSrc,
935
919
  alt: imageAlt,
936
- className: cn("mx-auto mt-24 max-h-[700px] w-full max-w-7xl rounded-t-lg object-cover shadow-lg", imageClassName),
920
+ className: cn(
921
+ "mx-auto mt-24 max-h-[700px] w-full max-w-7xl rounded-2xl object-cover shadow-lg",
922
+ imageClassName
923
+ ),
937
924
  optixFlowConfig
938
925
  }
939
926
  )
940
- ] }) })
927
+ ] })
941
928
  }
942
929
  );
943
930
  }
@@ -80,6 +80,6 @@ interface HeroCenteredScreenshotProps {
80
80
  */
81
81
  optixFlowConfig?: OptixFlowConfig;
82
82
  }
83
- declare function HeroCenteredScreenshot({ heading, description, actions, actionsSlot, imageSrc, imageAlt, background, spacing, pattern, patternOpacity, className, containerClassName, contentClassName, headingClassName, descriptionClassName, actionsClassName, imageClassName, optixFlowConfig, }: HeroCenteredScreenshotProps): React.JSX.Element;
83
+ declare function HeroCenteredScreenshot({ heading, description, actions, actionsSlot, imageSrc, imageAlt, background, containerClassName, spacing, pattern, patternOpacity, className, contentClassName, headingClassName, descriptionClassName, actionsClassName, imageClassName, optixFlowConfig, }: HeroCenteredScreenshotProps): React.JSX.Element;
84
84
 
85
85
  export { HeroCenteredScreenshot, type HeroCenteredScreenshotProps };
@@ -80,6 +80,6 @@ interface HeroCenteredScreenshotProps {
80
80
  */
81
81
  optixFlowConfig?: OptixFlowConfig;
82
82
  }
83
- declare function HeroCenteredScreenshot({ heading, description, actions, actionsSlot, imageSrc, imageAlt, background, spacing, pattern, patternOpacity, className, containerClassName, contentClassName, headingClassName, descriptionClassName, actionsClassName, imageClassName, optixFlowConfig, }: HeroCenteredScreenshotProps): React.JSX.Element;
83
+ declare function HeroCenteredScreenshot({ heading, description, actions, actionsSlot, imageSrc, imageAlt, background, containerClassName, spacing, pattern, patternOpacity, className, contentClassName, headingClassName, descriptionClassName, actionsClassName, imageClassName, optixFlowConfig, }: HeroCenteredScreenshotProps): React.JSX.Element;
84
84
 
85
85
  export { HeroCenteredScreenshot, type HeroCenteredScreenshotProps };
@@ -11,54 +11,6 @@ import { Img } from '@page-speed/img';
11
11
  function cn(...inputs) {
12
12
  return twMerge(clsx(inputs));
13
13
  }
14
- function getTextColor(parentBg, variant = "default", options) {
15
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
16
- if (isDark) {
17
- switch (variant) {
18
- case "default":
19
- return "text-foreground";
20
- case "muted":
21
- return "text-foreground/80";
22
- case "subtle":
23
- return "text-foreground/60";
24
- case "accent":
25
- return "text-accent-foreground";
26
- }
27
- } else {
28
- switch (variant) {
29
- case "default":
30
- return "text-foreground";
31
- case "muted":
32
- return "text-muted-foreground";
33
- case "subtle":
34
- return "text-muted-foreground/70";
35
- case "accent":
36
- return "text-primary";
37
- }
38
- }
39
- }
40
- function getBorderColor(parentBg, variant = "default", options) {
41
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
42
- if (isDark) {
43
- switch (variant) {
44
- case "default":
45
- return "border-foreground/20";
46
- case "muted":
47
- return "border-foreground/10";
48
- case "accent":
49
- return "border-accent-foreground";
50
- }
51
- } else {
52
- switch (variant) {
53
- case "default":
54
- return "border-border";
55
- case "muted":
56
- return "border-muted";
57
- case "accent":
58
- return "border-primary";
59
- }
60
- }
61
- }
62
14
  function normalizePhoneNumber(input) {
63
15
  const trimmed = input.trim();
64
16
  if (trimmed.toLowerCase().startsWith("tel:")) {
@@ -860,11 +812,11 @@ function HeroCenteredScreenshot({
860
812
  imageSrc,
861
813
  imageAlt = "placeholder",
862
814
  background,
863
- spacing,
815
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
816
+ spacing = "py-12 md:py-32",
864
817
  pattern,
865
818
  patternOpacity,
866
819
  className,
867
- containerClassName,
868
820
  contentClassName,
869
821
  headingClassName,
870
822
  descriptionClassName,
@@ -876,7 +828,14 @@ function HeroCenteredScreenshot({
876
828
  if (actionsSlot) return actionsSlot;
877
829
  if (!actions || actions.length === 0) return null;
878
830
  return actions.map((action, index) => {
879
- const { label, icon, iconAfter, children, className: actionClassName, ...pressableProps } = action;
831
+ const {
832
+ label,
833
+ icon,
834
+ iconAfter,
835
+ children,
836
+ className: actionClassName,
837
+ ...pressableProps
838
+ } = action;
880
839
  return /* @__PURE__ */ jsx(
881
840
  Pressable,
882
841
  {
@@ -901,22 +860,50 @@ function HeroCenteredScreenshot({
901
860
  pattern,
902
861
  patternOpacity,
903
862
  className: cn(className),
904
- children: /* @__PURE__ */ jsx("div", { className: cn("overflow-hidden border-b", getBorderColor(background, "muted")), children: /* @__PURE__ */ jsxs("div", { className: cn("container", containerClassName), children: [
905
- /* @__PURE__ */ jsx("div", { className: "mx-auto flex max-w-5xl flex-col items-center", children: /* @__PURE__ */ jsxs("div", { className: cn("z-10 items-center text-center", contentClassName), children: [
906
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsx("h1", { className: cn("mb-8 text-4xl font-semibold text-pretty lg:text-7xl", headingClassName), children: heading }) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
907
- description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("mx-auto max-w-3xl lg:text-xl", getTextColor(background, "muted"), descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description })),
908
- (actionsSlot || actions && actions.length > 0) && /* @__PURE__ */ jsx("div", { className: cn("mt-12 flex w-full flex-col justify-center gap-2 sm:flex-row", actionsClassName), children: renderActions })
909
- ] }) }),
863
+ containerClassName,
864
+ children: /* @__PURE__ */ jsxs("div", { className: cn(""), children: [
865
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col", children: /* @__PURE__ */ jsxs(
866
+ "div",
867
+ {
868
+ className: cn("z-10 items-center text-center", contentClassName),
869
+ children: [
870
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
871
+ "h1",
872
+ {
873
+ className: cn(
874
+ "mb-8 text-4xl font-bold text-balance lg:text-7xl",
875
+ headingClassName
876
+ ),
877
+ children: heading
878
+ }
879
+ ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
880
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx(
881
+ "p",
882
+ {
883
+ className: cn(
884
+ "mx-auto max-w-3xl lg:text-xl text-balance opacity-80",
885
+ descriptionClassName
886
+ ),
887
+ children: description
888
+ }
889
+ ) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description })),
890
+ (actionsSlot || actions && actions.length > 0) && /* @__PURE__ */ jsx("div", { className: cn("lazy", actionsClassName), children: renderActions })
891
+ ]
892
+ }
893
+ ) }),
910
894
  imageSrc && /* @__PURE__ */ jsx(
911
895
  Img,
912
896
  {
913
897
  src: imageSrc,
914
898
  alt: imageAlt,
915
- className: cn("mx-auto mt-24 max-h-[700px] w-full max-w-7xl rounded-t-lg object-cover shadow-lg", imageClassName),
899
+ className: cn(
900
+ "mx-auto mt-24 max-h-[700px] w-full max-w-7xl rounded-2xl object-cover shadow-lg",
901
+ imageClassName
902
+ ),
916
903
  optixFlowConfig
917
904
  }
918
905
  )
919
- ] }) })
906
+ ] })
920
907
  }
921
908
  );
922
909
  }