@opensite/ui 2.0.8 → 2.1.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 (43) hide show
  1. package/dist/hero-agency-animated-images.cjs +4 -4
  2. package/dist/hero-agency-animated-images.js +4 -4
  3. package/dist/hero-business-carousel-dots.cjs +46 -36
  4. package/dist/hero-business-carousel-dots.js +46 -36
  5. package/dist/hero-coming-soon-countdown.cjs +93 -54
  6. package/dist/hero-coming-soon-countdown.d.cts +31 -6
  7. package/dist/hero-coming-soon-countdown.d.ts +31 -6
  8. package/dist/hero-coming-soon-countdown.js +93 -54
  9. package/dist/hero-creative-studio-stacked.cjs +9 -6
  10. package/dist/hero-creative-studio-stacked.d.cts +5 -1
  11. package/dist/hero-creative-studio-stacked.d.ts +5 -1
  12. package/dist/hero-creative-studio-stacked.js +9 -6
  13. package/dist/hero-customer-support-layered.cjs +1 -1
  14. package/dist/hero-customer-support-layered.js +1 -1
  15. package/dist/hero-developer-tools-code.cjs +2 -2
  16. package/dist/hero-developer-tools-code.js +2 -2
  17. package/dist/hero-digital-agency-fullscreen.cjs +14 -12
  18. package/dist/hero-digital-agency-fullscreen.d.cts +1 -1
  19. package/dist/hero-digital-agency-fullscreen.d.ts +1 -1
  20. package/dist/hero-digital-agency-fullscreen.js +14 -12
  21. package/dist/hero-ecommerce-product-showcase.cjs +76 -57
  22. package/dist/hero-ecommerce-product-showcase.js +76 -57
  23. package/dist/hero-enterprise-security.cjs +81 -60
  24. package/dist/hero-enterprise-security.js +81 -60
  25. package/dist/hero-event-registration.cjs +43 -10
  26. package/dist/hero-event-registration.js +43 -10
  27. package/dist/hero-hiring-animated-text.cjs +661 -639
  28. package/dist/hero-hiring-animated-text.d.cts +1 -9
  29. package/dist/hero-hiring-animated-text.d.ts +1 -9
  30. package/dist/hero-hiring-animated-text.js +657 -635
  31. package/dist/hero-saas-dashboard-preview.cjs +88 -46
  32. package/dist/hero-saas-dashboard-preview.d.cts +34 -19
  33. package/dist/hero-saas-dashboard-preview.d.ts +34 -19
  34. package/dist/hero-saas-dashboard-preview.js +89 -47
  35. package/dist/hero-split-image-newsletter.cjs +91 -49
  36. package/dist/hero-split-image-newsletter.d.cts +33 -18
  37. package/dist/hero-split-image-newsletter.d.ts +33 -18
  38. package/dist/hero-split-image-newsletter.js +92 -50
  39. package/dist/hero-startup-launch-cta.cjs +2 -2
  40. package/dist/hero-startup-launch-cta.js +2 -2
  41. package/dist/registry.cjs +556 -345
  42. package/dist/registry.js +556 -345
  43. package/package.json +1 -1
@@ -7,6 +7,8 @@ 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 forms = require('@page-speed/forms');
11
+ var integration = require('@page-speed/forms/integration');
10
12
 
11
13
  function _interopNamespace(e) {
12
14
  if (e && e.__esModule) return e;
@@ -450,22 +452,6 @@ var Pressable = React__namespace.forwardRef(
450
452
  }
451
453
  );
452
454
  Pressable.displayName = "Pressable";
453
- function Input({ className, type, ...props }) {
454
- return /* @__PURE__ */ jsxRuntime.jsx(
455
- "input",
456
- {
457
- type,
458
- "data-slot": "input",
459
- className: cn(
460
- "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
461
- "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
462
- "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
463
- className
464
- ),
465
- ...props
466
- }
467
- );
468
- }
469
455
  var maxWidthStyles = {
470
456
  sm: "max-w-screen-sm",
471
457
  md: "max-w-screen-md",
@@ -841,11 +827,28 @@ var Section = React__namespace.default.forwardRef(
841
827
  }
842
828
  );
843
829
  Section.displayName = "Section";
830
+ var DEFAULT_FORM_FIELDS = [
831
+ {
832
+ name: "email",
833
+ type: "email",
834
+ label: "Email Address",
835
+ placeholder: "Enter your email",
836
+ required: true,
837
+ columnSpan: 12
838
+ }
839
+ ];
844
840
  function HeroSplitImageNewsletter({
845
841
  heading,
846
842
  description,
847
- newsletterForm,
848
- newsletterFormSlot,
843
+ formFields = DEFAULT_FORM_FIELDS,
844
+ formConfig,
845
+ onSubmit,
846
+ onSuccess,
847
+ onError,
848
+ successMessage,
849
+ buttonAction,
850
+ helperText,
851
+ formSlot,
849
852
  image,
850
853
  imageSlot,
851
854
  background,
@@ -860,36 +863,75 @@ function HeroSplitImageNewsletter({
860
863
  imageClassName,
861
864
  optixFlowConfig
862
865
  }) {
863
- const renderNewsletterForm = React.useMemo(() => {
864
- if (newsletterFormSlot) return newsletterFormSlot;
865
- if (!newsletterForm) return null;
866
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
867
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 sm:flex-row", children: [
868
- /* @__PURE__ */ jsxRuntime.jsx(
869
- Input,
870
- {
871
- type: "email",
872
- placeholder: newsletterForm.placeholder,
873
- className: "h-12 flex-1 rounded-full px-6"
874
- }
875
- ),
876
- newsletterForm.action && /* @__PURE__ */ jsxRuntime.jsxs(
877
- Pressable,
878
- {
879
- href: newsletterForm.action.href,
880
- asButton: true,
881
- variant: newsletterForm.action.variant,
882
- className: newsletterForm.action.className,
883
- children: [
884
- newsletterForm.action.label,
885
- newsletterForm.action.iconAfter
886
- ]
887
- }
888
- )
889
- ] }),
890
- newsletterForm.helperText && (typeof newsletterForm.helperText === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-sm"), children: newsletterForm.helperText }) : newsletterForm.helperText)
891
- ] });
892
- }, [newsletterFormSlot, newsletterForm]);
866
+ const { uploadTokens, uploadProgress, isUploading, uploadFiles, removeFile, resetUpload } = integration.useFileUpload({ onError });
867
+ const { form, submissionError, formMethod, resetSubmissionState } = integration.useContactForm({
868
+ formFields,
869
+ formConfig,
870
+ onSubmit,
871
+ onSuccess: (data) => {
872
+ resetUpload();
873
+ onSuccess?.(data);
874
+ },
875
+ onError,
876
+ uploadTokens
877
+ });
878
+ const renderForm = React.useMemo(() => {
879
+ if (formSlot) return formSlot;
880
+ const defaultButtonAction = {
881
+ label: "Subscribe",
882
+ variant: "default",
883
+ className: "h-12"
884
+ };
885
+ const action = buttonAction || defaultButtonAction;
886
+ return /* @__PURE__ */ jsxRuntime.jsxs(
887
+ forms.Form,
888
+ {
889
+ form,
890
+ notificationConfig: {
891
+ submissionError,
892
+ successMessage
893
+ },
894
+ formConfig: {
895
+ endpoint: formConfig?.endpoint,
896
+ method: formMethod,
897
+ submissionConfig: formConfig?.submissionConfig
898
+ },
899
+ onNewSubmission: () => {
900
+ resetUpload();
901
+ resetSubmissionState();
902
+ },
903
+ children: [
904
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 sm:flex-row", children: [
905
+ formFields.map((field) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsxRuntime.jsx(
906
+ integration.DynamicFormField,
907
+ {
908
+ field,
909
+ uploadProgress,
910
+ onFileUpload: uploadFiles,
911
+ onFileRemove: removeFile,
912
+ isUploading
913
+ }
914
+ ) }, field.name)),
915
+ /* @__PURE__ */ jsxRuntime.jsxs(
916
+ Pressable,
917
+ {
918
+ onClick: form.handleSubmit,
919
+ asButton: true,
920
+ variant: action.variant,
921
+ className: cn("h-12", action.className),
922
+ disabled: form.isSubmitting,
923
+ children: [
924
+ action.label,
925
+ action.iconAfter
926
+ ]
927
+ }
928
+ )
929
+ ] }),
930
+ helperText && (typeof helperText === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-sm mt-2"), children: helperText }) : helperText)
931
+ ]
932
+ }
933
+ );
934
+ }, [formSlot, formFields, form, formConfig, formMethod, buttonAction, uploadProgress, uploadFiles, removeFile, isUploading, submissionError, successMessage, helperText, resetUpload, resetSubmissionState]);
893
935
  const renderImage = React.useMemo(() => {
894
936
  if (imageSlot) return imageSlot;
895
937
  if (!image) return null;
@@ -954,7 +996,7 @@ function HeroSplitImageNewsletter({
954
996
  children: description
955
997
  }
956
998
  ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description })),
957
- renderNewsletterForm
999
+ renderForm
958
1000
  ]
959
1001
  }
960
1002
  ),
@@ -1,42 +1,57 @@
1
1
  import * as React from 'react';
2
2
  import { f as SectionBackground, g as SectionSpacing, t as PatternName } from './community-initiatives-Bz_A5vLU.cjs';
3
+ import { FormFieldConfig, PageSpeedFormConfig } from '@page-speed/forms/integration';
3
4
  import { A as ActionConfig, I as ImageItem, O as OptixFlowConfig } from './blocks-Cohq4eio.cjs';
4
5
  import 'react/jsx-runtime';
5
6
  import 'class-variance-authority';
6
7
  import './button-variants-lRElsmTc.cjs';
7
8
  import 'class-variance-authority/types';
8
9
 
9
- interface NewsletterFormConfig {
10
+ interface HeroSplitImageNewsletterProps {
10
11
  /**
11
- * Input placeholder text
12
+ * Main heading content
12
13
  */
13
- placeholder?: string;
14
+ heading?: React.ReactNode;
14
15
  /**
15
- * Submit button action
16
+ * Description text below heading
16
17
  */
17
- action?: ActionConfig;
18
+ description?: React.ReactNode;
18
19
  /**
19
- * Helper text below form
20
+ * Form field configuration
20
21
  */
21
- helperText?: React.ReactNode;
22
- }
23
- interface HeroSplitImageNewsletterProps {
22
+ formFields?: FormFieldConfig[];
24
23
  /**
25
- * Main heading content
24
+ * Form configuration for submission
26
25
  */
27
- heading?: React.ReactNode;
26
+ formConfig?: PageSpeedFormConfig;
28
27
  /**
29
- * Description text below heading
28
+ * Custom submit handler
30
29
  */
31
- description?: React.ReactNode;
30
+ onSubmit?: (values: Record<string, any>) => void | Promise<void>;
31
+ /**
32
+ * Success callback
33
+ */
34
+ onSuccess?: (data: unknown) => void;
32
35
  /**
33
- * Newsletter form configuration
36
+ * Error callback
34
37
  */
35
- newsletterForm?: NewsletterFormConfig;
38
+ onError?: (error: Error) => void;
39
+ /**
40
+ * Success message to display
41
+ */
42
+ successMessage?: React.ReactNode;
43
+ /**
44
+ * Submit button configuration
45
+ */
46
+ buttonAction?: ActionConfig;
47
+ /**
48
+ * Helper text below form
49
+ */
50
+ helperText?: React.ReactNode;
36
51
  /**
37
- * Custom slot for newsletter form (overrides newsletterForm prop)
52
+ * Custom slot for form (overrides form props)
38
53
  */
39
- newsletterFormSlot?: React.ReactNode;
54
+ formSlot?: React.ReactNode;
40
55
  /**
41
56
  * Feature image on the right side
42
57
  */
@@ -89,6 +104,6 @@ interface HeroSplitImageNewsletterProps {
89
104
  */
90
105
  optixFlowConfig?: OptixFlowConfig;
91
106
  }
92
- declare function HeroSplitImageNewsletter({ heading, description, newsletterForm, newsletterFormSlot, image, imageSlot, background, spacing, containerClassName, pattern, patternOpacity, className, contentClassName, headingClassName, descriptionClassName, imageClassName, optixFlowConfig, }: HeroSplitImageNewsletterProps): React.JSX.Element;
107
+ declare function HeroSplitImageNewsletter({ heading, description, formFields, formConfig, onSubmit, onSuccess, onError, successMessage, buttonAction, helperText, formSlot, image, imageSlot, background, spacing, containerClassName, pattern, patternOpacity, className, contentClassName, headingClassName, descriptionClassName, imageClassName, optixFlowConfig, }: HeroSplitImageNewsletterProps): React.JSX.Element;
93
108
 
94
109
  export { HeroSplitImageNewsletter, type HeroSplitImageNewsletterProps };
@@ -1,42 +1,57 @@
1
1
  import * as React from 'react';
2
2
  import { f as SectionBackground, g as SectionSpacing, t as PatternName } from './community-initiatives-Bi_ClKrO.js';
3
+ import { FormFieldConfig, PageSpeedFormConfig } from '@page-speed/forms/integration';
3
4
  import { A as ActionConfig, I as ImageItem, O as OptixFlowConfig } from './blocks-k17uluAz.js';
4
5
  import 'react/jsx-runtime';
5
6
  import 'class-variance-authority';
6
7
  import './button-variants-lRElsmTc.js';
7
8
  import 'class-variance-authority/types';
8
9
 
9
- interface NewsletterFormConfig {
10
+ interface HeroSplitImageNewsletterProps {
10
11
  /**
11
- * Input placeholder text
12
+ * Main heading content
12
13
  */
13
- placeholder?: string;
14
+ heading?: React.ReactNode;
14
15
  /**
15
- * Submit button action
16
+ * Description text below heading
16
17
  */
17
- action?: ActionConfig;
18
+ description?: React.ReactNode;
18
19
  /**
19
- * Helper text below form
20
+ * Form field configuration
20
21
  */
21
- helperText?: React.ReactNode;
22
- }
23
- interface HeroSplitImageNewsletterProps {
22
+ formFields?: FormFieldConfig[];
24
23
  /**
25
- * Main heading content
24
+ * Form configuration for submission
26
25
  */
27
- heading?: React.ReactNode;
26
+ formConfig?: PageSpeedFormConfig;
28
27
  /**
29
- * Description text below heading
28
+ * Custom submit handler
30
29
  */
31
- description?: React.ReactNode;
30
+ onSubmit?: (values: Record<string, any>) => void | Promise<void>;
31
+ /**
32
+ * Success callback
33
+ */
34
+ onSuccess?: (data: unknown) => void;
32
35
  /**
33
- * Newsletter form configuration
36
+ * Error callback
34
37
  */
35
- newsletterForm?: NewsletterFormConfig;
38
+ onError?: (error: Error) => void;
39
+ /**
40
+ * Success message to display
41
+ */
42
+ successMessage?: React.ReactNode;
43
+ /**
44
+ * Submit button configuration
45
+ */
46
+ buttonAction?: ActionConfig;
47
+ /**
48
+ * Helper text below form
49
+ */
50
+ helperText?: React.ReactNode;
36
51
  /**
37
- * Custom slot for newsletter form (overrides newsletterForm prop)
52
+ * Custom slot for form (overrides form props)
38
53
  */
39
- newsletterFormSlot?: React.ReactNode;
54
+ formSlot?: React.ReactNode;
40
55
  /**
41
56
  * Feature image on the right side
42
57
  */
@@ -89,6 +104,6 @@ interface HeroSplitImageNewsletterProps {
89
104
  */
90
105
  optixFlowConfig?: OptixFlowConfig;
91
106
  }
92
- declare function HeroSplitImageNewsletter({ heading, description, newsletterForm, newsletterFormSlot, image, imageSlot, background, spacing, containerClassName, pattern, patternOpacity, className, contentClassName, headingClassName, descriptionClassName, imageClassName, optixFlowConfig, }: HeroSplitImageNewsletterProps): React.JSX.Element;
107
+ declare function HeroSplitImageNewsletter({ heading, description, formFields, formConfig, onSubmit, onSuccess, onError, successMessage, buttonAction, helperText, formSlot, image, imageSlot, background, spacing, containerClassName, pattern, patternOpacity, className, contentClassName, headingClassName, descriptionClassName, imageClassName, optixFlowConfig, }: HeroSplitImageNewsletterProps): React.JSX.Element;
93
108
 
94
109
  export { HeroSplitImageNewsletter, type HeroSplitImageNewsletterProps };
@@ -4,8 +4,10 @@ import React__default, { useMemo } from 'react';
4
4
  import { clsx } from 'clsx';
5
5
  import { twMerge } from 'tailwind-merge';
6
6
  import { cva } from 'class-variance-authority';
7
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
8
  import { Img } from '@page-speed/img';
9
+ import { Form } from '@page-speed/forms';
10
+ import { useFileUpload, useContactForm, DynamicFormField } from '@page-speed/forms/integration';
9
11
 
10
12
  // components/blocks/hero/hero-split-image-newsletter.tsx
11
13
  function cn(...inputs) {
@@ -429,22 +431,6 @@ var Pressable = React.forwardRef(
429
431
  }
430
432
  );
431
433
  Pressable.displayName = "Pressable";
432
- function Input({ className, type, ...props }) {
433
- return /* @__PURE__ */ jsx(
434
- "input",
435
- {
436
- type,
437
- "data-slot": "input",
438
- className: cn(
439
- "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
440
- "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
441
- "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
442
- className
443
- ),
444
- ...props
445
- }
446
- );
447
- }
448
434
  var maxWidthStyles = {
449
435
  sm: "max-w-screen-sm",
450
436
  md: "max-w-screen-md",
@@ -820,11 +806,28 @@ var Section = React__default.forwardRef(
820
806
  }
821
807
  );
822
808
  Section.displayName = "Section";
809
+ var DEFAULT_FORM_FIELDS = [
810
+ {
811
+ name: "email",
812
+ type: "email",
813
+ label: "Email Address",
814
+ placeholder: "Enter your email",
815
+ required: true,
816
+ columnSpan: 12
817
+ }
818
+ ];
823
819
  function HeroSplitImageNewsletter({
824
820
  heading,
825
821
  description,
826
- newsletterForm,
827
- newsletterFormSlot,
822
+ formFields = DEFAULT_FORM_FIELDS,
823
+ formConfig,
824
+ onSubmit,
825
+ onSuccess,
826
+ onError,
827
+ successMessage,
828
+ buttonAction,
829
+ helperText,
830
+ formSlot,
828
831
  image,
829
832
  imageSlot,
830
833
  background,
@@ -839,36 +842,75 @@ function HeroSplitImageNewsletter({
839
842
  imageClassName,
840
843
  optixFlowConfig
841
844
  }) {
842
- const renderNewsletterForm = useMemo(() => {
843
- if (newsletterFormSlot) return newsletterFormSlot;
844
- if (!newsletterForm) return null;
845
- return /* @__PURE__ */ jsxs(Fragment, { children: [
846
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row", children: [
847
- /* @__PURE__ */ jsx(
848
- Input,
849
- {
850
- type: "email",
851
- placeholder: newsletterForm.placeholder,
852
- className: "h-12 flex-1 rounded-full px-6"
853
- }
854
- ),
855
- newsletterForm.action && /* @__PURE__ */ jsxs(
856
- Pressable,
857
- {
858
- href: newsletterForm.action.href,
859
- asButton: true,
860
- variant: newsletterForm.action.variant,
861
- className: newsletterForm.action.className,
862
- children: [
863
- newsletterForm.action.label,
864
- newsletterForm.action.iconAfter
865
- ]
866
- }
867
- )
868
- ] }),
869
- newsletterForm.helperText && (typeof newsletterForm.helperText === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-sm"), children: newsletterForm.helperText }) : newsletterForm.helperText)
870
- ] });
871
- }, [newsletterFormSlot, newsletterForm]);
845
+ const { uploadTokens, uploadProgress, isUploading, uploadFiles, removeFile, resetUpload } = useFileUpload({ onError });
846
+ const { form, submissionError, formMethod, resetSubmissionState } = useContactForm({
847
+ formFields,
848
+ formConfig,
849
+ onSubmit,
850
+ onSuccess: (data) => {
851
+ resetUpload();
852
+ onSuccess?.(data);
853
+ },
854
+ onError,
855
+ uploadTokens
856
+ });
857
+ const renderForm = useMemo(() => {
858
+ if (formSlot) return formSlot;
859
+ const defaultButtonAction = {
860
+ label: "Subscribe",
861
+ variant: "default",
862
+ className: "h-12"
863
+ };
864
+ const action = buttonAction || defaultButtonAction;
865
+ return /* @__PURE__ */ jsxs(
866
+ Form,
867
+ {
868
+ form,
869
+ notificationConfig: {
870
+ submissionError,
871
+ successMessage
872
+ },
873
+ formConfig: {
874
+ endpoint: formConfig?.endpoint,
875
+ method: formMethod,
876
+ submissionConfig: formConfig?.submissionConfig
877
+ },
878
+ onNewSubmission: () => {
879
+ resetUpload();
880
+ resetSubmissionState();
881
+ },
882
+ children: [
883
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 sm:flex-row", children: [
884
+ formFields.map((field) => /* @__PURE__ */ jsx("div", { className: "flex-1", children: /* @__PURE__ */ jsx(
885
+ DynamicFormField,
886
+ {
887
+ field,
888
+ uploadProgress,
889
+ onFileUpload: uploadFiles,
890
+ onFileRemove: removeFile,
891
+ isUploading
892
+ }
893
+ ) }, field.name)),
894
+ /* @__PURE__ */ jsxs(
895
+ Pressable,
896
+ {
897
+ onClick: form.handleSubmit,
898
+ asButton: true,
899
+ variant: action.variant,
900
+ className: cn("h-12", action.className),
901
+ disabled: form.isSubmitting,
902
+ children: [
903
+ action.label,
904
+ action.iconAfter
905
+ ]
906
+ }
907
+ )
908
+ ] }),
909
+ helperText && (typeof helperText === "string" ? /* @__PURE__ */ jsx("p", { className: cn("text-sm mt-2"), children: helperText }) : helperText)
910
+ ]
911
+ }
912
+ );
913
+ }, [formSlot, formFields, form, formConfig, formMethod, buttonAction, uploadProgress, uploadFiles, removeFile, isUploading, submissionError, successMessage, helperText, resetUpload, resetSubmissionState]);
872
914
  const renderImage = useMemo(() => {
873
915
  if (imageSlot) return imageSlot;
874
916
  if (!image) return null;
@@ -933,7 +975,7 @@ function HeroSplitImageNewsletter({
933
975
  children: description
934
976
  }
935
977
  ) : /* @__PURE__ */ jsx("div", { className: descriptionClassName, children: description })),
936
- renderNewsletterForm
978
+ renderForm
937
979
  ]
938
980
  }
939
981
  ),
@@ -1008,7 +1008,7 @@ function HeroStartupLaunchCta({
1008
1008
  "h1",
1009
1009
  {
1010
1010
  className: cn(
1011
- "mb-8 text-4xl font-normal text-balance md:text-7xl",
1011
+ "text-4xl font-normal text-balance md:text-7xl",
1012
1012
  headingClassName
1013
1013
  ),
1014
1014
  children: heading
@@ -1018,7 +1018,7 @@ function HeroStartupLaunchCta({
1018
1018
  "p",
1019
1019
  {
1020
1020
  className: cn(
1021
- "mb-12 max-w-full md:max-w-[70%] text-lg md:text-xl font-normal text-balance",
1021
+ "max-w-full md:max-w-[70%] text-lg md:text-xl font-normal text-balance",
1022
1022
  descriptionClassName
1023
1023
  ),
1024
1024
  children: description
@@ -987,7 +987,7 @@ function HeroStartupLaunchCta({
987
987
  "h1",
988
988
  {
989
989
  className: cn(
990
- "mb-8 text-4xl font-normal text-balance md:text-7xl",
990
+ "text-4xl font-normal text-balance md:text-7xl",
991
991
  headingClassName
992
992
  ),
993
993
  children: heading
@@ -997,7 +997,7 @@ function HeroStartupLaunchCta({
997
997
  "p",
998
998
  {
999
999
  className: cn(
1000
- "mb-12 max-w-full md:max-w-[70%] text-lg md:text-xl font-normal text-balance",
1000
+ "max-w-full md:max-w-[70%] text-lg md:text-xl font-normal text-balance",
1001
1001
  descriptionClassName
1002
1002
  ),
1003
1003
  children: description