@opensite/ui 1.9.8 → 2.0.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 (131) hide show
  1. package/dist/contact-demo.cjs +106 -406
  2. package/dist/contact-demo.d.cts +36 -111
  3. package/dist/contact-demo.d.ts +36 -111
  4. package/dist/contact-demo.js +108 -405
  5. package/dist/contact-emergency.cjs +129 -158
  6. package/dist/contact-emergency.d.cts +23 -12
  7. package/dist/contact-emergency.d.ts +23 -12
  8. package/dist/contact-emergency.js +131 -159
  9. package/dist/contact-event.cjs +106 -147
  10. package/dist/contact-event.d.cts +36 -66
  11. package/dist/contact-event.d.ts +36 -66
  12. package/dist/contact-event.js +108 -148
  13. package/dist/contact-feedback.cjs +109 -102
  14. package/dist/contact-feedback.d.cts +36 -63
  15. package/dist/contact-feedback.d.ts +36 -63
  16. package/dist/contact-feedback.js +111 -103
  17. package/dist/contact-fitness.cjs +107 -148
  18. package/dist/contact-fitness.d.cts +36 -66
  19. package/dist/contact-fitness.d.ts +36 -66
  20. package/dist/contact-fitness.js +109 -149
  21. package/dist/contact-guest.cjs +107 -148
  22. package/dist/contact-guest.d.cts +35 -65
  23. package/dist/contact-guest.d.ts +35 -65
  24. package/dist/contact-guest.js +109 -149
  25. package/dist/contact-image.cjs +108 -149
  26. package/dist/contact-image.d.cts +35 -65
  27. package/dist/contact-image.d.ts +35 -65
  28. package/dist/contact-image.js +110 -150
  29. package/dist/contact-insurance.cjs +107 -148
  30. package/dist/contact-insurance.d.cts +36 -66
  31. package/dist/contact-insurance.d.ts +36 -66
  32. package/dist/contact-insurance.js +109 -149
  33. package/dist/contact-interview.cjs +106 -147
  34. package/dist/contact-interview.d.cts +20 -12
  35. package/dist/contact-interview.d.ts +20 -12
  36. package/dist/contact-interview.js +108 -148
  37. package/dist/contact-locations.cjs +106 -147
  38. package/dist/contact-locations.d.cts +21 -13
  39. package/dist/contact-locations.d.ts +21 -13
  40. package/dist/contact-locations.js +108 -148
  41. package/dist/contact-maintenance.cjs +103 -143
  42. package/dist/contact-maintenance.d.cts +21 -13
  43. package/dist/contact-maintenance.d.ts +21 -13
  44. package/dist/contact-maintenance.js +105 -144
  45. package/dist/contact-map.cjs +103 -143
  46. package/dist/contact-map.d.cts +20 -12
  47. package/dist/contact-map.d.ts +20 -12
  48. package/dist/contact-map.js +105 -144
  49. package/dist/contact-minimal.cjs +126 -242
  50. package/dist/contact-minimal.d.cts +36 -70
  51. package/dist/contact-minimal.d.ts +36 -70
  52. package/dist/contact-minimal.js +128 -243
  53. package/dist/contact-moving.cjs +103 -143
  54. package/dist/contact-moving.d.cts +20 -12
  55. package/dist/contact-moving.d.ts +20 -12
  56. package/dist/contact-moving.js +105 -144
  57. package/dist/contact-multistep.cjs +104 -144
  58. package/dist/contact-multistep.d.cts +21 -13
  59. package/dist/contact-multistep.d.ts +21 -13
  60. package/dist/contact-multistep.js +106 -145
  61. package/dist/contact-partnership.cjs +103 -143
  62. package/dist/contact-partnership.d.cts +19 -11
  63. package/dist/contact-partnership.d.ts +19 -11
  64. package/dist/contact-partnership.js +105 -144
  65. package/dist/contact-press.cjs +144 -150
  66. package/dist/contact-press.d.cts +21 -13
  67. package/dist/contact-press.d.ts +21 -13
  68. package/dist/contact-press.js +146 -151
  69. package/dist/contact-quote.cjs +144 -150
  70. package/dist/contact-quote.d.cts +19 -11
  71. package/dist/contact-quote.d.ts +19 -11
  72. package/dist/contact-quote.js +146 -151
  73. package/dist/contact-referral.cjs +144 -150
  74. package/dist/contact-referral.d.cts +20 -12
  75. package/dist/contact-referral.d.ts +20 -12
  76. package/dist/contact-referral.js +146 -151
  77. package/dist/contact-report.cjs +144 -150
  78. package/dist/contact-report.d.cts +21 -13
  79. package/dist/contact-report.d.ts +21 -13
  80. package/dist/contact-report.js +146 -151
  81. package/dist/contact-reservation.cjs +144 -150
  82. package/dist/contact-reservation.d.cts +20 -12
  83. package/dist/contact-reservation.d.ts +20 -12
  84. package/dist/contact-reservation.js +146 -151
  85. package/dist/contact-retreat.cjs +144 -150
  86. package/dist/contact-retreat.d.cts +21 -13
  87. package/dist/contact-retreat.d.ts +21 -13
  88. package/dist/contact-retreat.js +146 -151
  89. package/dist/contact-rsvp.cjs +144 -150
  90. package/dist/contact-rsvp.d.cts +20 -12
  91. package/dist/contact-rsvp.d.ts +20 -12
  92. package/dist/contact-rsvp.js +146 -151
  93. package/dist/contact-sales.cjs +131 -146
  94. package/dist/contact-sales.d.cts +34 -65
  95. package/dist/contact-sales.d.ts +34 -65
  96. package/dist/contact-sales.js +133 -147
  97. package/dist/contact-schedule.cjs +144 -150
  98. package/dist/contact-schedule.d.cts +20 -12
  99. package/dist/contact-schedule.d.ts +20 -12
  100. package/dist/contact-schedule.js +146 -151
  101. package/dist/contact-sponsorship.cjs +144 -150
  102. package/dist/contact-sponsorship.d.cts +21 -13
  103. package/dist/contact-sponsorship.d.ts +21 -13
  104. package/dist/contact-sponsorship.js +146 -151
  105. package/dist/contact-support.cjs +147 -120
  106. package/dist/contact-support.d.cts +21 -12
  107. package/dist/contact-support.d.ts +21 -12
  108. package/dist/contact-support.js +149 -121
  109. package/dist/contact-tenant.cjs +144 -150
  110. package/dist/contact-tenant.d.cts +20 -12
  111. package/dist/contact-tenant.d.ts +20 -12
  112. package/dist/contact-tenant.js +146 -151
  113. package/dist/contact-vendor.cjs +144 -150
  114. package/dist/contact-vendor.d.cts +20 -12
  115. package/dist/contact-vendor.d.ts +20 -12
  116. package/dist/contact-vendor.js +146 -151
  117. package/dist/contact-volunteer.cjs +144 -150
  118. package/dist/contact-volunteer.d.cts +20 -12
  119. package/dist/contact-volunteer.d.ts +20 -12
  120. package/dist/contact-volunteer.js +146 -151
  121. package/dist/contact-warranty.cjs +144 -150
  122. package/dist/contact-warranty.d.cts +20 -12
  123. package/dist/contact-warranty.d.ts +20 -12
  124. package/dist/contact-warranty.js +146 -151
  125. package/dist/contact-wedding.cjs +144 -150
  126. package/dist/contact-wedding.d.cts +20 -12
  127. package/dist/contact-wedding.d.ts +20 -12
  128. package/dist/contact-wedding.js +146 -151
  129. package/dist/registry.cjs +5791 -5883
  130. package/dist/registry.js +4527 -4619
  131. package/package.json +2 -2
@@ -3,13 +3,11 @@
3
3
 
4
4
  var React = require('react');
5
5
  var forms = require('@page-speed/forms');
6
- var inputs = require('@page-speed/forms/inputs');
6
+ var integration = require('@page-speed/forms/integration');
7
7
  var clsx = require('clsx');
8
8
  var tailwindMerge = require('tailwind-merge');
9
9
  var classVarianceAuthority = require('class-variance-authority');
10
10
  var jsxRuntime = require('react/jsx-runtime');
11
- var LabelPrimitive = require('@radix-ui/react-label');
12
- var integration = require('@page-speed/forms/integration');
13
11
 
14
12
  function _interopNamespace(e) {
15
13
  if (e && e.__esModule) return e;
@@ -30,11 +28,8 @@ function _interopNamespace(e) {
30
28
  }
31
29
 
32
30
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
33
- var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
34
31
 
35
32
  // components/blocks/contact/contact-support.tsx
36
- var TextInput = inputs.TextInput;
37
- var TextArea = inputs.TextArea;
38
33
  function cn(...inputs) {
39
34
  return tailwindMerge.twMerge(clsx.clsx(inputs));
40
35
  }
@@ -479,22 +474,6 @@ function CardContent({ className, ...props }) {
479
474
  }
480
475
  );
481
476
  }
482
- function Label({
483
- className,
484
- ...props
485
- }) {
486
- return /* @__PURE__ */ jsxRuntime.jsx(
487
- LabelPrimitive__namespace.Root,
488
- {
489
- "data-slot": "label",
490
- className: cn(
491
- "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
492
- className
493
- ),
494
- ...props
495
- }
496
- );
497
- }
498
477
  var maxWidthStyles = {
499
478
  sm: "max-w-screen-sm",
500
479
  md: "max-w-screen-md",
@@ -870,15 +849,60 @@ var Section = React__namespace.default.forwardRef(
870
849
  }
871
850
  );
872
851
  Section.displayName = "Section";
852
+ var DEFAULT_FORM_FIELDS = [
853
+ {
854
+ name: "first_name",
855
+ type: "text",
856
+ label: "First Name",
857
+ placeholder: "John",
858
+ required: true,
859
+ columnSpan: 6
860
+ },
861
+ {
862
+ name: "last_name",
863
+ type: "text",
864
+ label: "Last Name",
865
+ placeholder: "Doe",
866
+ required: true,
867
+ columnSpan: 6
868
+ },
869
+ {
870
+ name: "email",
871
+ type: "email",
872
+ label: "Email",
873
+ placeholder: "john@example.com",
874
+ required: true,
875
+ columnSpan: 12
876
+ },
877
+ {
878
+ name: "phone",
879
+ type: "tel",
880
+ label: "Phone",
881
+ placeholder: "+1 (555) 000-0000",
882
+ required: true,
883
+ columnSpan: 12
884
+ },
885
+ {
886
+ name: "message",
887
+ type: "textarea",
888
+ label: "Message",
889
+ placeholder: "Your message...",
890
+ required: true,
891
+ rows: 4,
892
+ columnSpan: 12
893
+ }
894
+ ];
873
895
  function ContactSupport({
874
896
  heading,
875
897
  description,
876
- buttonText,
898
+ buttonText = "Submit",
877
899
  buttonIcon,
878
900
  actions,
879
901
  actionsSlot,
902
+ formFields = DEFAULT_FORM_FIELDS,
903
+ successMessage = "Thank you! Your message has been sent successfully.",
880
904
  className,
881
- containerClassName,
905
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
882
906
  headerClassName,
883
907
  headingClassName,
884
908
  descriptionClassName,
@@ -886,6 +910,8 @@ function ContactSupport({
886
910
  cardContentClassName,
887
911
  formClassName,
888
912
  submitClassName,
913
+ successMessageClassName,
914
+ errorMessageClassName,
889
915
  background = "white",
890
916
  spacing = "xl",
891
917
  pattern,
@@ -895,61 +921,52 @@ function ContactSupport({
895
921
  onSuccess,
896
922
  onError
897
923
  }) {
898
- const form = forms.useForm({
899
- initialValues: {
900
- name: "",
901
- email: "",
902
- message: ""
903
- },
904
- validationSchema: {
905
- name: (value) => !value ? "Name is required" : void 0,
906
- email: (value) => {
907
- if (!value) return "Email is required";
908
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value))
909
- return "Please enter a valid email address";
910
- return void 0;
911
- },
912
- message: (value) => !value ? "Message is required" : void 0
924
+ const {
925
+ uploadTokens,
926
+ uploadProgress,
927
+ isUploading,
928
+ uploadFiles,
929
+ removeFile,
930
+ resetUpload
931
+ } = integration.useFileUpload({ onError });
932
+ const { form, submissionError, formMethod, resetSubmissionState } = integration.useContactForm({
933
+ formFields,
934
+ formConfig,
935
+ onSubmit,
936
+ onSuccess: (data) => {
937
+ resetUpload();
938
+ onSuccess?.(data);
913
939
  },
914
- onSubmit: async (values, helpers) => {
915
- const shouldAutoSubmit = Boolean(formConfig?.endpoint);
916
- if (!shouldAutoSubmit && !onSubmit) {
917
- return;
918
- }
919
- try {
920
- let result;
921
- if (shouldAutoSubmit) {
922
- result = await integration.submitPageSpeedForm(values, formConfig);
923
- }
924
- if (onSubmit) {
925
- await onSubmit(values);
926
- }
927
- if (shouldAutoSubmit || onSubmit) {
928
- if (formConfig?.resetOnSuccess !== false) {
929
- helpers.resetForm();
930
- }
931
- onSuccess?.(result);
932
- }
933
- } catch (error) {
934
- if (error instanceof integration.PageSpeedFormSubmissionError && error.formErrors) {
935
- helpers.setErrors(error.formErrors);
936
- }
937
- onError?.(error);
938
- throw error;
939
- }
940
- }
940
+ onError,
941
+ resetOnSuccess: formConfig?.resetOnSuccess !== false,
942
+ uploadTokens
941
943
  });
942
- const formMethod = formConfig?.method?.toLowerCase() === "get" ? "get" : "post";
943
- const actionsContent = React__namespace.useMemo(() => {
944
+ const actionsContent = React.useMemo(() => {
944
945
  if (actionsSlot) return actionsSlot;
945
946
  if (actions && actions.length > 0) {
946
947
  return actions.map((action, index) => {
947
- const { label, icon, iconAfter, children, className: actionClassName, ...pressableProps } = action;
948
- return /* @__PURE__ */ jsxRuntime.jsx(Pressable, { asButton: true, className: actionClassName, ...pressableProps, children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
949
- icon,
948
+ const {
950
949
  label,
951
- iconAfter
952
- ] }) }, index);
950
+ icon,
951
+ iconAfter,
952
+ children,
953
+ className: actionClassName,
954
+ ...pressableProps
955
+ } = action;
956
+ return /* @__PURE__ */ jsxRuntime.jsx(
957
+ Pressable,
958
+ {
959
+ asButton: true,
960
+ className: actionClassName,
961
+ ...pressableProps,
962
+ children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
963
+ icon,
964
+ label,
965
+ iconAfter
966
+ ] })
967
+ },
968
+ index
969
+ );
953
970
  });
954
971
  }
955
972
  return null;
@@ -962,60 +979,70 @@ function ContactSupport({
962
979
  pattern,
963
980
  patternOpacity,
964
981
  className: cn("py-12", className),
965
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mx-auto max-w-4xl px-4", containerClassName), children: [
982
+ containerClassName,
983
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto max-w-4xl", children: [
966
984
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mb-10 text-center", headerClassName), children: [
967
- /* @__PURE__ */ jsxRuntime.jsx("h2", { className: cn("mb-3 text-3xl font-bold tracking-tight", headingClassName), children: heading }),
968
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("leading-relaxed text-muted-foreground", descriptionClassName), children: description })
985
+ heading && (typeof heading === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
986
+ "h2",
987
+ {
988
+ className: cn(
989
+ "mb-3 text-3xl font-bold tracking-tight text-balance",
990
+ headingClassName
991
+ ),
992
+ children: heading
993
+ }
994
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: headingClassName, children: heading })),
995
+ description && (typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
996
+ "p",
997
+ {
998
+ className: cn(
999
+ "leading-relaxed text-balance",
1000
+ descriptionClassName
1001
+ ),
1002
+ children: description
1003
+ }
1004
+ ) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: descriptionClassName, children: description }))
969
1005
  ] }),
970
1006
  /* @__PURE__ */ jsxRuntime.jsx(Card, { className: cn("mx-auto max-w-xl", cardClassName), children: /* @__PURE__ */ jsxRuntime.jsx(CardContent, { className: cn("p-6 lg:p-8", cardContentClassName), children: /* @__PURE__ */ jsxRuntime.jsxs(
971
1007
  forms.Form,
972
1008
  {
973
1009
  form,
974
- action: formConfig?.endpoint,
975
- method: formMethod,
976
- className: cn("space-y-4", formClassName),
1010
+ notificationConfig: {
1011
+ submissionError,
1012
+ successMessage
1013
+ },
1014
+ styleConfig: {
1015
+ formClassName: cn("space-y-4", formClassName),
1016
+ successMessageClassName,
1017
+ errorMessageClassName
1018
+ },
1019
+ formConfig: {
1020
+ endpoint: formConfig?.endpoint,
1021
+ method: formMethod,
1022
+ submissionConfig: formConfig?.submissionConfig
1023
+ },
1024
+ onNewSubmission: () => {
1025
+ resetUpload();
1026
+ resetSubmissionState();
1027
+ },
977
1028
  children: [
978
- /* @__PURE__ */ jsxRuntime.jsx(forms.Field, { name: "name", children: ({ field, meta }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
979
- /* @__PURE__ */ jsxRuntime.jsx(Label, { htmlFor: "name", children: "Name" }),
980
- /* @__PURE__ */ jsxRuntime.jsx(
981
- TextInput,
982
- {
983
- ...field,
984
- id: "name",
985
- placeholder: "Your name",
986
- error: meta.touched && !!meta.error,
987
- "aria-label": "Name"
988
- }
989
- )
990
- ] }) }),
991
- /* @__PURE__ */ jsxRuntime.jsx(forms.Field, { name: "email", children: ({ field, meta }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
992
- /* @__PURE__ */ jsxRuntime.jsx(Label, { htmlFor: "email", children: "Email" }),
993
- /* @__PURE__ */ jsxRuntime.jsx(
994
- TextInput,
995
- {
996
- ...field,
997
- id: "email",
998
- type: "email",
999
- placeholder: "your@email.com",
1000
- error: meta.touched && !!meta.error,
1001
- "aria-label": "Email"
1002
- }
1003
- )
1004
- ] }) }),
1005
- /* @__PURE__ */ jsxRuntime.jsx(forms.Field, { name: "message", children: ({ field, meta }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
1006
- /* @__PURE__ */ jsxRuntime.jsx(Label, { htmlFor: "message", children: "Message" }),
1007
- /* @__PURE__ */ jsxRuntime.jsx(
1008
- TextArea,
1009
- {
1010
- ...field,
1011
- id: "message",
1012
- placeholder: "Describe your issue...",
1013
- rows: 4,
1014
- error: meta.touched && !!meta.error,
1015
- "aria-label": "Message"
1016
- }
1017
- )
1018
- ] }) }),
1029
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-12 gap-6", children: formFields.map((field) => /* @__PURE__ */ jsxRuntime.jsx(
1030
+ "div",
1031
+ {
1032
+ className: integration.getColumnSpanClass(field.columnSpan),
1033
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1034
+ integration.DynamicFormField,
1035
+ {
1036
+ field,
1037
+ uploadProgress,
1038
+ onFileUpload: uploadFiles,
1039
+ onFileRemove: removeFile,
1040
+ isUploading
1041
+ }
1042
+ )
1043
+ },
1044
+ field.name
1045
+ )) }),
1019
1046
  actionsSlot || actions && actions.length > 0 ? actionsContent : /* @__PURE__ */ jsxRuntime.jsxs(
1020
1047
  Pressable,
1021
1048
  {
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { PageSpeedFormConfig } from '@page-speed/forms/integration';
2
+ import { FormFieldConfig, PageSpeedFormConfig } from '@page-speed/forms/integration';
3
3
  import { f as SectionBackground, g as SectionSpacing, t as PatternName } from './community-initiatives-Bz_A5vLU.cjs';
4
4
  import { A as ActionConfig } from './blocks-Cohq4eio.cjs';
5
5
  import 'react/jsx-runtime';
@@ -7,11 +7,6 @@ import 'class-variance-authority';
7
7
  import './button-variants-lRElsmTc.cjs';
8
8
  import 'class-variance-authority/types';
9
9
 
10
- interface ContactSupportFormValues {
11
- name: string;
12
- email: string;
13
- message: string;
14
- }
15
10
  interface ContactSupportProps {
16
11
  /** Main heading text */
17
12
  heading?: React.ReactNode;
@@ -25,6 +20,16 @@ interface ContactSupportProps {
25
20
  actions?: ActionConfig[];
26
21
  /** Custom slot for rendering actions (overrides actions array) */
27
22
  actionsSlot?: React.ReactNode;
23
+ /**
24
+ * Array of form field configurations
25
+ * If not provided, defaults to: first_name, last_name, email, phone, message
26
+ */
27
+ formFields?: FormFieldConfig[];
28
+ /**
29
+ * Success message to display after form submission
30
+ * @default "Thank you! Your message has been sent successfully."
31
+ */
32
+ successMessage?: React.ReactNode;
28
33
  /** Additional CSS classes for the section */
29
34
  className?: string;
30
35
  /** Additional CSS classes for the container */
@@ -42,7 +47,12 @@ interface ContactSupportProps {
42
47
  /** Additional CSS classes for the form */
43
48
  formClassName?: string;
44
49
  /** Additional CSS classes for the submit button */
45
- submitClassName?: string; /**
50
+ submitClassName?: string;
51
+ /** Additional CSS classes for the success message */
52
+ successMessageClassName?: string;
53
+ /** Additional CSS classes for the error message */
54
+ errorMessageClassName?: string;
55
+ /**
46
56
  * Background style for the section
47
57
  */
48
58
  background?: SectionBackground;
@@ -61,24 +71,23 @@ interface ContactSupportProps {
61
71
  /** Form configuration for PageSpeed forms */
62
72
  formConfig?: PageSpeedFormConfig;
63
73
  /** Custom submit handler */
64
- onSubmit?: (values: ContactSupportFormValues) => void | Promise<void>;
74
+ onSubmit?: (values: Record<string, any>) => void | Promise<void>;
65
75
  /** Success callback */
66
76
  onSuccess?: (data: unknown) => void;
67
77
  /** Error callback */
68
78
  onError?: (error: Error) => void;
69
79
  }
70
80
  /**
71
- * ContactSupport - Support contact form with essential fields.
72
- * Perfect for customer support and help desk scenarios.
81
+ * ContactSupport - Contact form with flexible field configuration
73
82
  *
74
83
  * @example
75
84
  * ```tsx
76
85
  * <ContactSupport
77
- * heading="How can we help?"
86
+ * heading="Get Support"
78
87
  * formConfig={{ endpoint: "/api/contact", format: "json" }}
79
88
  * />
80
89
  * ```
81
90
  */
82
- declare function ContactSupport({ heading, description, buttonText, buttonIcon, actions, actionsSlot, className, containerClassName, headerClassName, headingClassName, descriptionClassName, cardClassName, cardContentClassName, formClassName, submitClassName, background, spacing, pattern, patternOpacity, formConfig, onSubmit, onSuccess, onError, }: ContactSupportProps): React.JSX.Element;
91
+ declare function ContactSupport({ heading, description, buttonText, buttonIcon, actions, actionsSlot, formFields, successMessage, className, containerClassName, headerClassName, headingClassName, descriptionClassName, cardClassName, cardContentClassName, formClassName, submitClassName, successMessageClassName, errorMessageClassName, background, spacing, pattern, patternOpacity, formConfig, onSubmit, onSuccess, onError, }: ContactSupportProps): React.JSX.Element;
83
92
 
84
93
  export { ContactSupport, type ContactSupportProps };
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { PageSpeedFormConfig } from '@page-speed/forms/integration';
2
+ import { FormFieldConfig, PageSpeedFormConfig } from '@page-speed/forms/integration';
3
3
  import { f as SectionBackground, g as SectionSpacing, t as PatternName } from './community-initiatives-Bi_ClKrO.js';
4
4
  import { A as ActionConfig } from './blocks-k17uluAz.js';
5
5
  import 'react/jsx-runtime';
@@ -7,11 +7,6 @@ import 'class-variance-authority';
7
7
  import './button-variants-lRElsmTc.js';
8
8
  import 'class-variance-authority/types';
9
9
 
10
- interface ContactSupportFormValues {
11
- name: string;
12
- email: string;
13
- message: string;
14
- }
15
10
  interface ContactSupportProps {
16
11
  /** Main heading text */
17
12
  heading?: React.ReactNode;
@@ -25,6 +20,16 @@ interface ContactSupportProps {
25
20
  actions?: ActionConfig[];
26
21
  /** Custom slot for rendering actions (overrides actions array) */
27
22
  actionsSlot?: React.ReactNode;
23
+ /**
24
+ * Array of form field configurations
25
+ * If not provided, defaults to: first_name, last_name, email, phone, message
26
+ */
27
+ formFields?: FormFieldConfig[];
28
+ /**
29
+ * Success message to display after form submission
30
+ * @default "Thank you! Your message has been sent successfully."
31
+ */
32
+ successMessage?: React.ReactNode;
28
33
  /** Additional CSS classes for the section */
29
34
  className?: string;
30
35
  /** Additional CSS classes for the container */
@@ -42,7 +47,12 @@ interface ContactSupportProps {
42
47
  /** Additional CSS classes for the form */
43
48
  formClassName?: string;
44
49
  /** Additional CSS classes for the submit button */
45
- submitClassName?: string; /**
50
+ submitClassName?: string;
51
+ /** Additional CSS classes for the success message */
52
+ successMessageClassName?: string;
53
+ /** Additional CSS classes for the error message */
54
+ errorMessageClassName?: string;
55
+ /**
46
56
  * Background style for the section
47
57
  */
48
58
  background?: SectionBackground;
@@ -61,24 +71,23 @@ interface ContactSupportProps {
61
71
  /** Form configuration for PageSpeed forms */
62
72
  formConfig?: PageSpeedFormConfig;
63
73
  /** Custom submit handler */
64
- onSubmit?: (values: ContactSupportFormValues) => void | Promise<void>;
74
+ onSubmit?: (values: Record<string, any>) => void | Promise<void>;
65
75
  /** Success callback */
66
76
  onSuccess?: (data: unknown) => void;
67
77
  /** Error callback */
68
78
  onError?: (error: Error) => void;
69
79
  }
70
80
  /**
71
- * ContactSupport - Support contact form with essential fields.
72
- * Perfect for customer support and help desk scenarios.
81
+ * ContactSupport - Contact form with flexible field configuration
73
82
  *
74
83
  * @example
75
84
  * ```tsx
76
85
  * <ContactSupport
77
- * heading="How can we help?"
86
+ * heading="Get Support"
78
87
  * formConfig={{ endpoint: "/api/contact", format: "json" }}
79
88
  * />
80
89
  * ```
81
90
  */
82
- declare function ContactSupport({ heading, description, buttonText, buttonIcon, actions, actionsSlot, className, containerClassName, headerClassName, headingClassName, descriptionClassName, cardClassName, cardContentClassName, formClassName, submitClassName, background, spacing, pattern, patternOpacity, formConfig, onSubmit, onSuccess, onError, }: ContactSupportProps): React.JSX.Element;
91
+ declare function ContactSupport({ heading, description, buttonText, buttonIcon, actions, actionsSlot, formFields, successMessage, className, containerClassName, headerClassName, headingClassName, descriptionClassName, cardClassName, cardContentClassName, formClassName, submitClassName, successMessageClassName, errorMessageClassName, background, spacing, pattern, patternOpacity, formConfig, onSubmit, onSuccess, onError, }: ContactSupportProps): React.JSX.Element;
83
92
 
84
93
  export { ContactSupport, type ContactSupportProps };