@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.
- package/dist/hero-agency-animated-images.cjs +4 -4
- package/dist/hero-agency-animated-images.js +4 -4
- package/dist/hero-business-carousel-dots.cjs +46 -36
- package/dist/hero-business-carousel-dots.js +46 -36
- package/dist/hero-coming-soon-countdown.cjs +93 -54
- package/dist/hero-coming-soon-countdown.d.cts +31 -6
- package/dist/hero-coming-soon-countdown.d.ts +31 -6
- package/dist/hero-coming-soon-countdown.js +93 -54
- package/dist/hero-creative-studio-stacked.cjs +9 -6
- package/dist/hero-creative-studio-stacked.d.cts +5 -1
- package/dist/hero-creative-studio-stacked.d.ts +5 -1
- package/dist/hero-creative-studio-stacked.js +9 -6
- package/dist/hero-customer-support-layered.cjs +1 -1
- package/dist/hero-customer-support-layered.js +1 -1
- package/dist/hero-developer-tools-code.cjs +2 -2
- package/dist/hero-developer-tools-code.js +2 -2
- package/dist/hero-digital-agency-fullscreen.cjs +14 -12
- package/dist/hero-digital-agency-fullscreen.d.cts +1 -1
- package/dist/hero-digital-agency-fullscreen.d.ts +1 -1
- package/dist/hero-digital-agency-fullscreen.js +14 -12
- package/dist/hero-ecommerce-product-showcase.cjs +76 -57
- package/dist/hero-ecommerce-product-showcase.js +76 -57
- package/dist/hero-enterprise-security.cjs +81 -60
- package/dist/hero-enterprise-security.js +81 -60
- package/dist/hero-event-registration.cjs +43 -10
- package/dist/hero-event-registration.js +43 -10
- package/dist/hero-hiring-animated-text.cjs +661 -639
- package/dist/hero-hiring-animated-text.d.cts +1 -9
- package/dist/hero-hiring-animated-text.d.ts +1 -9
- package/dist/hero-hiring-animated-text.js +657 -635
- package/dist/hero-saas-dashboard-preview.cjs +88 -46
- package/dist/hero-saas-dashboard-preview.d.cts +34 -19
- package/dist/hero-saas-dashboard-preview.d.ts +34 -19
- package/dist/hero-saas-dashboard-preview.js +89 -47
- package/dist/hero-split-image-newsletter.cjs +91 -49
- package/dist/hero-split-image-newsletter.d.cts +33 -18
- package/dist/hero-split-image-newsletter.d.ts +33 -18
- package/dist/hero-split-image-newsletter.js +92 -50
- package/dist/hero-startup-launch-cta.cjs +2 -2
- package/dist/hero-startup-launch-cta.js +2 -2
- package/dist/registry.cjs +556 -345
- package/dist/registry.js +556 -345
- 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
|
-
|
|
848
|
-
|
|
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
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
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
|
-
|
|
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
|
|
10
|
+
interface HeroSplitImageNewsletterProps {
|
|
10
11
|
/**
|
|
11
|
-
*
|
|
12
|
+
* Main heading content
|
|
12
13
|
*/
|
|
13
|
-
|
|
14
|
+
heading?: React.ReactNode;
|
|
14
15
|
/**
|
|
15
|
-
*
|
|
16
|
+
* Description text below heading
|
|
16
17
|
*/
|
|
17
|
-
|
|
18
|
+
description?: React.ReactNode;
|
|
18
19
|
/**
|
|
19
|
-
*
|
|
20
|
+
* Form field configuration
|
|
20
21
|
*/
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
interface HeroSplitImageNewsletterProps {
|
|
22
|
+
formFields?: FormFieldConfig[];
|
|
24
23
|
/**
|
|
25
|
-
*
|
|
24
|
+
* Form configuration for submission
|
|
26
25
|
*/
|
|
27
|
-
|
|
26
|
+
formConfig?: PageSpeedFormConfig;
|
|
28
27
|
/**
|
|
29
|
-
*
|
|
28
|
+
* Custom submit handler
|
|
30
29
|
*/
|
|
31
|
-
|
|
30
|
+
onSubmit?: (values: Record<string, any>) => void | Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Success callback
|
|
33
|
+
*/
|
|
34
|
+
onSuccess?: (data: unknown) => void;
|
|
32
35
|
/**
|
|
33
|
-
*
|
|
36
|
+
* Error callback
|
|
34
37
|
*/
|
|
35
|
-
|
|
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
|
|
52
|
+
* Custom slot for form (overrides form props)
|
|
38
53
|
*/
|
|
39
|
-
|
|
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,
|
|
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
|
|
10
|
+
interface HeroSplitImageNewsletterProps {
|
|
10
11
|
/**
|
|
11
|
-
*
|
|
12
|
+
* Main heading content
|
|
12
13
|
*/
|
|
13
|
-
|
|
14
|
+
heading?: React.ReactNode;
|
|
14
15
|
/**
|
|
15
|
-
*
|
|
16
|
+
* Description text below heading
|
|
16
17
|
*/
|
|
17
|
-
|
|
18
|
+
description?: React.ReactNode;
|
|
18
19
|
/**
|
|
19
|
-
*
|
|
20
|
+
* Form field configuration
|
|
20
21
|
*/
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
interface HeroSplitImageNewsletterProps {
|
|
22
|
+
formFields?: FormFieldConfig[];
|
|
24
23
|
/**
|
|
25
|
-
*
|
|
24
|
+
* Form configuration for submission
|
|
26
25
|
*/
|
|
27
|
-
|
|
26
|
+
formConfig?: PageSpeedFormConfig;
|
|
28
27
|
/**
|
|
29
|
-
*
|
|
28
|
+
* Custom submit handler
|
|
30
29
|
*/
|
|
31
|
-
|
|
30
|
+
onSubmit?: (values: Record<string, any>) => void | Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Success callback
|
|
33
|
+
*/
|
|
34
|
+
onSuccess?: (data: unknown) => void;
|
|
32
35
|
/**
|
|
33
|
-
*
|
|
36
|
+
* Error callback
|
|
34
37
|
*/
|
|
35
|
-
|
|
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
|
|
52
|
+
* Custom slot for form (overrides form props)
|
|
38
53
|
*/
|
|
39
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
827
|
-
|
|
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
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
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
|
-
|
|
978
|
+
renderForm
|
|
937
979
|
]
|
|
938
980
|
}
|
|
939
981
|
),
|
|
@@ -1008,7 +1008,7 @@ function HeroStartupLaunchCta({
|
|
|
1008
1008
|
"h1",
|
|
1009
1009
|
{
|
|
1010
1010
|
className: cn(
|
|
1011
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|