@opensite/ui 1.6.9 → 1.7.0

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 (31) hide show
  1. package/dist/hero-billing-platform-logos.cjs +77 -52
  2. package/dist/hero-billing-platform-logos.js +77 -51
  3. package/dist/hero-conversion-video-play.cjs +240 -78
  4. package/dist/hero-conversion-video-play.js +233 -75
  5. package/dist/hero-customer-support-layered.cjs +1 -1
  6. package/dist/hero-customer-support-layered.js +1 -1
  7. package/dist/hero-dashed-border-features.cjs +33 -24
  8. package/dist/hero-dashed-border-features.js +33 -24
  9. package/dist/hero-design-showcase-logos.cjs +102 -38
  10. package/dist/hero-design-showcase-logos.js +102 -38
  11. package/dist/hero-grid-pattern-solutions.cjs +187 -49
  12. package/dist/hero-grid-pattern-solutions.d.cts +1 -4
  13. package/dist/hero-grid-pattern-solutions.d.ts +1 -4
  14. package/dist/hero-grid-pattern-solutions.js +188 -50
  15. package/dist/hero-marketplace-scattered-images.cjs +120 -79
  16. package/dist/hero-marketplace-scattered-images.js +120 -79
  17. package/dist/hero-mentorship-video-split.cjs +32 -13
  18. package/dist/hero-mentorship-video-split.js +32 -13
  19. package/dist/hero-premium-split-avatars.cjs +2 -2
  20. package/dist/hero-premium-split-avatars.js +2 -2
  21. package/dist/hero-productivity-launcher-video.cjs +45 -143
  22. package/dist/hero-productivity-launcher-video.d.cts +5 -23
  23. package/dist/hero-productivity-launcher-video.d.ts +5 -23
  24. package/dist/hero-productivity-launcher-video.js +45 -143
  25. package/dist/hero-split-spiral-shapes.cjs +47 -38
  26. package/dist/hero-split-spiral-shapes.js +47 -38
  27. package/dist/hero-task-timer-animated.cjs +59 -59
  28. package/dist/hero-task-timer-animated.js +59 -59
  29. package/dist/registry.cjs +772 -439
  30. package/dist/registry.js +772 -439
  31. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  "use client";
2
- import * as React from 'react';
3
- import React__default, { useState, useMemo, Fragment as Fragment$1 } from 'react';
2
+ import * as React4 from 'react';
3
+ import React4__default, { useState, useMemo, Fragment as Fragment$1 } from 'react';
4
+ import AutoScroll from 'embla-carousel-auto-scroll';
4
5
  import { clsx } from 'clsx';
5
6
  import { twMerge } from 'tailwind-merge';
6
7
  import { cva } from 'class-variance-authority';
@@ -8,6 +9,7 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
9
  import { Img } from '@page-speed/img';
9
10
  import * as AspectRatioPrimitive from '@radix-ui/react-aspect-ratio';
10
11
  import * as DialogPrimitive from '@radix-ui/react-dialog';
12
+ import useEmblaCarousel from 'embla-carousel-react';
11
13
 
12
14
  // components/blocks/hero/hero-conversion-video-play.tsx
13
15
  function cn(...inputs) {
@@ -88,7 +90,7 @@ function useNavigation({
88
90
  href,
89
91
  onClick
90
92
  } = {}) {
91
- const linkType = React.useMemo(() => {
93
+ const linkType = React4.useMemo(() => {
92
94
  if (!href || href.trim() === "") {
93
95
  return onClick ? "none" : "none";
94
96
  }
@@ -109,7 +111,7 @@ function useNavigation({
109
111
  return "internal";
110
112
  }
111
113
  }, [href, onClick]);
112
- const normalizedHref = React.useMemo(() => {
114
+ const normalizedHref = React4.useMemo(() => {
113
115
  if (!href || href.trim() === "") {
114
116
  return void 0;
115
117
  }
@@ -127,7 +129,7 @@ function useNavigation({
127
129
  return trimmed;
128
130
  }
129
131
  }, [href, linkType]);
130
- const target = React.useMemo(() => {
132
+ const target = React4.useMemo(() => {
131
133
  switch (linkType) {
132
134
  case "external":
133
135
  return "_blank";
@@ -140,7 +142,7 @@ function useNavigation({
140
142
  return void 0;
141
143
  }
142
144
  }, [linkType]);
143
- const rel = React.useMemo(() => {
145
+ const rel = React4.useMemo(() => {
144
146
  if (linkType === "external") {
145
147
  return "noopener noreferrer";
146
148
  }
@@ -149,7 +151,7 @@ function useNavigation({
149
151
  const isExternal = linkType === "external";
150
152
  const isInternal = linkType === "internal";
151
153
  const shouldUseRouter = isInternal && typeof normalizedHref === "string" && normalizedHref.startsWith("/");
152
- const handleClick = React.useCallback(
154
+ const handleClick = React4.useCallback(
153
155
  (event) => {
154
156
  if (onClick) {
155
157
  try {
@@ -333,7 +335,7 @@ var buttonVariants = cva(baseStyles, {
333
335
  size: "default"
334
336
  }
335
337
  });
336
- var Pressable = React.forwardRef(
338
+ var Pressable = React4.forwardRef(
337
339
  ({
338
340
  children,
339
341
  className,
@@ -439,10 +441,10 @@ function DynamicIcon({
439
441
  className,
440
442
  alt
441
443
  }) {
442
- const [svgContent, setSvgContent] = React.useState(null);
443
- const [isLoading, setIsLoading] = React.useState(true);
444
- const [error, setError] = React.useState(null);
445
- const { url, iconName } = React.useMemo(() => {
444
+ const [svgContent, setSvgContent] = React4.useState(null);
445
+ const [isLoading, setIsLoading] = React4.useState(true);
446
+ const [error, setError] = React4.useState(null);
447
+ const { url, iconName } = React4.useMemo(() => {
446
448
  const separator = name.includes("/") ? "/" : ":";
447
449
  const [prefix, iconName2] = name.split(separator);
448
450
  const baseUrl = `https://icons.opensite.ai/api/icon/${prefix}/${iconName2}?format=svg&width=${size}&height=${size}&key=au382bi7fsh96w9h9xlrnat2jglx`;
@@ -451,7 +453,7 @@ function DynamicIcon({
451
453
  iconName: iconName2
452
454
  };
453
455
  }, [name, size]);
454
- React.useEffect(() => {
456
+ React4.useEffect(() => {
455
457
  let isMounted = true;
456
458
  const fetchSvg = async () => {
457
459
  const cached = svgCache.get(url);
@@ -625,6 +627,135 @@ function DialogTitle({
625
627
  }
626
628
  );
627
629
  }
630
+ var CarouselContext = React4.createContext(null);
631
+ function useCarousel() {
632
+ const context = React4.useContext(CarouselContext);
633
+ if (!context) {
634
+ throw new Error("useCarousel must be used within a <Carousel />");
635
+ }
636
+ return context;
637
+ }
638
+ function Carousel({
639
+ orientation = "horizontal",
640
+ opts,
641
+ setApi,
642
+ plugins,
643
+ className,
644
+ children,
645
+ ...props
646
+ }) {
647
+ const [carouselRef, api] = useEmblaCarousel(
648
+ {
649
+ ...opts,
650
+ axis: orientation === "horizontal" ? "x" : "y"
651
+ },
652
+ plugins
653
+ );
654
+ const [canScrollPrev, setCanScrollPrev] = React4.useState(false);
655
+ const [canScrollNext, setCanScrollNext] = React4.useState(false);
656
+ const onSelect = React4.useCallback((api2) => {
657
+ if (!api2) return;
658
+ setCanScrollPrev(api2.canScrollPrev());
659
+ setCanScrollNext(api2.canScrollNext());
660
+ }, []);
661
+ const scrollPrev = React4.useCallback(() => {
662
+ api?.scrollPrev();
663
+ }, [api]);
664
+ const scrollNext = React4.useCallback(() => {
665
+ api?.scrollNext();
666
+ }, [api]);
667
+ const handleKeyDown = React4.useCallback(
668
+ (event) => {
669
+ if (event.key === "ArrowLeft") {
670
+ event.preventDefault();
671
+ scrollPrev();
672
+ } else if (event.key === "ArrowRight") {
673
+ event.preventDefault();
674
+ scrollNext();
675
+ }
676
+ },
677
+ [scrollPrev, scrollNext]
678
+ );
679
+ React4.useEffect(() => {
680
+ if (!api || !setApi) return;
681
+ setApi(api);
682
+ }, [api, setApi]);
683
+ React4.useEffect(() => {
684
+ if (!api) return;
685
+ onSelect(api);
686
+ api.on("reInit", onSelect);
687
+ api.on("select", onSelect);
688
+ return () => {
689
+ api?.off("select", onSelect);
690
+ };
691
+ }, [api, onSelect]);
692
+ return /* @__PURE__ */ jsx(
693
+ CarouselContext.Provider,
694
+ {
695
+ value: {
696
+ carouselRef,
697
+ api,
698
+ opts,
699
+ orientation: orientation || (opts?.axis === "y" ? "vertical" : "horizontal"),
700
+ scrollPrev,
701
+ scrollNext,
702
+ canScrollPrev,
703
+ canScrollNext
704
+ },
705
+ children: /* @__PURE__ */ jsx(
706
+ "div",
707
+ {
708
+ onKeyDownCapture: handleKeyDown,
709
+ className: cn("relative", className),
710
+ role: "region",
711
+ "aria-roledescription": "carousel",
712
+ "data-slot": "carousel",
713
+ ...props,
714
+ children
715
+ }
716
+ )
717
+ }
718
+ );
719
+ }
720
+ function CarouselContent({ className, ...props }) {
721
+ const { carouselRef, orientation } = useCarousel();
722
+ return /* @__PURE__ */ jsx(
723
+ "div",
724
+ {
725
+ ref: carouselRef,
726
+ className: "overflow-hidden",
727
+ "data-slot": "carousel-content",
728
+ children: /* @__PURE__ */ jsx(
729
+ "div",
730
+ {
731
+ className: cn(
732
+ "flex",
733
+ orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col",
734
+ className
735
+ ),
736
+ ...props
737
+ }
738
+ )
739
+ }
740
+ );
741
+ }
742
+ function CarouselItem({ className, ...props }) {
743
+ const { orientation } = useCarousel();
744
+ return /* @__PURE__ */ jsx(
745
+ "div",
746
+ {
747
+ role: "group",
748
+ "aria-roledescription": "slide",
749
+ "data-slot": "carousel-item",
750
+ className: cn(
751
+ "min-w-0 shrink-0 grow-0 basis-full",
752
+ orientation === "horizontal" ? "pl-4" : "pt-4",
753
+ className
754
+ ),
755
+ ...props
756
+ }
757
+ );
758
+ }
628
759
  var maxWidthStyles = {
629
760
  sm: "max-w-screen-sm",
630
761
  md: "max-w-screen-md",
@@ -634,7 +765,7 @@ var maxWidthStyles = {
634
765
  "4xl": "max-w-[1536px]",
635
766
  full: "max-w-full"
636
767
  };
637
- var Container = React__default.forwardRef(
768
+ var Container = React4__default.forwardRef(
638
769
  ({ children, maxWidth = "xl", className, as = "div", ...props }, ref) => {
639
770
  const Component = as;
640
771
  return /* @__PURE__ */ jsx(
@@ -939,7 +1070,7 @@ var spacingStyles = {
939
1070
  };
940
1071
  var predefinedSpacings = ["none", "sm", "md", "lg", "xl"];
941
1072
  var isPredefinedSpacing = (spacing) => predefinedSpacings.includes(spacing);
942
- var Section = React__default.forwardRef(
1073
+ var Section = React4__default.forwardRef(
943
1074
  ({
944
1075
  id,
945
1076
  title,
@@ -1032,64 +1163,42 @@ function HeroConversionVideoPlay({
1032
1163
  if (actionsSlot) return actionsSlot;
1033
1164
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1034
1165
  primaryAction && (() => {
1035
- const { label, icon, iconAfter, children, className: actionClassName, ...pressableProps } = primaryAction;
1036
- return /* @__PURE__ */ jsxs(
1166
+ const {
1167
+ label,
1168
+ icon,
1169
+ iconAfter,
1170
+ children,
1171
+ className: actionClassName,
1172
+ ...pressableProps
1173
+ } = primaryAction;
1174
+ return /* @__PURE__ */ jsx(
1037
1175
  Pressable,
1038
1176
  {
1039
1177
  asButton: true,
1040
1178
  className: actionClassName,
1041
1179
  ...pressableProps,
1042
- children: [
1043
- /* @__PURE__ */ jsx("div", { className: "relative z-10 flex items-center gap-2.5", children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
1044
- icon,
1045
- /* @__PURE__ */ jsx("span", { children: label }),
1046
- iconAfter
1047
- ] }) }),
1048
- /* @__PURE__ */ jsx("div", { className: "absolute bottom-16 -left-16 aspect-square w-16 rounded-full bg-pink-400 transition-all duration-300 group-hover:bottom-1/2 group-hover:-left-5 group-hover:w-[110%] group-hover:translate-y-1/2" })
1049
- ]
1180
+ children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
1181
+ icon,
1182
+ /* @__PURE__ */ jsx("span", { children: label }),
1183
+ iconAfter
1184
+ ] })
1050
1185
  }
1051
1186
  );
1052
1187
  })(),
1053
- /* @__PURE__ */ jsxs(
1188
+ videoUrl && /* @__PURE__ */ jsxs(
1054
1189
  Pressable,
1055
1190
  {
1056
- href: "#",
1057
1191
  onClick: () => setIsVideoOpen(true),
1058
1192
  asButton: true,
1059
- variant: "ghost",
1060
- className: "flex h-fit w-fit items-center gap-2 text-lg font-semibold uppercase hover:bg-transparent",
1193
+ variant: "link",
1061
1194
  children: [
1062
- /* @__PURE__ */ jsx("div", { className: "flex h-10 w-10 rounded-full bg-primary", children: /* @__PURE__ */ jsx(
1063
- DynamicIcon,
1064
- {
1065
- name: "lucide/play",
1066
- size: 16,
1067
- className: "m-auto fill-white stroke-white"
1068
- }
1069
- ) }),
1195
+ /* @__PURE__ */ jsx("div", { className: "flex h-10 w-10 rounded-full bg-primary text-primary-foreground", children: /* @__PURE__ */ jsx(DynamicIcon, { name: "lucide/play" }) }),
1070
1196
  /* @__PURE__ */ jsx("div", { children: videoButtonLabel })
1071
1197
  ]
1072
1198
  }
1073
1199
  )
1074
1200
  ] });
1075
1201
  }, [actionsSlot, primaryAction, videoButtonLabel, setIsVideoOpen]);
1076
- const renderLogos = useMemo(() => {
1077
- if (logosSlot) return logosSlot;
1078
- if (!logos || logos.length === 0) return null;
1079
- return logos.map((logo, index) => {
1080
- const src = typeof logo.src === "string" ? logo.src : logo.src.light;
1081
- return /* @__PURE__ */ jsx(
1082
- Img,
1083
- {
1084
- src,
1085
- alt: logo.alt,
1086
- className: logo.className,
1087
- optixFlowConfig
1088
- },
1089
- index
1090
- );
1091
- });
1092
- }, [logosSlot, logos, optixFlowConfig]);
1093
1202
  return /* @__PURE__ */ jsxs(Fragment$1, { children: [
1094
1203
  /* @__PURE__ */ jsx(
1095
1204
  Section,
@@ -1102,42 +1211,91 @@ function HeroConversionVideoPlay({
1102
1211
  containerClassName,
1103
1212
  children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
1104
1213
  /* @__PURE__ */ jsx("div", { className: "overflow-hidden border-b border-border", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-16 md:gap-24", children: [
1105
- /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col items-center gap-8", contentClassName), children: [
1106
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-7", children: [
1107
- heading && (typeof heading === "string" ? /* @__PURE__ */ jsx("h1", { className: cn("max-w-[920px] text-center text-4xl leading-tight font-semibold md:text-6xl lg:text-7xl", headingClassName), children: heading }) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
1108
- description && (typeof description === "string" ? /* @__PURE__ */ jsx("p", { className: cn("max-w-[750px] text-center text-base leading-relaxed font-normal md:text-xl text-muted-foreground", descriptionClassName), children: description }) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description }))
1109
- ] }),
1110
- /* @__PURE__ */ jsx("div", { className: cn("flex flex-wrap items-center justify-center gap-8", actionsClassName), children: renderActions })
1111
- ] }),
1214
+ /* @__PURE__ */ jsxs(
1215
+ "div",
1216
+ {
1217
+ className: cn(
1218
+ "flex flex-col items-center gap-8",
1219
+ contentClassName
1220
+ ),
1221
+ children: [
1222
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-7", children: [
1223
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsx(
1224
+ "h1",
1225
+ {
1226
+ className: cn(
1227
+ "max-w-[920px] text-center text-4xl leading-tight font-semibold md:text-6xl lg:text-7xl text-balance",
1228
+ headingClassName
1229
+ ),
1230
+ children: heading
1231
+ }
1232
+ ) : /* @__PURE__ */ jsx("div", { className: headingClassName, children: heading })),
1233
+ description && (typeof description === "string" ? /* @__PURE__ */ jsx(
1234
+ "p",
1235
+ {
1236
+ className: cn(
1237
+ "max-w-[750px] text-center text-base leading-relaxed font-normal md:text-xl text-balance",
1238
+ descriptionClassName
1239
+ ),
1240
+ children: description
1241
+ }
1242
+ ) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description }))
1243
+ ] }),
1244
+ /* @__PURE__ */ jsx(
1245
+ "div",
1246
+ {
1247
+ className: cn(
1248
+ "flex flex-wrap items-center justify-center gap-8",
1249
+ actionsClassName
1250
+ ),
1251
+ children: renderActions
1252
+ }
1253
+ )
1254
+ ]
1255
+ }
1256
+ ),
1112
1257
  /* @__PURE__ */ jsx("div", { className: "w-full", children: imageSlot ? imageSlot : image ? /* @__PURE__ */ jsx("div", { className: cn("relative h-fit w-full", imageClassName), children: /* @__PURE__ */ jsx("div", { className: "relative z-20 w-full max-w-330 overflow-hidden rounded-t-xl md:rounded-t-3xl", children: /* @__PURE__ */ jsx(AspectRatio, { ratio: 2.095238095 / 1, children: /* @__PURE__ */ jsx(
1113
1258
  Img,
1114
1259
  {
1115
1260
  src: image.src,
1116
1261
  alt: image.alt,
1117
- className: cn("size-full object-cover object-center", image.className),
1262
+ className: cn(
1263
+ "size-full object-cover object-center",
1264
+ image.className
1265
+ ),
1118
1266
  optixFlowConfig
1119
1267
  }
1120
1268
  ) }) }) }) : null })
1121
1269
  ] }) }),
1122
1270
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-16 py-20", children: [
1123
- logosTagline && (typeof logosTagline === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-center text-xl font-medium text-accent-foreground"), children: logosTagline }) : logosTagline),
1124
- (logosSlot || logos && logos.length > 0) && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center justify-center gap-20", children: renderLogos })
1271
+ logosTagline && (typeof logosTagline === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-center text-xl font-medium "), children: logosTagline }) : logosTagline),
1272
+ logosSlot ? logosSlot : logos && logos.length > 0 ? /* @__PURE__ */ jsx(
1273
+ Carousel,
1274
+ {
1275
+ opts: { loop: true },
1276
+ plugins: [AutoScroll({ playOnInit: true, speed: 1 })],
1277
+ className: "relative w-full max-w-(--breakpoint-2xl) overflow-hidden",
1278
+ children: /* @__PURE__ */ jsx(CarouselContent, { className: "items-center", children: [...logos, ...logos].map((logo, index) => /* @__PURE__ */ jsx(CarouselItem, { className: "w-fit basis-auto px-7", children: /* @__PURE__ */ jsx(
1279
+ Img,
1280
+ {
1281
+ src: typeof logo.src === "string" ? logo.src : logo.src.light,
1282
+ alt: logo.alt,
1283
+ className: cn(
1284
+ "h-8 w-full object-fill",
1285
+ logo.imgClassName
1286
+ ),
1287
+ optixFlowConfig
1288
+ }
1289
+ ) }, index)) })
1290
+ }
1291
+ ) : null
1125
1292
  ] })
1126
1293
  ] })
1127
1294
  }
1128
1295
  ),
1129
- /* @__PURE__ */ jsx(Dialog, { open: isVideoOpen, onOpenChange: setIsVideoOpen, children: /* @__PURE__ */ jsxs(DialogContent, { className: "sm:max-w-[800px]", children: [
1296
+ /* @__PURE__ */ jsx(Dialog, { open: isVideoOpen, onOpenChange: setIsVideoOpen, children: /* @__PURE__ */ jsxs(DialogContent, { className: "sm:max-w-200", children: [
1130
1297
  /* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, { children: videoDialogTitle }) }),
1131
- /* @__PURE__ */ jsx("div", { className: "aspect-video", children: /* @__PURE__ */ jsx(
1132
- "iframe",
1133
- {
1134
- className: "h-full w-full",
1135
- src: videoUrl,
1136
- title: videoDialogTitle,
1137
- allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
1138
- allowFullScreen: true
1139
- }
1140
- ) })
1298
+ /* @__PURE__ */ jsx("div", { className: "aspect-video", children: /* @__PURE__ */ jsx("video", { controls: true, autoPlay: true, className: "h-full w-full rounded-lg", children: /* @__PURE__ */ jsx("source", { src: videoUrl, type: "video/mp4" }) }) })
1141
1299
  ] }) })
1142
1300
  ] });
1143
1301
  }
@@ -961,7 +961,7 @@ function HeroCustomerSupportLayered({
961
961
  patternClassName,
962
962
  className,
963
963
  containerClassName,
964
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 items-center gap-4 md:gap-20 md:grid-cols-2", children: [
964
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 items-center gap-8 md:gap-20 md:grid-cols-2", children: [
965
965
  /* @__PURE__ */ jsxRuntime.jsxs(
966
966
  "div",
967
967
  {
@@ -940,7 +940,7 @@ function HeroCustomerSupportLayered({
940
940
  patternClassName,
941
941
  className,
942
942
  containerClassName,
943
- children: /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 items-center gap-4 md:gap-20 md:grid-cols-2", children: [
943
+ children: /* @__PURE__ */ jsx("div", { className: "relative", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 items-center gap-8 md:gap-20 md:grid-cols-2", children: [
944
944
  /* @__PURE__ */ jsxs(
945
945
  "div",
946
946
  {
@@ -1006,30 +1006,39 @@ function HeroDashedBorderFeatures({
1006
1006
  const renderActions = React.useMemo(() => {
1007
1007
  if (actionsSlot) return actionsSlot;
1008
1008
  if (!actions || actions.length === 0) return null;
1009
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col md:flex-row gap-4", actionsClassName), children: actions.map((action, index) => {
1010
- const {
1011
- label,
1012
- icon,
1013
- iconAfter,
1014
- children,
1015
- className: actionClassName,
1016
- ...pressableProps
1017
- } = action;
1018
- return /* @__PURE__ */ jsxRuntime.jsx(
1019
- Pressable,
1020
- {
1021
- asButton: true,
1022
- className: actionClassName,
1023
- ...pressableProps,
1024
- children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1025
- icon,
1009
+ return /* @__PURE__ */ jsxRuntime.jsx(
1010
+ "div",
1011
+ {
1012
+ className: cn(
1013
+ "flex flex-col items-center justify-center mt-4 md:flex-row gap-4",
1014
+ actionsClassName
1015
+ ),
1016
+ children: actions.map((action, index) => {
1017
+ const {
1026
1018
  label,
1027
- iconAfter
1028
- ] })
1029
- },
1030
- index
1031
- );
1032
- }) });
1019
+ icon,
1020
+ iconAfter,
1021
+ children,
1022
+ className: actionClassName,
1023
+ ...pressableProps
1024
+ } = action;
1025
+ return /* @__PURE__ */ jsxRuntime.jsx(
1026
+ Pressable,
1027
+ {
1028
+ asButton: true,
1029
+ className: actionClassName,
1030
+ ...pressableProps,
1031
+ children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1032
+ icon,
1033
+ label,
1034
+ iconAfter
1035
+ ] })
1036
+ },
1037
+ index
1038
+ );
1039
+ })
1040
+ }
1041
+ );
1033
1042
  }, [actionsSlot, actions, actionsClassName]);
1034
1043
  const renderFeatures = React.useMemo(() => {
1035
1044
  if (featuresSlot) return featuresSlot;
@@ -1084,7 +1093,7 @@ function HeroDashedBorderFeatures({
1084
1093
  "p",
1085
1094
  {
1086
1095
  className: cn(
1087
- "mx-auto mb-6 max-w-2xl text-center lg:text-xl text-balance",
1096
+ "mx-auto mb-8 max-w-2xl text-center lg:text-xl text-balance",
1088
1097
  descriptionClassName
1089
1098
  ),
1090
1099
  children: description
@@ -985,30 +985,39 @@ function HeroDashedBorderFeatures({
985
985
  const renderActions = useMemo(() => {
986
986
  if (actionsSlot) return actionsSlot;
987
987
  if (!actions || actions.length === 0) return null;
988
- return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col md:flex-row gap-4", actionsClassName), children: actions.map((action, index) => {
989
- const {
990
- label,
991
- icon,
992
- iconAfter,
993
- children,
994
- className: actionClassName,
995
- ...pressableProps
996
- } = action;
997
- return /* @__PURE__ */ jsx(
998
- Pressable,
999
- {
1000
- asButton: true,
1001
- className: actionClassName,
1002
- ...pressableProps,
1003
- children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
1004
- icon,
988
+ return /* @__PURE__ */ jsx(
989
+ "div",
990
+ {
991
+ className: cn(
992
+ "flex flex-col items-center justify-center mt-4 md:flex-row gap-4",
993
+ actionsClassName
994
+ ),
995
+ children: actions.map((action, index) => {
996
+ const {
1005
997
  label,
1006
- iconAfter
1007
- ] })
1008
- },
1009
- index
1010
- );
1011
- }) });
998
+ icon,
999
+ iconAfter,
1000
+ children,
1001
+ className: actionClassName,
1002
+ ...pressableProps
1003
+ } = action;
1004
+ return /* @__PURE__ */ jsx(
1005
+ Pressable,
1006
+ {
1007
+ asButton: true,
1008
+ className: actionClassName,
1009
+ ...pressableProps,
1010
+ children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
1011
+ icon,
1012
+ label,
1013
+ iconAfter
1014
+ ] })
1015
+ },
1016
+ index
1017
+ );
1018
+ })
1019
+ }
1020
+ );
1012
1021
  }, [actionsSlot, actions, actionsClassName]);
1013
1022
  const renderFeatures = useMemo(() => {
1014
1023
  if (featuresSlot) return featuresSlot;
@@ -1063,7 +1072,7 @@ function HeroDashedBorderFeatures({
1063
1072
  "p",
1064
1073
  {
1065
1074
  className: cn(
1066
- "mx-auto mb-6 max-w-2xl text-center lg:text-xl text-balance",
1075
+ "mx-auto mb-8 max-w-2xl text-center lg:text-xl text-balance",
1067
1076
  descriptionClassName
1068
1077
  ),
1069
1078
  children: description