@beechcms/forms-react 1.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.
- package/dist/components/BeechForm.d.ts +4 -0
- package/dist/components/BeechForm.d.ts.map +1 -0
- package/dist/components/BeechForm.js +11 -0
- package/dist/components/BeechForm.js.map +1 -0
- package/dist/components/FormField.d.ts +4 -0
- package/dist/components/FormField.d.ts.map +1 -0
- package/dist/components/FormField.js +16 -0
- package/dist/components/FormField.js.map +1 -0
- package/dist/components/HoneypotField.d.ts +6 -0
- package/dist/components/HoneypotField.d.ts.map +1 -0
- package/dist/components/HoneypotField.js +11 -0
- package/dist/components/HoneypotField.js.map +1 -0
- package/dist/core/conditional-logic.d.ts +4 -0
- package/dist/core/conditional-logic.d.ts.map +1 -0
- package/dist/core/conditional-logic.js +47 -0
- package/dist/core/conditional-logic.js.map +1 -0
- package/dist/core/draft-storage.d.ts +5 -0
- package/dist/core/draft-storage.d.ts.map +1 -0
- package/dist/core/draft-storage.js +51 -0
- package/dist/core/draft-storage.js.map +1 -0
- package/dist/core/file-uploader.d.ts +30 -0
- package/dist/core/file-uploader.d.ts.map +1 -0
- package/dist/core/file-uploader.js +70 -0
- package/dist/core/file-uploader.js.map +1 -0
- package/dist/core/honeypot.d.ts +5 -0
- package/dist/core/honeypot.d.ts.map +1 -0
- package/dist/core/honeypot.js +15 -0
- package/dist/core/honeypot.js.map +1 -0
- package/dist/core/time-trap.d.ts +9 -0
- package/dist/core/time-trap.d.ts.map +1 -0
- package/dist/core/time-trap.js +21 -0
- package/dist/core/time-trap.js.map +1 -0
- package/dist/examples/ClientiTestPage.d.ts +27 -0
- package/dist/examples/ClientiTestPage.d.ts.map +1 -0
- package/dist/examples/ClientiTestPage.js +105 -0
- package/dist/examples/ClientiTestPage.js.map +1 -0
- package/dist/hooks/useBeechForm.d.ts +3 -0
- package/dist/hooks/useBeechForm.d.ts.map +1 -0
- package/dist/hooks/useBeechForm.js +422 -0
- package/dist/hooks/useBeechForm.js.map +1 -0
- package/dist/i18n/translations.d.ts +5 -0
- package/dist/i18n/translations.d.ts.map +1 -0
- package/dist/i18n/translations.js +39 -0
- package/dist/i18n/translations.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/playground.d.ts +2 -0
- package/dist/playground.d.ts.map +1 -0
- package/dist/playground.js +15 -0
- package/dist/playground.js.map +1 -0
- package/dist/types.d.ts +138 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BeechForm.d.ts","sourceRoot":"","sources":["../../src/components/BeechForm.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAKjD,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAsDxC,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useBeechForm } from '../hooks/useBeechForm.js';
|
|
3
|
+
import { Honeypot } from './HoneypotField.js';
|
|
4
|
+
import { FormField } from './FormField.js';
|
|
5
|
+
export const BeechForm = (props) => {
|
|
6
|
+
const { className = 'beech-form', children, ...options } = props;
|
|
7
|
+
const form = useBeechForm(options);
|
|
8
|
+
const schema = form.schema;
|
|
9
|
+
return (_jsxs("form", { className: className, onSubmit: form.handleSubmit, noValidate: true, children: [_jsx(Honeypot, { form: form }), form.isDraftRestored && !form.isSuccess && (_jsxs("div", { className: "beech-alert beech-alert-info", role: "status", children: [_jsx("span", { children: form.translations.draftRestored }), _jsx("button", { type: "button", onClick: form.clearDraft, className: "beech-btn-link", children: "\u00D7" })] })), form.serverError && (_jsxs("div", { className: "beech-alert beech-alert-error", role: "alert", children: [_jsxs("strong", { children: [form.translations.errorTitle, ": "] }), _jsx("span", { children: form.serverError })] })), form.isLoadingSchema ? (_jsxs("div", { className: "beech-loading-schema", style: { padding: '24px 0', textAlign: 'center', color: '#6b7280' }, children: [_jsx("span", { style: { display: 'inline-block', animation: 'spin 1s linear infinite' }, children: "\u23F3" }), " Caricamento schema form in corso..."] })) : form.isSuccess ? (_jsxs("div", { className: "beech-alert beech-alert-success", role: "status", children: [_jsx("h3", { children: form.translations.successTitle }), _jsx("p", { children: form.translations.successMessage })] })) : typeof children === 'function' ? (children(form)) : children ? (children) : schema ? (_jsxs(_Fragment, { children: [schema.branches.map((branch) => (_jsx(FormField, { branch: branch, form: form }, branch.alias))), _jsx("button", { type: "submit", disabled: form.isSubmitting, className: "beech-submit-btn", children: form.isSubmitting ? form.translations.submittingButton : form.translations.submitButton })] })) : null] }));
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=BeechForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BeechForm.js","sourceRoot":"","sources":["../../src/components/BeechForm.tsx"],"names":[],"mappings":";AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,MAAM,CAAC,MAAM,SAAS,GAAuB,CAAC,KAAK,EAAE,EAAE;IACrD,MAAM,EAAE,SAAS,GAAG,YAAY,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAA;IAChE,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAA;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAE1B,OAAO,CACL,gBAAM,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,UAAU,mBAEjE,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,GAAI,EAGvB,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAC1C,eAAK,SAAS,EAAC,8BAA8B,EAAC,IAAI,EAAC,QAAQ,aACzD,yBAAO,IAAI,CAAC,YAAY,CAAC,aAAa,GAAQ,EAC9C,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAC,gBAAgB,uBAEjE,IACL,CACP,EAGA,IAAI,CAAC,WAAW,IAAI,CACnB,eAAK,SAAS,EAAC,+BAA+B,EAAC,IAAI,EAAC,OAAO,aACzD,6BAAS,IAAI,CAAC,YAAY,CAAC,UAAU,UAAY,EACjD,yBAAO,IAAI,CAAC,WAAW,GAAQ,IAC3B,CACP,EAGA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CACtB,eAAK,SAAS,EAAC,sBAAsB,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,aACvG,eAAM,KAAK,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,yBAAyB,EAAE,uBAAU,4CACpF,CACP,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CACnB,eAAK,SAAS,EAAC,iCAAiC,EAAC,IAAI,EAAC,QAAQ,aAC5D,uBAAK,IAAI,CAAC,YAAY,CAAC,YAAY,GAAM,EACzC,sBAAI,IAAI,CAAC,YAAY,CAAC,cAAc,GAAK,IACrC,CACP,CAAC,CAAC,CAAC,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,CACnC,QAAQ,CAAC,IAAI,CAAC,CACf,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CACb,QAAQ,CACT,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CACX,8BACG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC/B,KAAC,SAAS,IAAoB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,IAAxC,MAAM,CAAC,KAAK,CAAgC,CAC7D,CAAC,EACF,iBAAQ,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,EAAC,kBAAkB,YAC5E,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,YAAY,GACjF,IACR,CACJ,CAAC,CAAC,CAAC,IAAI,IACH,CACR,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormField.d.ts","sourceRoot":"","sources":["../../src/components/FormField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,eAAO,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAyFxC,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
export const FormField = ({ branch, form, className = 'beech-form-field' }) => {
|
|
3
|
+
if (!form.isFieldVisible(branch.alias)) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
const { alias, label, type, placeholder, options, helpText } = branch;
|
|
7
|
+
const reg = form.register(alias);
|
|
8
|
+
const error = form.touched[alias] ? form.errors[alias] : undefined;
|
|
9
|
+
const fieldId = `beech-field-${alias}`;
|
|
10
|
+
return (_jsxs("div", { className: className, "data-field": alias, "data-type": type, children: [label && (_jsxs("label", { htmlFor: fieldId, className: "beech-label", children: [label, branch.required && _jsx("span", { className: "beech-required-mark", "aria-hidden": "true", children: " *" })] })), type === 'text' ? (_jsx("textarea", { id: fieldId, placeholder: placeholder, className: `beech-input beech-textarea ${error ? 'beech-input-error' : ''}`, ...reg })) : type === 'select' ? (_jsxs("select", { id: fieldId, className: `beech-input beech-select ${error ? 'beech-input-error' : ''}`, ...reg, children: [_jsx("option", { value: "", children: placeholder || '-- Seleziona --' }), options?.map((opt, idx) => {
|
|
11
|
+
const optVal = typeof opt === 'string' ? opt : opt.value;
|
|
12
|
+
const optLabel = typeof opt === 'string' ? opt : opt.label;
|
|
13
|
+
return (_jsx("option", { value: optVal, children: optLabel }, `${optVal}-${idx}`));
|
|
14
|
+
})] })) : type === 'boolean' ? (_jsxs("div", { className: "beech-checkbox-wrapper", children: [_jsx("input", { id: fieldId, type: "checkbox", checked: Boolean(form.values[alias]), className: "beech-checkbox", name: reg.name, onChange: reg.onChange, onBlur: reg.onBlur, "aria-invalid": reg['aria-invalid'], "aria-required": reg['aria-required'], "aria-describedby": reg['aria-describedby'] }), placeholder && _jsx("label", { htmlFor: fieldId, children: placeholder })] })) : type === 'file' ? (_jsx("input", { id: fieldId, type: "file", accept: branch.accept, className: `beech-input beech-file ${error ? 'beech-input-error' : ''}`, onChange: (e) => form.handleFileChange(alias, e.target.files?.[0] ?? null), onBlur: reg.onBlur, "aria-invalid": reg['aria-invalid'], "aria-required": reg['aria-required'], "aria-describedby": reg['aria-describedby'] })) : (_jsx("input", { id: fieldId, type: type === 'email' ? 'email' : type === 'number' ? 'number' : type === 'date' ? 'date' : 'text', placeholder: placeholder, className: `beech-input ${error ? 'beech-input-error' : ''}`, ...reg })), helpText && _jsx("p", { className: "beech-help-text", children: helpText }), error && (_jsx("p", { id: `${alias}-error`, className: "beech-error-text", role: "alert", children: error }))] }));
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=FormField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormField.js","sourceRoot":"","sources":["../../src/components/FormField.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { FC } from 'react';
|
|
2
|
+
import type { HoneypotFieldProps } from '../types.js';
|
|
3
|
+
export type { HoneypotFieldProps } from '../types.js';
|
|
4
|
+
export declare const HoneypotField: FC<HoneypotFieldProps>;
|
|
5
|
+
export declare const Honeypot: FC<HoneypotFieldProps>;
|
|
6
|
+
//# sourceMappingURL=HoneypotField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HoneypotField.d.ts","sourceRoot":"","sources":["../../src/components/HoneypotField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CA0BhD,CAAA;AAED,eAAO,MAAM,QAAQ,wBAAgB,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { DEFAULT_HONEYPOT_NAME, HONEYPOT_CONTAINER_STYLE } from '../core/honeypot.js';
|
|
3
|
+
export const HoneypotField = ({ name, value, onChange, form, label, }) => {
|
|
4
|
+
const resolvedName = form ? form.honeypotName : (name || DEFAULT_HONEYPOT_NAME);
|
|
5
|
+
const resolvedValue = form ? form.honeypotValue : (value || '');
|
|
6
|
+
const resolvedOnChange = form ? form.setHoneypotValue : (onChange || (() => { }));
|
|
7
|
+
const resolvedLabel = label || (form ? form.translations.honeypotLabel : 'Do not fill this field');
|
|
8
|
+
return (_jsxs("div", { style: HONEYPOT_CONTAINER_STYLE, "aria-hidden": "true", tabIndex: -1, children: [_jsx("label", { htmlFor: `beech-hp-${resolvedName}`, children: resolvedLabel }), _jsx("input", { id: `beech-hp-${resolvedName}`, type: "text", name: resolvedName, value: resolvedValue, tabIndex: -1, autoComplete: "off", onChange: (e) => resolvedOnChange(e.target.value) })] }));
|
|
9
|
+
};
|
|
10
|
+
export const Honeypot = HoneypotField;
|
|
11
|
+
//# sourceMappingURL=HoneypotField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HoneypotField.js","sourceRoot":"","sources":["../../src/components/HoneypotField.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AAKrF,MAAM,CAAC,MAAM,aAAa,GAA2B,CAAC,EACpD,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,KAAK,GACN,EAAE,EAAE;IACH,MAAM,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,qBAAqB,CAAC,CAAA;IAC/E,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAA;IAChF,MAAM,aAAa,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAA;IAElG,OAAO,CACL,eAAK,KAAK,EAAE,wBAAwB,iBAAc,MAAM,EAAC,QAAQ,EAAE,CAAC,CAAC,aACnE,gBAAO,OAAO,EAAE,YAAY,YAAY,EAAE,YAAG,aAAa,GAAS,EACnE,gBACE,EAAE,EAAE,YAAY,YAAY,EAAE,EAC9B,IAAI,EAAC,MAAM,EACX,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,CAAC,CAAC,EACZ,YAAY,EAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GACjD,IACE,CACP,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ConditionalRule } from '../types.js';
|
|
2
|
+
export declare function evaluateSingleCondition(rule: ConditionalRule, formValues: Record<string, unknown>): boolean;
|
|
3
|
+
export declare function evaluateCondition(condition: ConditionalRule | ConditionalRule[] | undefined, formValues: Record<string, unknown>): boolean;
|
|
4
|
+
//# sourceMappingURL=conditional-logic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditional-logic.d.ts","sourceRoot":"","sources":["../../src/core/conditional-logic.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAoC3G;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,eAAe,GAAG,eAAe,EAAE,GAAG,SAAS,EAC1D,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAMT"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright (c) 2024–2026 Flavio De Musso
|
|
3
|
+
export function evaluateSingleCondition(rule, formValues) {
|
|
4
|
+
const currentVal = formValues[rule.field];
|
|
5
|
+
const targetVal = rule.value;
|
|
6
|
+
switch (rule.op) {
|
|
7
|
+
case 'eq':
|
|
8
|
+
return currentVal === targetVal;
|
|
9
|
+
case 'neq':
|
|
10
|
+
return currentVal !== targetVal;
|
|
11
|
+
case 'gt':
|
|
12
|
+
return typeof currentVal === 'number' && typeof targetVal === 'number' && currentVal > targetVal;
|
|
13
|
+
case 'gte':
|
|
14
|
+
return typeof currentVal === 'number' && typeof targetVal === 'number' && currentVal >= targetVal;
|
|
15
|
+
case 'lt':
|
|
16
|
+
return typeof currentVal === 'number' && typeof targetVal === 'number' && currentVal < targetVal;
|
|
17
|
+
case 'lte':
|
|
18
|
+
return typeof currentVal === 'number' && typeof targetVal === 'number' && currentVal <= targetVal;
|
|
19
|
+
case 'in':
|
|
20
|
+
return Array.isArray(targetVal) && targetVal.includes(currentVal);
|
|
21
|
+
case 'not_in':
|
|
22
|
+
return Array.isArray(targetVal) && !targetVal.includes(currentVal);
|
|
23
|
+
case 'is_empty':
|
|
24
|
+
return currentVal === undefined || currentVal === null || currentVal === '' || (Array.isArray(currentVal) && currentVal.length === 0);
|
|
25
|
+
case 'is_not_empty':
|
|
26
|
+
return currentVal !== undefined && currentVal !== null && currentVal !== '' && (!Array.isArray(currentVal) || currentVal.length > 0);
|
|
27
|
+
case 'contains':
|
|
28
|
+
if (typeof currentVal === 'string' && typeof targetVal === 'string') {
|
|
29
|
+
return currentVal.includes(targetVal);
|
|
30
|
+
}
|
|
31
|
+
if (Array.isArray(currentVal)) {
|
|
32
|
+
return currentVal.includes(targetVal);
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
default:
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function evaluateCondition(condition, formValues) {
|
|
40
|
+
if (!condition)
|
|
41
|
+
return true;
|
|
42
|
+
if (Array.isArray(condition)) {
|
|
43
|
+
return condition.every((rule) => evaluateSingleCondition(rule, formValues));
|
|
44
|
+
}
|
|
45
|
+
return evaluateSingleCondition(condition, formValues);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=conditional-logic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditional-logic.js","sourceRoot":"","sources":["../../src/core/conditional-logic.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,0CAA0C;AAI1C,MAAM,UAAU,uBAAuB,CAAC,IAAqB,EAAE,UAAmC;IAChG,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAA;IAE5B,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC;QAChB,KAAK,IAAI;YACP,OAAO,UAAU,KAAK,SAAS,CAAA;QACjC,KAAK,KAAK;YACR,OAAO,UAAU,KAAK,SAAS,CAAA;QACjC,KAAK,IAAI;YACP,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,UAAU,GAAG,SAAS,CAAA;QAClG,KAAK,KAAK;YACR,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,UAAU,IAAI,SAAS,CAAA;QACnG,KAAK,IAAI;YACP,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,UAAU,GAAG,SAAS,CAAA;QAClG,KAAK,KAAK;YACR,OAAO,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,UAAU,IAAI,SAAS,CAAA;QACnG,KAAK,IAAI;YACP,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACnE,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACpE,KAAK,UAAU;YACb,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAA;QACvI,KAAK,cAAc;YACjB,OAAO,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACtI,KAAK,UAAU;YACb,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;gBACpE,OAAO,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YACvC,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,OAAO,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YACvC,CAAC;YACD,OAAO,KAAK,CAAA;QACd;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,SAA0D,EAC1D,UAAmC;IAEnC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAA;IAC7E,CAAC;IACD,OAAO,uBAAuB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;AACvD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function getDraftStorageKey(seedSlug: string): string;
|
|
2
|
+
export declare function saveFormDraft(seedSlug: string, values: Record<string, unknown>): boolean;
|
|
3
|
+
export declare function loadFormDraft<TValues extends Record<string, unknown>>(seedSlug: string): Partial<TValues> | null;
|
|
4
|
+
export declare function clearFormDraft(seedSlug: string): boolean;
|
|
5
|
+
//# sourceMappingURL=draft-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-storage.d.ts","sourceRoot":"","sources":["../../src/core/draft-storage.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAiBxF;AAED,wBAAgB,aAAa,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAUhH;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQxD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright (c) 2024–2026 Flavio De Musso
|
|
3
|
+
export function getDraftStorageKey(seedSlug) {
|
|
4
|
+
return `beech_form_draft_${seedSlug}`;
|
|
5
|
+
}
|
|
6
|
+
export function saveFormDraft(seedSlug, values) {
|
|
7
|
+
if (typeof window === 'undefined' || !window.localStorage)
|
|
8
|
+
return false;
|
|
9
|
+
try {
|
|
10
|
+
const key = getDraftStorageKey(seedSlug);
|
|
11
|
+
// Exclude file blobs and anti-bot internal properties from persistence
|
|
12
|
+
const sanitized = {};
|
|
13
|
+
for (const [k, v] of Object.entries(values)) {
|
|
14
|
+
if (k.startsWith('_') || k.startsWith('fax_number') || v instanceof File || (v && typeof v === 'object' && 'data' in v && 'mimeType' in v)) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
sanitized[k] = v;
|
|
18
|
+
}
|
|
19
|
+
window.localStorage.setItem(key, JSON.stringify(sanitized));
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function loadFormDraft(seedSlug) {
|
|
27
|
+
if (typeof window === 'undefined' || !window.localStorage)
|
|
28
|
+
return null;
|
|
29
|
+
try {
|
|
30
|
+
const key = getDraftStorageKey(seedSlug);
|
|
31
|
+
const raw = window.localStorage.getItem(key);
|
|
32
|
+
if (!raw)
|
|
33
|
+
return null;
|
|
34
|
+
return JSON.parse(raw);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function clearFormDraft(seedSlug) {
|
|
41
|
+
if (typeof window === 'undefined' || !window.localStorage)
|
|
42
|
+
return false;
|
|
43
|
+
try {
|
|
44
|
+
window.localStorage.removeItem(getDraftStorageKey(seedSlug));
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=draft-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft-storage.js","sourceRoot":"","sources":["../../src/core/draft-storage.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,0CAA0C;AAE1C,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,oBAAoB,QAAQ,EAAE,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,MAA+B;IAC7E,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,OAAO,KAAK,CAAA;IACvE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QACxC,uEAAuE;QACvE,MAAM,SAAS,GAA4B,EAAE,CAAA;QAC7C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC3I,SAAQ;YACV,CAAC;YACD,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;QACD,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAA;QAC3D,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAA0C,QAAgB;IACrF,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,OAAO,IAAI,CAAA;IACtE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5C,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAA;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,YAAY;QAAE,OAAO,KAAK,CAAA;IACvE,IAAI,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC5D,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { FormFileAttachment } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Result of client-side file magic bytes validation before form upload.
|
|
4
|
+
*/
|
|
5
|
+
export interface ClientMagicBytesResult {
|
|
6
|
+
/** Whether the file matches its declared MIME signature. */
|
|
7
|
+
valid: boolean;
|
|
8
|
+
/** Validation error message if the file is invalid or mismatched. */
|
|
9
|
+
error?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Validates a binary byte array against the declared MIME type using @beechcms/core.
|
|
13
|
+
*
|
|
14
|
+
* @param bytes - The binary data of the file.
|
|
15
|
+
* @param declaredMime - The MIME type reported by the browser File object.
|
|
16
|
+
* @returns An object indicating whether the file signature is valid, with optional error message.
|
|
17
|
+
*/
|
|
18
|
+
export declare function verifyClientMagicBytes(bytes: Uint8Array, declaredMime: string): ClientMagicBytesResult;
|
|
19
|
+
/**
|
|
20
|
+
* Reads a browser File object, verifies its magic bytes signature, and converts it
|
|
21
|
+
* to a FormFileAttachment ready for submission to the BeechCMS Public Form API.
|
|
22
|
+
*
|
|
23
|
+
* @param file - The browser File instance to convert and validate.
|
|
24
|
+
* @returns A promise resolving to the attachment payload and any validation error encountered.
|
|
25
|
+
*/
|
|
26
|
+
export declare function fileToAttachment(file: File): Promise<{
|
|
27
|
+
attachment: FormFileAttachment;
|
|
28
|
+
error?: string;
|
|
29
|
+
}>;
|
|
30
|
+
//# sourceMappingURL=file-uploader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-uploader.d.ts","sourceRoot":"","sources":["../../src/core/file-uploader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,4DAA4D;IAC5D,KAAK,EAAE,OAAO,CAAA;IACd,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,sBAAsB,CAMtG;AAgBD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,kBAAkB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+B9G"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright (c) 2024–2026 Flavio De Musso
|
|
3
|
+
import { verifyMagicBytes } from '@beechcms/core';
|
|
4
|
+
/**
|
|
5
|
+
* Validates a binary byte array against the declared MIME type using @beechcms/core.
|
|
6
|
+
*
|
|
7
|
+
* @param bytes - The binary data of the file.
|
|
8
|
+
* @param declaredMime - The MIME type reported by the browser File object.
|
|
9
|
+
* @returns An object indicating whether the file signature is valid, with optional error message.
|
|
10
|
+
*/
|
|
11
|
+
export function verifyClientMagicBytes(bytes, declaredMime) {
|
|
12
|
+
const result = verifyMagicBytes(bytes, declaredMime);
|
|
13
|
+
return {
|
|
14
|
+
valid: result.valid,
|
|
15
|
+
error: result.error,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Encodes a Uint8Array buffer into a standard Base64 string in client/browser environments.
|
|
20
|
+
*
|
|
21
|
+
* @param bytes - The byte array to encode.
|
|
22
|
+
* @returns The Base64 encoded string.
|
|
23
|
+
*/
|
|
24
|
+
function bytesToBase64(bytes) {
|
|
25
|
+
let binary = '';
|
|
26
|
+
for (let i = 0; i < bytes.byteLength; i++) {
|
|
27
|
+
binary += String.fromCharCode(bytes[i]);
|
|
28
|
+
}
|
|
29
|
+
return btoa(binary);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Reads a browser File object, verifies its magic bytes signature, and converts it
|
|
33
|
+
* to a FormFileAttachment ready for submission to the BeechCMS Public Form API.
|
|
34
|
+
*
|
|
35
|
+
* @param file - The browser File instance to convert and validate.
|
|
36
|
+
* @returns A promise resolving to the attachment payload and any validation error encountered.
|
|
37
|
+
*/
|
|
38
|
+
export async function fileToAttachment(file) {
|
|
39
|
+
let buffer;
|
|
40
|
+
if (typeof file.arrayBuffer === 'function') {
|
|
41
|
+
buffer = await file.arrayBuffer();
|
|
42
|
+
}
|
|
43
|
+
else if (typeof FileReader !== 'undefined') {
|
|
44
|
+
buffer = await new Promise((resolve, reject) => {
|
|
45
|
+
const reader = new FileReader();
|
|
46
|
+
reader.onload = () => resolve(reader.result);
|
|
47
|
+
reader.onerror = () => reject(reader.error ?? new Error('Failed to read file'));
|
|
48
|
+
reader.readAsArrayBuffer(file);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
buffer = new ArrayBuffer(0);
|
|
53
|
+
}
|
|
54
|
+
const bytes = new Uint8Array(buffer);
|
|
55
|
+
const validation = verifyClientMagicBytes(bytes, file.type || 'application/octet-stream');
|
|
56
|
+
if (!validation.valid) {
|
|
57
|
+
return {
|
|
58
|
+
attachment: { filename: file.name, mimeType: file.type, data: '' },
|
|
59
|
+
error: validation.error,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
attachment: {
|
|
64
|
+
filename: file.name,
|
|
65
|
+
mimeType: file.type || 'application/octet-stream',
|
|
66
|
+
data: bytesToBase64(bytes),
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=file-uploader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-uploader.js","sourceRoot":"","sources":["../../src/core/file-uploader.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,0CAA0C;AAE1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAajD;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAiB,EAAE,YAAoB;IAC5E,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;IACpD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,KAAiB;IACtC,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAU;IAC/C,IAAI,MAAmB,CAAA;IACvB,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;QAC3C,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA;IACnC,CAAC;SAAM,IAAI,OAAO,UAAU,KAAK,WAAW,EAAE,CAAC;QAC7C,MAAM,GAAG,MAAM,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1D,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAA;YAC/B,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAqB,CAAC,CAAA;YAC3D,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAA;YAC/E,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;IACpC,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,0BAA0B,CAAC,CAAA;IACzF,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO;YACL,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;YAClE,KAAK,EAAE,UAAU,CAAC,KAAK;SACxB,CAAA;IACH,CAAC;IAED,OAAO;QACL,UAAU,EAAE;YACV,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,0BAA0B;YACjD,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC;SAC3B;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
export declare const DEFAULT_HONEYPOT_NAME = "fax_number";
|
|
3
|
+
export declare const HONEYPOT_DECOYS: readonly ["fax_number", "website_url", "middle_name", "secondary_phone", "_gotcha", "honeypot"];
|
|
4
|
+
export declare const HONEYPOT_CONTAINER_STYLE: CSSProperties;
|
|
5
|
+
//# sourceMappingURL=honeypot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"honeypot.d.ts","sourceRoot":"","sources":["../../src/core/honeypot.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,eAAO,MAAM,qBAAqB,eAAe,CAAA;AACjD,eAAO,MAAM,eAAe,iGAAkG,CAAA;AAE9H,eAAO,MAAM,wBAAwB,EAAE,aAStC,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright (c) 2024–2026 Flavio De Musso
|
|
3
|
+
export const DEFAULT_HONEYPOT_NAME = 'fax_number';
|
|
4
|
+
export const HONEYPOT_DECOYS = ['fax_number', 'website_url', 'middle_name', 'secondary_phone', '_gotcha', 'honeypot'];
|
|
5
|
+
export const HONEYPOT_CONTAINER_STYLE = {
|
|
6
|
+
position: 'absolute',
|
|
7
|
+
left: '-9999px',
|
|
8
|
+
top: '-9999px',
|
|
9
|
+
width: '1px',
|
|
10
|
+
height: '1px',
|
|
11
|
+
opacity: 0,
|
|
12
|
+
overflow: 'hidden',
|
|
13
|
+
pointerEvents: 'none',
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=honeypot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"honeypot.js","sourceRoot":"","sources":["../../src/core/honeypot.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,0CAA0C;AAI1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAA;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,CAAU,CAAA;AAE9H,MAAM,CAAC,MAAM,wBAAwB,GAAkB;IACrD,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,QAAQ;IAClB,aAAa,EAAE,MAAM;CACtB,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface TimeTrapTokenResponse {
|
|
2
|
+
token: string;
|
|
3
|
+
minDeltaSeconds?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function fetchTimeTrapToken(baseUrl: string, customFetch?: typeof fetch): Promise<{
|
|
6
|
+
token: string;
|
|
7
|
+
timestamp: number;
|
|
8
|
+
} | null>;
|
|
9
|
+
//# sourceMappingURL=time-trap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-trap.d.ts","sourceRoot":"","sources":["../../src/core/time-trap.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,OAAO,KAAK,GACzB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAgBtD"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright (c) 2024–2026 Flavio De Musso
|
|
3
|
+
export async function fetchTimeTrapToken(baseUrl, customFetch) {
|
|
4
|
+
const doFetch = customFetch ?? fetch;
|
|
5
|
+
const cleanBase = baseUrl.replace(/\/+$/, '');
|
|
6
|
+
const endpoint = `${cleanBase}/api/v1/public/timetrap/token`;
|
|
7
|
+
try {
|
|
8
|
+
const res = await doFetch(endpoint, { method: 'GET' });
|
|
9
|
+
if (!res.ok)
|
|
10
|
+
return null;
|
|
11
|
+
const json = (await res.json());
|
|
12
|
+
return {
|
|
13
|
+
token: json.token,
|
|
14
|
+
timestamp: Date.now(),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=time-trap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-trap.js","sourceRoot":"","sources":["../../src/core/time-trap.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,0CAA0C;AAO1C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAe,EACf,WAA0B;IAE1B,MAAM,OAAO,GAAG,WAAW,IAAI,KAAK,CAAA;IACpC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAG,GAAG,SAAS,+BAA+B,CAAA;IAE5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;QACtD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QACxB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAA;QACxD,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { Locale } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Properties for the {@link ClientiTestPage} component.
|
|
5
|
+
*/
|
|
6
|
+
export interface ClientiTestPageProps {
|
|
7
|
+
/** Base URL of the BeechCMS API (e.g. "https://api.yourdomain.com"). */
|
|
8
|
+
apiUrl?: string;
|
|
9
|
+
/** Public write API key. */
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
/** UI and validation language ('it' | 'en'). @default 'it' */
|
|
12
|
+
locale?: Locale;
|
|
13
|
+
/** Optional callback fired when a lead submission is persisted in D1. */
|
|
14
|
+
onSuccess?: (lead: Record<string, unknown>) => void;
|
|
15
|
+
/** Optional callback fired on submission error. */
|
|
16
|
+
onError?: (error: {
|
|
17
|
+
status: number;
|
|
18
|
+
message: string;
|
|
19
|
+
details?: unknown;
|
|
20
|
+
}) => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Production-ready Lead Acquisition & Contact Form for the `clienti` Seed.
|
|
24
|
+
* Showcases the zero-config Dynamic Schema Pattern and the Headless Hook pattern.
|
|
25
|
+
*/
|
|
26
|
+
export declare function ClientiTestPage({ apiUrl, apiKey, locale, onSuccess, onError, }: ClientiTestPageProps): React.JSX.Element;
|
|
27
|
+
//# sourceMappingURL=ClientiTestPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClientiTestPage.d.ts","sourceRoot":"","sources":["../../src/examples/ClientiTestPage.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAmB,MAAM,OAAO,CAAA;AAEvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAezC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,yEAAyE;IACzE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IAEnD,mDAAmD;IACnD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAA;CAClF;AAsFD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAwB,EACxB,MAAwB,EACxB,MAAa,EACb,SAAS,EACT,OAAO,GACR,EAAE,oBAAoB,qBA0ItB"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) 2024–2026 Flavio De Musso
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { BeechForm, Honeypot, useBeechForm } from '../index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Environment configuration resolver supporting Vite, Next.js, and browser runtimes.
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_API_URL = (typeof import.meta !== 'undefined' && import.meta.env?.VITE_BEECH_API_URL) ||
|
|
10
|
+
(typeof process !== 'undefined' && process.env?.NEXT_PUBLIC_BEECH_API_URL) ||
|
|
11
|
+
'http://localhost:8787';
|
|
12
|
+
const DEFAULT_API_KEY = (typeof import.meta !== 'undefined' && import.meta.env?.VITE_BEECH_PUBLIC_API_KEY) ||
|
|
13
|
+
(typeof process !== 'undefined' && process.env?.NEXT_PUBLIC_BEECH_PUBLIC_API_KEY) ||
|
|
14
|
+
'dev-public-write-key-changeme';
|
|
15
|
+
/**
|
|
16
|
+
* Headless example component demonstrating 1-line anti-bot with custom layout.
|
|
17
|
+
*/
|
|
18
|
+
function HeadlessCustomClientiForm({ apiUrl, apiKey, locale, onSuccess, onError, }) {
|
|
19
|
+
const form = useBeechForm({
|
|
20
|
+
seed: 'clienti',
|
|
21
|
+
baseUrl: apiUrl,
|
|
22
|
+
apiKey,
|
|
23
|
+
locale,
|
|
24
|
+
onSuccess: (res) => onSuccess?.(res.data),
|
|
25
|
+
onError,
|
|
26
|
+
});
|
|
27
|
+
if (form.isSuccess) {
|
|
28
|
+
return (_jsx("div", { style: { padding: 16, background: '#f0fdf4', color: '#166534', borderRadius: 6 }, children: "Grazie! La richiesta \u00E8 stata inviata con successo." }));
|
|
29
|
+
}
|
|
30
|
+
return (_jsxs("form", { onSubmit: form.handleSubmit, noValidate: true, style: { display: 'flex', flexDirection: 'column', gap: 14 }, children: [_jsx(Honeypot, { form: form }), form.isLoadingSchema ? (_jsx("p", { style: { color: '#6b7280', fontSize: 14 }, children: "Caricamento campi form dal CMS..." })) : (_jsxs(_Fragment, { children: [_jsxs("div", { children: [_jsx("label", { style: { display: 'block', fontSize: 13, fontWeight: 600, marginBottom: 4 }, children: "Nome Azienda / Ragione Sociale *" }), _jsx("input", { ...form.register('name'), placeholder: "es. Acme Corporation", style: { width: '100%', padding: '8px 10px', borderRadius: 6, border: '1px solid #d1d5db' } }), form.errors.name && _jsx("span", { style: { color: '#dc2626', fontSize: 12 }, children: form.errors.name })] }), _jsxs("div", { children: [_jsx("label", { style: { display: 'block', fontSize: 13, fontWeight: 600, marginBottom: 4 }, children: "Email Aziendale *" }), _jsx("input", { ...form.register('email'), type: "email", placeholder: "contatto@acme.com", style: { width: '100%', padding: '8px 10px', borderRadius: 6, border: '1px solid #d1d5db' } }), form.errors.email && _jsx("span", { style: { color: '#dc2626', fontSize: 12 }, children: form.errors.email })] }), _jsx("button", { type: "submit", disabled: form.isSubmitting, style: {
|
|
31
|
+
padding: '10px 16px',
|
|
32
|
+
background: '#2563eb',
|
|
33
|
+
color: '#ffffff',
|
|
34
|
+
border: 'none',
|
|
35
|
+
borderRadius: 6,
|
|
36
|
+
fontWeight: 600,
|
|
37
|
+
cursor: 'pointer',
|
|
38
|
+
}, children: form.isSubmitting ? 'Invio in corso...' : 'Invia con Headless Hook' })] }))] }));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Production-ready Lead Acquisition & Contact Form for the `clienti` Seed.
|
|
42
|
+
* Showcases the zero-config Dynamic Schema Pattern and the Headless Hook pattern.
|
|
43
|
+
*/
|
|
44
|
+
export function ClientiTestPage({ apiUrl = DEFAULT_API_URL, apiKey = DEFAULT_API_KEY, locale = 'it', onSuccess, onError, }) {
|
|
45
|
+
const [activeTab, setActiveTab] = useState('auto');
|
|
46
|
+
const [submittedData, setSubmittedData] = useState(null);
|
|
47
|
+
const [submissionStatus, setSubmissionStatus] = useState('');
|
|
48
|
+
const handleSuccess = (response) => {
|
|
49
|
+
const data = 'data' in response && response.data ? response.data : response;
|
|
50
|
+
setSubmittedData(data);
|
|
51
|
+
setSubmissionStatus('SUCCESS: Lead registrata correttamente nel database D1!');
|
|
52
|
+
onSuccess?.(data);
|
|
53
|
+
};
|
|
54
|
+
const handleError = (error) => {
|
|
55
|
+
setSubmissionStatus(`ERROR (${error.status}): ${error.message}`);
|
|
56
|
+
onError?.(error);
|
|
57
|
+
};
|
|
58
|
+
return (_jsxs("div", { className: "clienti-test-page", style: {
|
|
59
|
+
maxWidth: 640,
|
|
60
|
+
margin: '40px auto',
|
|
61
|
+
padding: '32px 24px',
|
|
62
|
+
fontFamily: 'system-ui, -apple-system, sans-serif',
|
|
63
|
+
}, children: [_jsxs("header", { style: { marginBottom: 24 }, children: [_jsx("h1", { style: { fontSize: 24, fontWeight: 700, color: '#111827', margin: '0 0 8px 0' }, children: "BeechCMS Form SDK \u2014 Zero-Config Dynamic Pattern" }), _jsxs("p", { style: { color: '#4b5563', fontSize: 14, margin: 0, lineHeight: 1.5 }, children: ["Schema caricato dinamicamente via ", _jsx("code", { children: "GET /api/v1/public/clienti/schema" }), " con ", _jsx("strong", { children: "SWR Cache" }), ", difese anti-bot (Honeypot + Time-Trap HMAC) attive di default e crittografia AES-256 a riposo per i dati PII."] })] }), _jsxs("div", { style: { display: 'flex', gap: 8, marginBottom: 16 }, children: [_jsx("button", { type: "button", onClick: () => setActiveTab('auto'), style: {
|
|
64
|
+
padding: '6px 14px',
|
|
65
|
+
borderRadius: 6,
|
|
66
|
+
border: '1px solid #d1d5db',
|
|
67
|
+
background: activeTab === 'auto' ? '#111827' : '#f3f4f6',
|
|
68
|
+
color: activeTab === 'auto' ? '#ffffff' : '#374151',
|
|
69
|
+
fontWeight: 600,
|
|
70
|
+
fontSize: 13,
|
|
71
|
+
cursor: 'pointer',
|
|
72
|
+
}, children: "Zero-Boilerplate (<BeechForm seed=\"clienti\" />)" }), _jsx("button", { type: "button", onClick: () => setActiveTab('headless'), style: {
|
|
73
|
+
padding: '6px 14px',
|
|
74
|
+
borderRadius: 6,
|
|
75
|
+
border: '1px solid #d1d5db',
|
|
76
|
+
background: activeTab === 'headless' ? '#111827' : '#f3f4f6',
|
|
77
|
+
color: activeTab === 'headless' ? '#ffffff' : '#374151',
|
|
78
|
+
fontWeight: 600,
|
|
79
|
+
fontSize: 13,
|
|
80
|
+
cursor: 'pointer',
|
|
81
|
+
}, children: "Headless Hook (<Honeypot form={form} />)" })] }), _jsx("div", { style: {
|
|
82
|
+
background: '#ffffff',
|
|
83
|
+
border: '1px solid #e5e7eb',
|
|
84
|
+
borderRadius: 8,
|
|
85
|
+
padding: 24,
|
|
86
|
+
boxShadow: '0 1px 3px rgba(0,0,0,0.1)',
|
|
87
|
+
}, children: activeTab === 'auto' ? (_jsx(BeechForm, { seed: "clienti", baseUrl: apiUrl, apiKey: apiKey, locale: locale, onSuccess: handleSuccess, onError: handleError })) : (_jsx(HeadlessCustomClientiForm, { apiUrl: apiUrl, apiKey: apiKey, locale: locale, onSuccess: handleSuccess, onError: handleError })) }), submissionStatus && (_jsxs("div", { style: {
|
|
88
|
+
marginTop: 24,
|
|
89
|
+
padding: 16,
|
|
90
|
+
borderRadius: 6,
|
|
91
|
+
background: submissionStatus.startsWith('SUCCESS') ? '#f0fdf4' : '#fef2f2',
|
|
92
|
+
border: `1px solid ${submissionStatus.startsWith('SUCCESS') ? '#bbf7d0' : '#fecaca'}`,
|
|
93
|
+
color: submissionStatus.startsWith('SUCCESS') ? '#166534' : '#991b1b',
|
|
94
|
+
}, role: "status", children: [_jsx("strong", { children: submissionStatus }), submittedData && (_jsx("pre", { style: {
|
|
95
|
+
marginTop: 8,
|
|
96
|
+
fontSize: 12,
|
|
97
|
+
overflowX: 'auto',
|
|
98
|
+
background: '#ffffff',
|
|
99
|
+
padding: 12,
|
|
100
|
+
borderRadius: 4,
|
|
101
|
+
border: '1px solid #e5e7eb',
|
|
102
|
+
color: '#1f2937',
|
|
103
|
+
}, children: JSON.stringify(submittedData, null, 2) }))] }))] }));
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=ClientiTestPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClientiTestPage.js","sourceRoot":"","sources":["../../src/examples/ClientiTestPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { UseBeechFormOptions, UseBeechFormReturn } from '../types.js';
|
|
2
|
+
export declare function useBeechForm<TValues extends Record<string, unknown> = Record<string, unknown>>(options: UseBeechFormOptions<TValues>): UseBeechFormReturn<TValues>;
|
|
3
|
+
//# sourceMappingURL=useBeechForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBeechForm.d.ts","sourceRoot":"","sources":["../../src/hooks/useBeechForm.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAoC,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAQ5G,wBAAgB,YAAY,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5F,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACpC,kBAAkB,CAAC,OAAO,CAAC,CAkd7B"}
|