@opensite/ui 1.8.6 → 1.8.8

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.
@@ -899,7 +899,7 @@ function HeroArchitectureFullscreen({
899
899
  react.motion.h1,
900
900
  {
901
901
  className: cn(
902
- "text-6xl font-bold md:text-7xl lg:text-8xl text-white text-balance text-shadow-xl tracking-tight leading-0",
902
+ "text-6xl font-bold md:text-7xl lg:text-8xl text-white text-balance text-shadow-xl tracking-tight leading-[1.1]",
903
903
  headingClassName
904
904
  ),
905
905
  initial: "hidden",
@@ -878,7 +878,7 @@ function HeroArchitectureFullscreen({
878
878
  motion.h1,
879
879
  {
880
880
  className: cn(
881
- "text-6xl font-bold md:text-7xl lg:text-8xl text-white text-balance text-shadow-xl tracking-tight leading-0",
881
+ "text-6xl font-bold md:text-7xl lg:text-8xl text-white text-balance text-shadow-xl tracking-tight leading-[1.1]",
882
882
  headingClassName
883
883
  ),
884
884
  initial: "hidden",
@@ -32,32 +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
35
  function normalizePhoneNumber(input) {
62
36
  const trimmed = input.trim();
63
37
  if (trimmed.toLowerCase().startsWith("tel:")) {
@@ -956,11 +930,79 @@ var Section = React__namespace.default.forwardRef(
956
930
  }
957
931
  );
958
932
  Section.displayName = "Section";
933
+ var MOBILE_CLASSES = {
934
+ "fit-left": "items-start md:items-center",
935
+ "fit-center": "items-center",
936
+ "fit-right": "items-end md:items-center",
937
+ "full-left": "items-stretch md:items-center",
938
+ "full-center": "items-stretch md:items-center",
939
+ "full-right": "items-stretch md:items-center"
940
+ };
941
+ function BlockActions({
942
+ mobileConfig,
943
+ actionsClassName,
944
+ verticalSpacing = "mt-4 md:mt-8",
945
+ actions,
946
+ actionsSlot
947
+ }) {
948
+ const renderAction = React__namespace.useCallback(
949
+ (action, idx) => {
950
+ const {
951
+ label,
952
+ icon,
953
+ iconAfter,
954
+ children,
955
+ href,
956
+ onClick,
957
+ className: actionClassName,
958
+ ...pressableProps
959
+ } = action;
960
+ return /* @__PURE__ */ jsxRuntime.jsx(
961
+ Pressable,
962
+ {
963
+ href,
964
+ onClick,
965
+ asButton: action.asButton || true,
966
+ className: actionClassName,
967
+ ...pressableProps,
968
+ children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
969
+ icon,
970
+ label,
971
+ iconAfter
972
+ ] })
973
+ },
974
+ idx
975
+ );
976
+ },
977
+ []
978
+ );
979
+ const width = mobileConfig?.width ?? "fit";
980
+ const position = mobileConfig?.position ?? "left";
981
+ const mobileLayoutClass = MOBILE_CLASSES[`${width}-${position}`];
982
+ if (actionsSlot) {
983
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { children: actionsSlot });
984
+ } else if (actions && actions?.length > 0) {
985
+ return /* @__PURE__ */ jsxRuntime.jsx(
986
+ "div",
987
+ {
988
+ className: cn(
989
+ "flex flex-col md:flex-row flex-wrap gap-4",
990
+ mobileLayoutClass,
991
+ actionsClassName,
992
+ verticalSpacing
993
+ ),
994
+ children: actions.map((action, index) => renderAction(action, index))
995
+ }
996
+ );
997
+ } else {
998
+ return null;
999
+ }
1000
+ }
959
1001
  function HeroCommunitySurveyCta({
960
- announcementPrimary = "Join our Community Collaboration Survey!",
961
- announcementSecondary = "We'll donate $20 for each response.",
962
- announcementLinkText = "Take a tour",
963
- announcementHref = "#",
1002
+ announcementPrimary,
1003
+ announcementSecondary,
1004
+ announcementLinkText,
1005
+ announcementHref,
964
1006
  announcementSlot,
965
1007
  heading,
966
1008
  description,
@@ -989,37 +1031,33 @@ function HeroCommunitySurveyCta({
989
1031
  Pressable,
990
1032
  {
991
1033
  href: announcementHref,
992
- className: cn("group mx-auto mb-3 w-fit gap-3 rounded-full border px-5 py-2 text-sm", announcementClassName),
1034
+ className: cn(
1035
+ "group mx-auto mb-3 w-fit gap-3 rounded-full border px-5 py-2 text-sm",
1036
+ announcementClassName
1037
+ ),
993
1038
  children: [
994
1039
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mr-1 font-medium", children: announcementPrimary }),
995
1040
  announcementSecondary,
996
- /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/minus", size: 16, className: "mx-1 inline-block" }),
1041
+ /* @__PURE__ */ jsxRuntime.jsx(
1042
+ DynamicIcon,
1043
+ {
1044
+ name: "lucide/minus",
1045
+ size: 16,
1046
+ className: "mx-1 inline-block"
1047
+ }
1048
+ ),
997
1049
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold group-hover:underline", children: announcementLinkText })
998
1050
  ]
999
1051
  }
1000
1052
  );
1001
- }, [announcementSlot, announcementHref, announcementClassName, announcementPrimary, announcementSecondary, announcementLinkText]);
1002
- const renderActions = React.useMemo(() => {
1003
- if (actionsSlot) return actionsSlot;
1004
- if (!actions || actions.length === 0) return null;
1005
- return actions.map((action, index) => {
1006
- const { label, icon, iconAfter, children, className: actionClassName, ...pressableProps } = action;
1007
- return /* @__PURE__ */ jsxRuntime.jsx(
1008
- Pressable,
1009
- {
1010
- asButton: true,
1011
- className: actionClassName,
1012
- ...pressableProps,
1013
- children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1014
- icon,
1015
- label,
1016
- iconAfter
1017
- ] })
1018
- },
1019
- index
1020
- );
1021
- });
1022
- }, [actionsSlot, actions]);
1053
+ }, [
1054
+ announcementSlot,
1055
+ announcementHref,
1056
+ announcementClassName,
1057
+ announcementPrimary,
1058
+ announcementSecondary,
1059
+ announcementLinkText
1060
+ ]);
1023
1061
  const renderImages = React.useMemo(() => {
1024
1062
  if (imagesSlot) return imagesSlot;
1025
1063
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("relative mx-auto max-w-5xl", imagesClassName), children: [
@@ -1051,7 +1089,14 @@ function HeroCommunitySurveyCta({
1051
1089
  }
1052
1090
  )
1053
1091
  ] });
1054
- }, [imagesSlot, imagesClassName, mainImage, leftOverlayImage, rightOverlayImage, optixFlowConfig]);
1092
+ }, [
1093
+ imagesSlot,
1094
+ imagesClassName,
1095
+ mainImage,
1096
+ leftOverlayImage,
1097
+ rightOverlayImage,
1098
+ optixFlowConfig
1099
+ ]);
1055
1100
  return /* @__PURE__ */ jsxRuntime.jsxs(
1056
1101
  Section,
1057
1102
  {
@@ -1059,13 +1104,39 @@ function HeroCommunitySurveyCta({
1059
1104
  spacing,
1060
1105
  pattern,
1061
1106
  patternOpacity,
1062
- className: cn(className),
1107
+ className,
1108
+ containerClassName,
1063
1109
  children: [
1064
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("container flex flex-col gap-7 text-center", containerClassName), children: [
1110
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
1065
1111
  renderAnnouncement,
1066
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h1", { className: cn("mx-auto max-w-4xl text-4xl font-semibold text-balance lg:text-6xl", headingClassName), children: heading }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
1067
- description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mx-auto max-w-4xl lg:text-xl", getTextColor(background, "muted"), descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description })),
1068
- (actionsSlot || actions && actions.length > 0) && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col justify-center gap-4 sm:flex-row", actionsClassName), children: renderActions })
1112
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1113
+ "h1",
1114
+ {
1115
+ className: cn(
1116
+ "mx-auto max-w-4xl text-4xl font-semibold text-balance lg:text-6xl",
1117
+ headingClassName
1118
+ ),
1119
+ children: heading
1120
+ }
1121
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
1122
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1123
+ "p",
1124
+ {
1125
+ className: cn(
1126
+ "mx-auto max-w-4xl lg:text-xl",
1127
+ descriptionClassName
1128
+ ),
1129
+ children: description
1130
+ }
1131
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description })),
1132
+ /* @__PURE__ */ jsxRuntime.jsx(
1133
+ BlockActions,
1134
+ {
1135
+ actions,
1136
+ actionsClassName,
1137
+ actionsSlot
1138
+ }
1139
+ )
1069
1140
  ] }),
1070
1141
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative px-8", children: [
1071
1142
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 top-1/2 h-full w-full bg-linear-to-b from-muted to-transparent to-50%" }),
@@ -11,32 +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
14
  function normalizePhoneNumber(input) {
41
15
  const trimmed = input.trim();
42
16
  if (trimmed.toLowerCase().startsWith("tel:")) {
@@ -935,11 +909,79 @@ var Section = React__default.forwardRef(
935
909
  }
936
910
  );
937
911
  Section.displayName = "Section";
912
+ var MOBILE_CLASSES = {
913
+ "fit-left": "items-start md:items-center",
914
+ "fit-center": "items-center",
915
+ "fit-right": "items-end md:items-center",
916
+ "full-left": "items-stretch md:items-center",
917
+ "full-center": "items-stretch md:items-center",
918
+ "full-right": "items-stretch md:items-center"
919
+ };
920
+ function BlockActions({
921
+ mobileConfig,
922
+ actionsClassName,
923
+ verticalSpacing = "mt-4 md:mt-8",
924
+ actions,
925
+ actionsSlot
926
+ }) {
927
+ const renderAction = React.useCallback(
928
+ (action, idx) => {
929
+ const {
930
+ label,
931
+ icon,
932
+ iconAfter,
933
+ children,
934
+ href,
935
+ onClick,
936
+ className: actionClassName,
937
+ ...pressableProps
938
+ } = action;
939
+ return /* @__PURE__ */ jsx(
940
+ Pressable,
941
+ {
942
+ href,
943
+ onClick,
944
+ asButton: action.asButton || true,
945
+ className: actionClassName,
946
+ ...pressableProps,
947
+ children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
948
+ icon,
949
+ label,
950
+ iconAfter
951
+ ] })
952
+ },
953
+ idx
954
+ );
955
+ },
956
+ []
957
+ );
958
+ const width = mobileConfig?.width ?? "fit";
959
+ const position = mobileConfig?.position ?? "left";
960
+ const mobileLayoutClass = MOBILE_CLASSES[`${width}-${position}`];
961
+ if (actionsSlot) {
962
+ return /* @__PURE__ */ jsx("div", { children: actionsSlot });
963
+ } else if (actions && actions?.length > 0) {
964
+ return /* @__PURE__ */ jsx(
965
+ "div",
966
+ {
967
+ className: cn(
968
+ "flex flex-col md:flex-row flex-wrap gap-4",
969
+ mobileLayoutClass,
970
+ actionsClassName,
971
+ verticalSpacing
972
+ ),
973
+ children: actions.map((action, index) => renderAction(action, index))
974
+ }
975
+ );
976
+ } else {
977
+ return null;
978
+ }
979
+ }
938
980
  function HeroCommunitySurveyCta({
939
- announcementPrimary = "Join our Community Collaboration Survey!",
940
- announcementSecondary = "We'll donate $20 for each response.",
941
- announcementLinkText = "Take a tour",
942
- announcementHref = "#",
981
+ announcementPrimary,
982
+ announcementSecondary,
983
+ announcementLinkText,
984
+ announcementHref,
943
985
  announcementSlot,
944
986
  heading,
945
987
  description,
@@ -968,37 +1010,33 @@ function HeroCommunitySurveyCta({
968
1010
  Pressable,
969
1011
  {
970
1012
  href: announcementHref,
971
- className: cn("group mx-auto mb-3 w-fit gap-3 rounded-full border px-5 py-2 text-sm", announcementClassName),
1013
+ className: cn(
1014
+ "group mx-auto mb-3 w-fit gap-3 rounded-full border px-5 py-2 text-sm",
1015
+ announcementClassName
1016
+ ),
972
1017
  children: [
973
1018
  /* @__PURE__ */ jsx("span", { className: "mr-1 font-medium", children: announcementPrimary }),
974
1019
  announcementSecondary,
975
- /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/minus", size: 16, className: "mx-1 inline-block" }),
1020
+ /* @__PURE__ */ jsx(
1021
+ DynamicIcon,
1022
+ {
1023
+ name: "lucide/minus",
1024
+ size: 16,
1025
+ className: "mx-1 inline-block"
1026
+ }
1027
+ ),
976
1028
  /* @__PURE__ */ jsx("span", { className: "font-semibold group-hover:underline", children: announcementLinkText })
977
1029
  ]
978
1030
  }
979
1031
  );
980
- }, [announcementSlot, announcementHref, announcementClassName, announcementPrimary, announcementSecondary, announcementLinkText]);
981
- const renderActions = useMemo(() => {
982
- if (actionsSlot) return actionsSlot;
983
- if (!actions || actions.length === 0) return null;
984
- return actions.map((action, index) => {
985
- const { label, icon, iconAfter, children, className: actionClassName, ...pressableProps } = action;
986
- return /* @__PURE__ */ jsx(
987
- Pressable,
988
- {
989
- asButton: true,
990
- className: actionClassName,
991
- ...pressableProps,
992
- children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
993
- icon,
994
- label,
995
- iconAfter
996
- ] })
997
- },
998
- index
999
- );
1000
- });
1001
- }, [actionsSlot, actions]);
1032
+ }, [
1033
+ announcementSlot,
1034
+ announcementHref,
1035
+ announcementClassName,
1036
+ announcementPrimary,
1037
+ announcementSecondary,
1038
+ announcementLinkText
1039
+ ]);
1002
1040
  const renderImages = useMemo(() => {
1003
1041
  if (imagesSlot) return imagesSlot;
1004
1042
  return /* @__PURE__ */ jsxs("div", { className: cn("relative mx-auto max-w-5xl", imagesClassName), children: [
@@ -1030,7 +1068,14 @@ function HeroCommunitySurveyCta({
1030
1068
  }
1031
1069
  )
1032
1070
  ] });
1033
- }, [imagesSlot, imagesClassName, mainImage, leftOverlayImage, rightOverlayImage, optixFlowConfig]);
1071
+ }, [
1072
+ imagesSlot,
1073
+ imagesClassName,
1074
+ mainImage,
1075
+ leftOverlayImage,
1076
+ rightOverlayImage,
1077
+ optixFlowConfig
1078
+ ]);
1034
1079
  return /* @__PURE__ */ jsxs(
1035
1080
  Section,
1036
1081
  {
@@ -1038,13 +1083,39 @@ function HeroCommunitySurveyCta({
1038
1083
  spacing,
1039
1084
  pattern,
1040
1085
  patternOpacity,
1041
- className: cn(className),
1086
+ className,
1087
+ containerClassName,
1042
1088
  children: [
1043
- /* @__PURE__ */ jsxs("div", { className: cn("container flex flex-col gap-7 text-center", containerClassName), children: [
1089
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
1044
1090
  renderAnnouncement,
1045
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsx("h1", { className: cn("mx-auto max-w-4xl text-4xl font-semibold text-balance lg:text-6xl", headingClassName), children: heading }) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
1046
- description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("mx-auto max-w-4xl lg:text-xl", getTextColor(background, "muted"), descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description })),
1047
- (actionsSlot || actions && actions.length > 0) && /* @__PURE__ */ jsx("div", { className: cn("flex flex-col justify-center gap-4 sm:flex-row", actionsClassName), children: renderActions })
1091
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
1092
+ "h1",
1093
+ {
1094
+ className: cn(
1095
+ "mx-auto max-w-4xl text-4xl font-semibold text-balance lg:text-6xl",
1096
+ headingClassName
1097
+ ),
1098
+ children: heading
1099
+ }
1100
+ ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
1101
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx(
1102
+ "p",
1103
+ {
1104
+ className: cn(
1105
+ "mx-auto max-w-4xl lg:text-xl",
1106
+ descriptionClassName
1107
+ ),
1108
+ children: description
1109
+ }
1110
+ ) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description })),
1111
+ /* @__PURE__ */ jsx(
1112
+ BlockActions,
1113
+ {
1114
+ actions,
1115
+ actionsClassName,
1116
+ actionsSlot
1117
+ }
1118
+ )
1048
1119
  ] }),
1049
1120
  /* @__PURE__ */ jsxs("div", { className: "relative px-8", children: [
1050
1121
  /* @__PURE__ */ jsx("div", { className: "absolute inset-0 top-1/2 h-full w-full bg-linear-to-b from-muted to-transparent to-50%" }),
@@ -36,54 +36,6 @@ var DialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(DialogPrimitive)
36
36
  function cn(...inputs) {
37
37
  return tailwindMerge.twMerge(clsx.clsx(inputs));
38
38
  }
39
- function getTextColor(parentBg, variant = "default", options) {
40
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
41
- if (isDark) {
42
- switch (variant) {
43
- case "default":
44
- return "text-foreground";
45
- case "muted":
46
- return "text-foreground/80";
47
- case "subtle":
48
- return "text-foreground/60";
49
- case "accent":
50
- return "text-accent-foreground";
51
- }
52
- } else {
53
- switch (variant) {
54
- case "default":
55
- return "text-foreground";
56
- case "muted":
57
- return "text-muted-foreground";
58
- case "subtle":
59
- return "text-muted-foreground/70";
60
- case "accent":
61
- return "text-primary";
62
- }
63
- }
64
- }
65
- function getBorderColor(parentBg, variant = "default", options) {
66
- const isDark = parentBg === "dark" || parentBg === "secondary" || parentBg === "primary";
67
- if (isDark) {
68
- switch (variant) {
69
- case "default":
70
- return "border-foreground/20";
71
- case "muted":
72
- return "border-foreground/10";
73
- case "accent":
74
- return "border-accent-foreground";
75
- }
76
- } else {
77
- switch (variant) {
78
- case "default":
79
- return "border-border";
80
- case "muted":
81
- return "border-muted";
82
- case "accent":
83
- return "border-primary";
84
- }
85
- }
86
- }
87
39
  function normalizePhoneNumber(input) {
88
40
  const trimmed = input.trim();
89
41
  if (trimmed.toLowerCase().startsWith("tel:")) {
@@ -1119,7 +1071,15 @@ function HeroSoftwareGrowthVideoDialog({
1119
1071
  if (actionsSlot) return actionsSlot;
1120
1072
  const actionsToRender = actions || defaultActions;
1121
1073
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col items-center justify-center gap-3 md:flex-row", children: actionsToRender.map((action, index) => {
1122
- const { label, icon, iconAfter, children, className: actionClassName, onClick, ...pressableProps } = action;
1074
+ const {
1075
+ label,
1076
+ icon,
1077
+ iconAfter,
1078
+ children,
1079
+ className: actionClassName,
1080
+ onClick,
1081
+ ...pressableProps
1082
+ } = action;
1123
1083
  const isVideoButton = index === 0 && !actions;
1124
1084
  return /* @__PURE__ */ jsxRuntime.jsx(
1125
1085
  Pressable,
@@ -1149,17 +1109,36 @@ function HeroSoftwareGrowthVideoDialog({
1149
1109
  if (showcaseImagesSlot) return showcaseImagesSlot;
1150
1110
  if (!showcaseImages || showcaseImages.length < 4) return null;
1151
1111
  const imageConfigs = [
1152
- { index: 0, className: "absolute -top-[28%] left-[18%] w-[28.47%] max-w-102.5", ratio: 1.11372549 / 1 },
1153
- { index: 1, className: "absolute -top-[28%] left-[51%] w-[18.75%] max-w-67.5", ratio: 0.845559846 / 1 },
1154
- { index: 2, className: "absolute -bottom-[14%] left-[51%] w-[38.19%] max-w-137.5", ratio: 1.686153846 / 1 },
1155
- { index: 3, className: "absolute -bottom-[30%] left-[10.7%] w-[38.19%] max-w-137.5", ratio: 1.415041783 / 1 }
1112
+ {
1113
+ index: 0,
1114
+ className: "absolute -top-[28%] left-[18%] w-[28.47%] max-w-102.5",
1115
+ ratio: 1.11372549 / 1
1116
+ },
1117
+ {
1118
+ index: 1,
1119
+ className: "absolute -top-[28%] left-[51%] w-[18.75%] max-w-67.5",
1120
+ ratio: 0.845559846 / 1
1121
+ },
1122
+ {
1123
+ index: 2,
1124
+ className: "absolute -bottom-[14%] left-[51%] w-[38.19%] max-w-137.5",
1125
+ ratio: 1.686153846 / 1
1126
+ },
1127
+ {
1128
+ index: 3,
1129
+ className: "absolute -bottom-[30%] left-[10.7%] w-[38.19%] max-w-137.5",
1130
+ ratio: 1.415041783 / 1
1131
+ }
1156
1132
  ];
1157
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("w-full py-[16%]", showcaseClassName), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("relative aspect-[2.716981132/1] w-full border", getBorderColor(background, "muted")), children: imageConfigs.map(({ index, className: posClassName, ratio }) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: posClassName, children: /* @__PURE__ */ jsxRuntime.jsx(AspectRatio, { ratio, children: /* @__PURE__ */ jsxRuntime.jsx(
1133
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("w-full py-[16%]", showcaseClassName), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("relative aspect-[2.716981132/1] w-full border"), children: imageConfigs.map(({ index, className: posClassName, ratio }) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: posClassName, children: /* @__PURE__ */ jsxRuntime.jsx(AspectRatio, { ratio, children: /* @__PURE__ */ jsxRuntime.jsx(
1158
1134
  img.Img,
1159
1135
  {
1160
1136
  src: showcaseImages[index].src,
1161
1137
  alt: showcaseImages[index].alt,
1162
- className: cn("size-full object-cover object-center", showcaseImages[index].className),
1138
+ className: cn(
1139
+ "size-full object-cover object-center",
1140
+ showcaseImages[index].className
1141
+ ),
1163
1142
  optixFlowConfig
1164
1143
  }
1165
1144
  ) }) }, index)) }) });
@@ -1171,8 +1150,35 @@ function HeroSoftwareGrowthVideoDialog({
1171
1150
  className: cn("font-dm_sans bg-background py-12 md:py-24", className),
1172
1151
  children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("container max-w-[1440px]", containerClassName), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
1173
1152
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center gap-8", children: [
1174
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx("h1", { className: cn("max-w-[1000px] text-center text-[3.125rem] leading-none md:text-[4.25rem] lg:text-[5.5rem]", headingClassName), children: heading }) : /* @__PURE__ */ jsxRuntime.jsx("h1", { className: cn("max-w-[1000px] text-center text-[3.125rem] leading-none md:text-[4.25rem] lg:text-[5.5rem]", headingClassName), children: heading })),
1175
- description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("max-w-212.5 text-center text-lg leading-snug md:text-xl", getTextColor(background, "muted"), descriptionClassName), children: description }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description })),
1153
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1154
+ "h1",
1155
+ {
1156
+ className: cn(
1157
+ "max-w-[1000px] text-center text-[3.125rem] leading-none md:text-[4.25rem] lg:text-[5.5rem]",
1158
+ headingClassName
1159
+ ),
1160
+ children: heading
1161
+ }
1162
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1163
+ "h1",
1164
+ {
1165
+ className: cn(
1166
+ "max-w-[1000px] text-center text-[3.125rem] leading-none md:text-[4.25rem] lg:text-[5.5rem]",
1167
+ headingClassName
1168
+ ),
1169
+ children: heading
1170
+ }
1171
+ )),
1172
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
1173
+ "p",
1174
+ {
1175
+ className: cn(
1176
+ "max-w-212.5 text-center text-lg leading-snug md:text-xl",
1177
+ descriptionClassName
1178
+ ),
1179
+ children: description
1180
+ }
1181
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description })),
1176
1182
  renderActions
1177
1183
  ] }),
1178
1184
  renderShowcaseImages