@bettercms-ai/next 0.5.2

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/form.d.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { ReactElement } from 'react';
2
+ import { DeliveryForm } from '@bettercms-ai/sdk';
3
+
4
+ /**
5
+ * <BcmsForm> — render a BetterCMS form natively in React, the headless way.
6
+ *
7
+ * Pass a form straight from your content snapshot (`readSnapshot().forms[n]`) or
8
+ * the delivery API. It renders real inputs (no iframe), handles conditional
9
+ * `showIf` fields, URL-query prefill, the honeypot, an optional Turnstile widget,
10
+ * and submits via `@bettercms-ai/sdk`'s `submitForm`. All visible markup is
11
+ * unstyled and class-driven, so the host site owns the look.
12
+ */
13
+
14
+ interface BcmsFormProps {
15
+ /** A form from your content snapshot or the delivery API. */
16
+ form: DeliveryForm;
17
+ /** API origin. Defaults to the SDK default (https://api.bettercms.ai). */
18
+ apiBase?: string;
19
+ /** Turnstile site key — needed to render the widget when `form.turnstileEnabled`. */
20
+ turnstileSiteKey?: string;
21
+ /** Called with the new submission id after a successful submit (before any redirect). */
22
+ onSubmitted?: (submissionId: string) => void;
23
+ /** Class for the <form> element; field wrappers/status use `bcms-*` classes. */
24
+ className?: string;
25
+ }
26
+ declare function BcmsForm({ form, apiBase, turnstileSiteKey, onSubmitted, className, }: BcmsFormProps): ReactElement;
27
+
28
+ export { BcmsForm, type BcmsFormProps };
package/dist/form.js ADDED
@@ -0,0 +1,203 @@
1
+ "use client";
2
+ "use client";
3
+
4
+ // src/form.tsx
5
+ import { useEffect, useMemo, useState } from "react";
6
+ import {
7
+ submitForm,
8
+ shouldShowField,
9
+ formInitialValues
10
+ } from "@bettercms-ai/sdk";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ var TURNSTILE_SRC = "https://challenges.cloudflare.com/turnstile/v0/api.js";
13
+ var INPUT_TYPES = {
14
+ text: "text",
15
+ email: "email",
16
+ phone: "tel",
17
+ url: "url",
18
+ number: "number",
19
+ date: "date"
20
+ };
21
+ function readPrefill() {
22
+ if (typeof window === "undefined") return {};
23
+ const out = {};
24
+ new URLSearchParams(window.location.search).forEach((v, k) => {
25
+ out[k] = v;
26
+ });
27
+ return out;
28
+ }
29
+ function resetTurnstile() {
30
+ const t = globalThis.turnstile;
31
+ if (t) {
32
+ try {
33
+ t.reset();
34
+ } catch {
35
+ }
36
+ }
37
+ }
38
+ function BcmsForm({
39
+ form,
40
+ apiBase,
41
+ turnstileSiteKey,
42
+ onSubmitted,
43
+ className
44
+ }) {
45
+ const showTurnstile = Boolean(form.turnstileEnabled && turnstileSiteKey);
46
+ const [values, setValues] = useState(() => {
47
+ const init = formInitialValues(form, readPrefill());
48
+ if (form.honeypotField) init[form.honeypotField] = "";
49
+ return init;
50
+ });
51
+ const [status, setStatus] = useState({ state: "idle" });
52
+ const [fieldErrors, setFieldErrors] = useState({});
53
+ useEffect(() => {
54
+ if (!showTurnstile || document.querySelector(`script[src="${TURNSTILE_SRC}"]`)) return;
55
+ const script = document.createElement("script");
56
+ script.src = TURNSTILE_SRC;
57
+ script.async = true;
58
+ script.defer = true;
59
+ document.head.appendChild(script);
60
+ }, [showTurnstile]);
61
+ const visibleFields = useMemo(
62
+ () => form.fields.filter((f) => f.type !== "hidden" && shouldShowField(f, values)),
63
+ [form.fields, values]
64
+ );
65
+ const setValue = (key, value) => setValues((prev) => ({ ...prev, [key]: value }));
66
+ async function handleSubmit(e) {
67
+ e.preventDefault();
68
+ setStatus({ state: "submitting" });
69
+ setFieldErrors({});
70
+ const tokenEl = e.currentTarget.querySelector(
71
+ '[name="cf-turnstile-response"]'
72
+ );
73
+ const turnstileToken = tokenEl?.value || void 0;
74
+ const data = {};
75
+ for (const field of form.fields) {
76
+ if (field.type === "hidden" || shouldShowField(field, values)) {
77
+ data[field.key] = values[field.key];
78
+ }
79
+ }
80
+ if (form.honeypotField) data[form.honeypotField] = values[form.honeypotField] ?? "";
81
+ try {
82
+ const { id } = await submitForm({ formId: form.id, data, turnstileToken, baseUrl: apiBase });
83
+ onSubmitted?.(id);
84
+ if (form.redirectUrl) {
85
+ window.location.href = form.redirectUrl;
86
+ return;
87
+ }
88
+ const reset = formInitialValues(form);
89
+ if (form.honeypotField) reset[form.honeypotField] = "";
90
+ setValues(reset);
91
+ setStatus({
92
+ state: "success",
93
+ message: form.successMessage ?? "Thanks! Your submission was received."
94
+ });
95
+ resetTurnstile();
96
+ } catch (err) {
97
+ const e2 = err;
98
+ if (e2.fieldErrors) setFieldErrors(e2.fieldErrors);
99
+ setStatus({ state: "error", message: e2.message || "Something went wrong. Please try again." });
100
+ resetTurnstile();
101
+ }
102
+ }
103
+ return /* @__PURE__ */ jsxs("form", { className, onSubmit: handleSubmit, noValidate: true, children: [
104
+ visibleFields.map((field) => /* @__PURE__ */ jsx(
105
+ Field,
106
+ {
107
+ field,
108
+ value: values[field.key],
109
+ error: fieldErrors[field.key],
110
+ onChange: (v) => setValue(field.key, v)
111
+ },
112
+ field.key
113
+ )),
114
+ form.honeypotField ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", style: { position: "absolute", left: "-9999px" }, children: /* @__PURE__ */ jsx(
115
+ "input",
116
+ {
117
+ type: "text",
118
+ name: form.honeypotField,
119
+ tabIndex: -1,
120
+ autoComplete: "off",
121
+ value: String(values[form.honeypotField] ?? ""),
122
+ onChange: (e) => setValue(form.honeypotField, e.target.value)
123
+ }
124
+ ) }) : null,
125
+ showTurnstile ? /* @__PURE__ */ jsx("div", { className: "cf-turnstile", "data-sitekey": turnstileSiteKey }) : null,
126
+ /* @__PURE__ */ jsx("button", { type: "submit", disabled: status.state === "submitting", children: status.state === "submitting" ? "Submitting\u2026" : form.submitLabel ?? "Submit" }),
127
+ status.message ? /* @__PURE__ */ jsx(
128
+ "p",
129
+ {
130
+ className: `bcms-form-status bcms-form-status--${status.state}`,
131
+ role: "status",
132
+ "aria-live": "polite",
133
+ children: status.message
134
+ }
135
+ ) : null
136
+ ] });
137
+ }
138
+ function Field({ field, value, error, onChange }) {
139
+ const required = field.required;
140
+ const errorNode = error ? /* @__PURE__ */ jsx("span", { className: "bcms-field-error", role: "alert", children: error }) : null;
141
+ if (field.type === "checkbox" || field.type === "consent") {
142
+ return /* @__PURE__ */ jsxs("label", { className: "bcms-field bcms-field--checkbox", "data-field": field.key, children: [
143
+ /* @__PURE__ */ jsx(
144
+ "input",
145
+ {
146
+ type: "checkbox",
147
+ name: field.key,
148
+ required,
149
+ checked: Boolean(value),
150
+ onChange: (e) => onChange(e.target.checked)
151
+ }
152
+ ),
153
+ " ",
154
+ field.label,
155
+ required ? " *" : "",
156
+ errorNode
157
+ ] });
158
+ }
159
+ const str = String(value ?? "");
160
+ let control;
161
+ if (field.type === "textarea") {
162
+ control = /* @__PURE__ */ jsx(
163
+ "textarea",
164
+ {
165
+ name: field.key,
166
+ placeholder: field.placeholder,
167
+ required,
168
+ value: str,
169
+ onChange: (e) => onChange(e.target.value)
170
+ }
171
+ );
172
+ } else if (field.type === "select") {
173
+ control = /* @__PURE__ */ jsxs("select", { name: field.key, required, value: str, onChange: (e) => onChange(e.target.value), children: [
174
+ /* @__PURE__ */ jsx("option", { value: "", disabled: true, children: "Choose\u2026" }),
175
+ (field.options ?? []).map((opt) => /* @__PURE__ */ jsx("option", { value: opt, children: opt }, opt))
176
+ ] });
177
+ } else {
178
+ control = /* @__PURE__ */ jsx(
179
+ "input",
180
+ {
181
+ type: INPUT_TYPES[field.type] ?? "text",
182
+ name: field.key,
183
+ placeholder: field.placeholder,
184
+ required,
185
+ value: str,
186
+ onChange: (e) => onChange(e.target.value)
187
+ }
188
+ );
189
+ }
190
+ return /* @__PURE__ */ jsxs("p", { className: "bcms-field", "data-field": field.key, children: [
191
+ /* @__PURE__ */ jsxs("label", { children: [
192
+ field.label,
193
+ required ? " *" : ""
194
+ ] }),
195
+ /* @__PURE__ */ jsx("br", {}),
196
+ control,
197
+ errorNode
198
+ ] });
199
+ }
200
+ export {
201
+ BcmsForm
202
+ };
203
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/form.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * <BcmsForm> — render a BetterCMS form natively in React, the headless way.\n *\n * Pass a form straight from your content snapshot (`readSnapshot().forms[n]`) or\n * the delivery API. It renders real inputs (no iframe), handles conditional\n * `showIf` fields, URL-query prefill, the honeypot, an optional Turnstile widget,\n * and submits via `@bettercms-ai/sdk`'s `submitForm`. All visible markup is\n * unstyled and class-driven, so the host site owns the look.\n */\n\nimport { useEffect, useMemo, useState, type FormEvent, type ReactElement } from \"react\";\nimport {\n submitForm,\n shouldShowField,\n formInitialValues,\n type DeliveryForm,\n type DeliveryFormField,\n type FormValues,\n type FormSubmitError,\n} from \"@bettercms-ai/sdk\";\n\nconst TURNSTILE_SRC = \"https://challenges.cloudflare.com/turnstile/v0/api.js\";\n\n// Field type → native <input type>. Other types render their own element.\nconst INPUT_TYPES: Partial<Record<DeliveryFormField[\"type\"], string>> = {\n text: \"text\",\n email: \"email\",\n phone: \"tel\",\n url: \"url\",\n number: \"number\",\n date: \"date\",\n};\n\nexport interface BcmsFormProps {\n /** A form from your content snapshot or the delivery API. */\n form: DeliveryForm;\n /** API origin. Defaults to the SDK default (https://api.bettercms.ai). */\n apiBase?: string;\n /** Turnstile site key — needed to render the widget when `form.turnstileEnabled`. */\n turnstileSiteKey?: string;\n /** Called with the new submission id after a successful submit (before any redirect). */\n onSubmitted?: (submissionId: string) => void;\n /** Class for the <form> element; field wrappers/status use `bcms-*` classes. */\n className?: string;\n}\n\ntype Status = { state: \"idle\" | \"submitting\" | \"error\" | \"success\"; message?: string };\n\nfunction readPrefill(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n const out: Record<string, string> = {};\n new URLSearchParams(window.location.search).forEach((v, k) => {\n out[k] = v;\n });\n return out;\n}\n\nfunction resetTurnstile(): void {\n const t = (globalThis as { turnstile?: { reset: () => void } }).turnstile;\n if (t) {\n try {\n t.reset();\n } catch {\n /* widget not mounted yet */\n }\n }\n}\n\nexport function BcmsForm({\n form,\n apiBase,\n turnstileSiteKey,\n onSubmitted,\n className,\n}: BcmsFormProps): ReactElement {\n const showTurnstile = Boolean(form.turnstileEnabled && turnstileSiteKey);\n const [values, setValues] = useState<FormValues>(() => {\n const init = formInitialValues(form, readPrefill());\n if (form.honeypotField) init[form.honeypotField] = \"\";\n return init;\n });\n const [status, setStatus] = useState<Status>({ state: \"idle\" });\n const [fieldErrors, setFieldErrors] = useState<Record<string, string>>({});\n\n // Cloudflare auto-renders any `.cf-turnstile` element once its script is present.\n useEffect(() => {\n if (!showTurnstile || document.querySelector(`script[src=\"${TURNSTILE_SRC}\"]`)) return;\n const script = document.createElement(\"script\");\n script.src = TURNSTILE_SRC;\n script.async = true;\n script.defer = true;\n document.head.appendChild(script);\n }, [showTurnstile]);\n\n const visibleFields = useMemo(\n () => form.fields.filter((f) => f.type !== \"hidden\" && shouldShowField(f, values)),\n [form.fields, values],\n );\n\n const setValue = (key: string, value: string | boolean) =>\n setValues((prev) => ({ ...prev, [key]: value }));\n\n async function handleSubmit(e: FormEvent<HTMLFormElement>): Promise<void> {\n e.preventDefault();\n setStatus({ state: \"submitting\" });\n setFieldErrors({});\n\n const tokenEl = e.currentTarget.querySelector<HTMLInputElement>(\n '[name=\"cf-turnstile-response\"]',\n );\n const turnstileToken = tokenEl?.value || undefined;\n\n // Drop conditionally-hidden fields so a hidden required field can't block submit;\n // keep hidden-type fields and the honeypot (the API classifies bots on it).\n const data: FormValues = {};\n for (const field of form.fields) {\n if (field.type === \"hidden\" || shouldShowField(field, values)) {\n data[field.key] = values[field.key];\n }\n }\n if (form.honeypotField) data[form.honeypotField] = values[form.honeypotField] ?? \"\";\n\n try {\n const { id } = await submitForm({ formId: form.id, data, turnstileToken, baseUrl: apiBase });\n onSubmitted?.(id);\n if (form.redirectUrl) {\n window.location.href = form.redirectUrl;\n return;\n }\n const reset = formInitialValues(form);\n if (form.honeypotField) reset[form.honeypotField] = \"\";\n setValues(reset);\n setStatus({\n state: \"success\",\n message: form.successMessage ?? \"Thanks! Your submission was received.\",\n });\n resetTurnstile();\n } catch (err) {\n const e2 = err as FormSubmitError;\n if (e2.fieldErrors) setFieldErrors(e2.fieldErrors);\n setStatus({ state: \"error\", message: e2.message || \"Something went wrong. Please try again.\" });\n resetTurnstile();\n }\n }\n\n return (\n <form className={className} onSubmit={handleSubmit} noValidate>\n {visibleFields.map((field) => (\n <Field\n key={field.key}\n field={field}\n value={values[field.key]}\n error={fieldErrors[field.key]}\n onChange={(v) => setValue(field.key, v)}\n />\n ))}\n\n {form.honeypotField ? (\n <span aria-hidden=\"true\" style={{ position: \"absolute\", left: \"-9999px\" }}>\n <input\n type=\"text\"\n name={form.honeypotField}\n tabIndex={-1}\n autoComplete=\"off\"\n value={String(values[form.honeypotField] ?? \"\")}\n onChange={(e) => setValue(form.honeypotField as string, e.target.value)}\n />\n </span>\n ) : null}\n\n {showTurnstile ? <div className=\"cf-turnstile\" data-sitekey={turnstileSiteKey} /> : null}\n\n <button type=\"submit\" disabled={status.state === \"submitting\"}>\n {status.state === \"submitting\" ? \"Submitting…\" : form.submitLabel ?? \"Submit\"}\n </button>\n\n {status.message ? (\n <p\n className={`bcms-form-status bcms-form-status--${status.state}`}\n role=\"status\"\n aria-live=\"polite\"\n >\n {status.message}\n </p>\n ) : null}\n </form>\n );\n}\n\ninterface FieldProps {\n field: DeliveryFormField;\n value: string | boolean;\n error?: string;\n onChange: (value: string | boolean) => void;\n}\n\nfunction Field({ field, value, error, onChange }: FieldProps): ReactElement {\n const required = field.required;\n const errorNode = error ? (\n <span className=\"bcms-field-error\" role=\"alert\">\n {error}\n </span>\n ) : null;\n\n if (field.type === \"checkbox\" || field.type === \"consent\") {\n return (\n <label className=\"bcms-field bcms-field--checkbox\" data-field={field.key}>\n <input\n type=\"checkbox\"\n name={field.key}\n required={required}\n checked={Boolean(value)}\n onChange={(e) => onChange(e.target.checked)}\n />{\" \"}\n {field.label}\n {required ? \" *\" : \"\"}\n {errorNode}\n </label>\n );\n }\n\n const str = String(value ?? \"\");\n let control: ReactElement;\n if (field.type === \"textarea\") {\n control = (\n <textarea\n name={field.key}\n placeholder={field.placeholder}\n required={required}\n value={str}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n } else if (field.type === \"select\") {\n control = (\n <select name={field.key} required={required} value={str} onChange={(e) => onChange(e.target.value)}>\n <option value=\"\" disabled>\n Choose…\n </option>\n {(field.options ?? []).map((opt) => (\n <option key={opt} value={opt}>\n {opt}\n </option>\n ))}\n </select>\n );\n } else {\n control = (\n <input\n type={INPUT_TYPES[field.type] ?? \"text\"}\n name={field.key}\n placeholder={field.placeholder}\n required={required}\n value={str}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n return (\n <p className=\"bcms-field\" data-field={field.key}>\n <label>\n {field.label}\n {required ? \" *\" : \"\"}\n </label>\n <br />\n {control}\n {errorNode}\n </p>\n );\n}\n"],"mappings":"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","names":[]}