@page-speed/forms 0.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/LICENSE +28 -0
- package/README.md +469 -0
- package/dist/builder.cjs +4 -0
- package/dist/builder.cjs.map +1 -0
- package/dist/builder.d.cts +2 -0
- package/dist/builder.d.ts +2 -0
- package/dist/builder.js +3 -0
- package/dist/builder.js.map +1 -0
- package/dist/chunk-2FXAQT7S.cjs +236 -0
- package/dist/chunk-2FXAQT7S.cjs.map +1 -0
- package/dist/chunk-A3UV7BIN.js +357 -0
- package/dist/chunk-A3UV7BIN.js.map +1 -0
- package/dist/chunk-P37YLBFA.cjs +138 -0
- package/dist/chunk-P37YLBFA.cjs.map +1 -0
- package/dist/chunk-WHQMBQNI.js +127 -0
- package/dist/chunk-WHQMBQNI.js.map +1 -0
- package/dist/chunk-YTTOWHBZ.js +217 -0
- package/dist/chunk-YTTOWHBZ.js.map +1 -0
- package/dist/chunk-ZQCPEOB6.cjs +382 -0
- package/dist/chunk-ZQCPEOB6.cjs.map +1 -0
- package/dist/core.cjs +28 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +143 -0
- package/dist/core.d.ts +143 -0
- package/dist/core.js +3 -0
- package/dist/core.js.map +1 -0
- package/dist/index.cjs +28 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs.cjs +555 -0
- package/dist/inputs.cjs.map +1 -0
- package/dist/inputs.d.cts +433 -0
- package/dist/inputs.d.ts +433 -0
- package/dist/inputs.js +529 -0
- package/dist/inputs.js.map +1 -0
- package/dist/integration.cjs +4 -0
- package/dist/integration.cjs.map +1 -0
- package/dist/integration.d.cts +2 -0
- package/dist/integration.d.ts +2 -0
- package/dist/integration.js +3 -0
- package/dist/integration.js.map +1 -0
- package/dist/types-Cw5CeZP-.d.cts +387 -0
- package/dist/types-Cw5CeZP-.d.ts +387 -0
- package/dist/upload.cjs +4 -0
- package/dist/upload.cjs.map +1 -0
- package/dist/upload.d.cts +2 -0
- package/dist/upload.d.ts +2 -0
- package/dist/upload.js +3 -0
- package/dist/upload.js.map +1 -0
- package/dist/validation-rules.cjs +80 -0
- package/dist/validation-rules.cjs.map +1 -0
- package/dist/validation-rules.d.cts +123 -0
- package/dist/validation-rules.d.ts +123 -0
- package/dist/validation-rules.js +3 -0
- package/dist/validation-rules.js.map +1 -0
- package/dist/validation-utils.cjs +48 -0
- package/dist/validation-utils.cjs.map +1 -0
- package/dist/validation-utils.d.cts +166 -0
- package/dist/validation-utils.d.ts +166 -0
- package/dist/validation-utils.js +3 -0
- package/dist/validation-utils.js.map +1 -0
- package/dist/validation-valibot.cjs +94 -0
- package/dist/validation-valibot.cjs.map +1 -0
- package/dist/validation-valibot.d.cts +92 -0
- package/dist/validation-valibot.d.ts +92 -0
- package/dist/validation-valibot.js +91 -0
- package/dist/validation-valibot.js.map +1 -0
- package/dist/validation.cjs +121 -0
- package/dist/validation.cjs.map +1 -0
- package/dist/validation.d.cts +4 -0
- package/dist/validation.d.ts +4 -0
- package/dist/validation.js +4 -0
- package/dist/validation.js.map +1 -0
- package/package.json +133 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/validation/rules.ts"],"names":["min","max"],"mappings":"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","file":"chunk-YTTOWHBZ.js","sourcesContent":["/**\n * @page-speed/forms - Validation Rules\n *\n * Common validation rules for form fields.\n * Tree-shakable - import only the rules you need.\n *\n * @example\n * ```tsx\n * import { required, email, minLength } from '@page-speed/forms/validation/rules';\n *\n * const form = useForm({\n * validationSchema: {\n * email: [required(), email()],\n * password: [required(), minLength(8)],\n * }\n * });\n * ```\n */\n\nimport type { FieldValidator } from \"../core/types\";\n\n/**\n * Error message template function\n * Allows customization of error messages\n */\nexport type ErrorMessageFn = (params?: Record<string, any>) => string;\n\n/**\n * Validation rule options\n */\nexport interface ValidationRuleOptions {\n /**\n * Custom error message\n */\n message?: string | ErrorMessageFn;\n}\n\n/**\n * Required field validator\n * Ensures field has a truthy value\n */\nexport function required(\n options: ValidationRuleOptions = {}\n): FieldValidator {\n const defaultMessage = \"This field is required\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n return (value) => {\n if (value === undefined || value === null || value === \"\") {\n return message;\n }\n\n // Check for empty arrays\n if (Array.isArray(value) && value.length === 0) {\n return message;\n }\n\n // Check for empty objects\n if (\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n Object.keys(value).length === 0\n ) {\n return message;\n }\n\n return undefined;\n };\n}\n\n/**\n * Email validator\n * Validates email format using RFC 5322 compatible regex\n */\nexport function email(options: ValidationRuleOptions = {}): FieldValidator {\n const defaultMessage = \"Please enter a valid email address\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n // RFC 5322 simplified email regex\n const emailRegex =\n /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n\n return (value) => {\n if (!value) return undefined; // Use with required() if needed\n if (typeof value !== \"string\") return message;\n if (!emailRegex.test(value)) return message;\n return undefined;\n };\n}\n\n/**\n * URL validator\n * Validates URL format\n */\nexport function url(options: ValidationRuleOptions = {}): FieldValidator {\n const defaultMessage = \"Please enter a valid URL\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n return (value) => {\n if (!value) return undefined; // Use with required() if needed\n if (typeof value !== \"string\") return message;\n\n try {\n new URL(value);\n return undefined;\n } catch {\n return message;\n }\n };\n}\n\n/**\n * Phone number validator\n * Validates US phone numbers (flexible formats)\n */\nexport function phone(options: ValidationRuleOptions = {}): FieldValidator {\n const defaultMessage = \"Please enter a valid phone number\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n // Matches: (123) 456-7890, 123-456-7890, 1234567890, +1 123 456 7890\n const phoneRegex = /^[\\+]?[(]?[0-9]{3}[)]?[-\\s\\.]?[0-9]{3}[-\\s\\.]?[0-9]{4,6}$/;\n\n return (value) => {\n if (!value) return undefined;\n if (typeof value !== \"string\") return message;\n\n // Remove all non-numeric characters except +\n const cleaned = value.replace(/[^\\d+]/g, \"\");\n\n if (!phoneRegex.test(cleaned)) return message;\n return undefined;\n };\n}\n\n/**\n * Minimum length validator\n */\nexport function minLength(\n min: number,\n options: ValidationRuleOptions = {}\n): FieldValidator {\n const defaultMessage = (p: { min: number }) =>\n `Must be at least ${p.min} characters`;\n const message =\n typeof options.message === \"function\"\n ? options.message({ min })\n : options.message || defaultMessage({ min });\n\n return (value) => {\n if (!value) return undefined;\n\n const length = Array.isArray(value)\n ? value.length\n : typeof value === \"string\"\n ? value.length\n : 0;\n\n if (length < min) return message;\n return undefined;\n };\n}\n\n/**\n * Maximum length validator\n */\nexport function maxLength(\n max: number,\n options: ValidationRuleOptions = {}\n): FieldValidator {\n const defaultMessage = (p: { max: number }) =>\n `Must be no more than ${p.max} characters`;\n const message =\n typeof options.message === \"function\"\n ? options.message({ max })\n : options.message || defaultMessage({ max });\n\n return (value) => {\n if (!value) return undefined;\n\n const length = Array.isArray(value)\n ? value.length\n : typeof value === \"string\"\n ? value.length\n : 0;\n\n if (length > max) return message;\n return undefined;\n };\n}\n\n/**\n * Minimum value validator (for numbers)\n */\nexport function min(\n minValue: number,\n options: ValidationRuleOptions = {}\n): FieldValidator {\n const defaultMessage = (p: { min: number }) =>\n `Must be at least ${p.min}`;\n const message =\n typeof options.message === \"function\"\n ? options.message({ min: minValue })\n : options.message || defaultMessage({ min: minValue });\n\n return (value) => {\n if (value === undefined || value === null) return undefined;\n\n const numValue = typeof value === \"number\" ? value : parseFloat(value);\n\n if (isNaN(numValue) || numValue < minValue) return message;\n return undefined;\n };\n}\n\n/**\n * Maximum value validator (for numbers)\n */\nexport function max(\n maxValue: number,\n options: ValidationRuleOptions = {}\n): FieldValidator {\n const defaultMessage = (p: { max: number }) =>\n `Must be no more than ${p.max}`;\n const message =\n typeof options.message === \"function\"\n ? options.message({ max: maxValue })\n : options.message || defaultMessage({ max: maxValue });\n\n return (value) => {\n if (value === undefined || value === null) return undefined;\n\n const numValue = typeof value === \"number\" ? value : parseFloat(value);\n\n if (isNaN(numValue) || numValue > maxValue) return message;\n return undefined;\n };\n}\n\n/**\n * Pattern validator\n * Validates against a regular expression\n */\nexport function pattern(\n regex: RegExp,\n options: ValidationRuleOptions = {}\n): FieldValidator {\n const defaultMessage = \"Invalid format\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n return (value) => {\n if (!value) return undefined;\n if (typeof value !== \"string\") return message;\n if (!regex.test(value)) return message;\n return undefined;\n };\n}\n\n/**\n * Match validator\n * Ensures field matches another field (e.g., password confirmation)\n */\nexport function matches(\n fieldName: string,\n options: ValidationRuleOptions = {}\n): FieldValidator {\n const defaultMessage = (p: { field: string }) =>\n `Must match ${p.field}`;\n const message =\n typeof options.message === \"function\"\n ? options.message({ field: fieldName })\n : options.message || defaultMessage({ field: fieldName });\n\n return (value, allValues) => {\n const otherValue = allValues[fieldName];\n if (value !== otherValue) return message;\n return undefined;\n };\n}\n\n/**\n * One of validator\n * Ensures value is one of the allowed values\n */\nexport function oneOf<T = any>(\n allowedValues: T[],\n options: ValidationRuleOptions = {}\n): FieldValidator<T> {\n const defaultMessage = \"Invalid value\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n return (value) => {\n if (!value) return undefined;\n if (!allowedValues.includes(value)) return message;\n return undefined;\n };\n}\n\n/**\n * Credit card validator\n * Validates credit card numbers using Luhn algorithm\n */\nexport function creditCard(\n options: ValidationRuleOptions = {}\n): FieldValidator {\n const defaultMessage = \"Please enter a valid credit card number\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n const luhnCheck = (num: string): boolean => {\n let sum = 0;\n let isEven = false;\n\n for (let i = num.length - 1; i >= 0; i--) {\n let digit = parseInt(num[i], 10);\n\n if (isEven) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n isEven = !isEven;\n }\n\n return sum % 10 === 0;\n };\n\n return (value) => {\n if (!value) return undefined;\n if (typeof value !== \"string\") return message;\n\n // Remove spaces and dashes\n const cleaned = value.replace(/[\\s-]/g, \"\");\n\n // Check if only digits\n if (!/^\\d+$/.test(cleaned)) return message;\n\n // Check length (13-19 digits for most cards)\n if (cleaned.length < 13 || cleaned.length > 19) return message;\n\n // Luhn algorithm check\n if (!luhnCheck(cleaned)) return message;\n\n return undefined;\n };\n}\n\n/**\n * Postal code validator (US ZIP codes)\n */\nexport function postalCode(\n options: ValidationRuleOptions = {}\n): FieldValidator {\n const defaultMessage = \"Please enter a valid ZIP code\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n // Matches: 12345 or 12345-6789\n const zipRegex = /^\\d{5}(-\\d{4})?$/;\n\n return (value) => {\n if (!value) return undefined;\n if (typeof value !== \"string\") return message;\n if (!zipRegex.test(value)) return message;\n return undefined;\n };\n}\n\n/**\n * Alpha validator\n * Ensures value contains only alphabetic characters\n */\nexport function alpha(options: ValidationRuleOptions = {}): FieldValidator {\n const defaultMessage = \"Must contain only letters\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n const alphaRegex = /^[a-zA-Z]+$/;\n\n return (value) => {\n if (!value) return undefined;\n if (typeof value !== \"string\") return message;\n if (!alphaRegex.test(value)) return message;\n return undefined;\n };\n}\n\n/**\n * Alphanumeric validator\n * Ensures value contains only letters and numbers\n */\nexport function alphanumeric(\n options: ValidationRuleOptions = {}\n): FieldValidator {\n const defaultMessage = \"Must contain only letters and numbers\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n const alphanumericRegex = /^[a-zA-Z0-9]+$/;\n\n return (value) => {\n if (!value) return undefined;\n if (typeof value !== \"string\") return message;\n if (!alphanumericRegex.test(value)) return message;\n return undefined;\n };\n}\n\n/**\n * Numeric validator\n * Ensures value is a valid number\n */\nexport function numeric(options: ValidationRuleOptions = {}): FieldValidator {\n const defaultMessage = \"Must be a valid number\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n return (value) => {\n if (value === undefined || value === null || value === \"\") return undefined;\n\n const numValue = typeof value === \"number\" ? value : parseFloat(value);\n\n if (isNaN(numValue)) return message;\n return undefined;\n };\n}\n\n/**\n * Integer validator\n * Ensures value is a valid integer\n */\nexport function integer(options: ValidationRuleOptions = {}): FieldValidator {\n const defaultMessage = \"Must be a whole number\";\n const message =\n typeof options.message === \"function\"\n ? options.message()\n : options.message || defaultMessage;\n\n return (value) => {\n if (value === undefined || value === null || value === \"\") return undefined;\n\n const numValue = typeof value === \"number\" ? value : parseFloat(value);\n\n if (isNaN(numValue) || !Number.isInteger(numValue)) return message;\n return undefined;\n };\n}\n\n/**\n * Compose multiple validators\n * Runs validators in sequence and returns first error\n */\nexport function compose(\n ...validators: FieldValidator[]\n): FieldValidator {\n return async (value, allValues) => {\n for (const validator of validators) {\n const error = await validator(value, allValues);\n if (error) return error;\n }\n return undefined;\n };\n}\n"]}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React2 = require('react');
|
|
4
|
+
var react = require('@legendapp/state/react');
|
|
5
|
+
|
|
6
|
+
function _interopNamespace(e) {
|
|
7
|
+
if (e && e.__esModule) return e;
|
|
8
|
+
var n = Object.create(null);
|
|
9
|
+
if (e) {
|
|
10
|
+
Object.keys(e).forEach(function (k) {
|
|
11
|
+
if (k !== 'default') {
|
|
12
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
13
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () { return e[k]; }
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
n.default = e;
|
|
21
|
+
return Object.freeze(n);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
var React2__namespace = /*#__PURE__*/_interopNamespace(React2);
|
|
25
|
+
|
|
26
|
+
function useForm(options) {
|
|
27
|
+
const {
|
|
28
|
+
initialValues,
|
|
29
|
+
validationSchema,
|
|
30
|
+
validateOn = "onBlur",
|
|
31
|
+
revalidateOn = "onChange",
|
|
32
|
+
onSubmit,
|
|
33
|
+
onError,
|
|
34
|
+
debug = false
|
|
35
|
+
} = options;
|
|
36
|
+
const state$ = react.useObservable({
|
|
37
|
+
values: initialValues,
|
|
38
|
+
errors: {},
|
|
39
|
+
touched: {},
|
|
40
|
+
isSubmitting: false,
|
|
41
|
+
status: "idle",
|
|
42
|
+
initialValues: { ...initialValues },
|
|
43
|
+
// Create a copy to prevent reference sharing
|
|
44
|
+
hasValidated: {}
|
|
45
|
+
});
|
|
46
|
+
const validationInProgress = React2.useRef(/* @__PURE__ */ new Set());
|
|
47
|
+
const validateField = React2.useCallback(
|
|
48
|
+
async (field) => {
|
|
49
|
+
const validators = validationSchema?.[field];
|
|
50
|
+
if (!validators) return void 0;
|
|
51
|
+
const fieldKey = String(field);
|
|
52
|
+
validationInProgress.current.add(fieldKey);
|
|
53
|
+
try {
|
|
54
|
+
const value = state$.values[field].get();
|
|
55
|
+
const allValues = state$.values.get();
|
|
56
|
+
const validatorArray = Array.isArray(validators) ? validators : [validators];
|
|
57
|
+
for (const validator of validatorArray) {
|
|
58
|
+
const error = await validator(value, allValues);
|
|
59
|
+
if (error) {
|
|
60
|
+
state$.errors[field].set(error);
|
|
61
|
+
validationInProgress.current.delete(fieldKey);
|
|
62
|
+
return error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
state$.errors[field].set(void 0);
|
|
66
|
+
validationInProgress.current.delete(fieldKey);
|
|
67
|
+
return void 0;
|
|
68
|
+
} catch (error) {
|
|
69
|
+
validationInProgress.current.delete(fieldKey);
|
|
70
|
+
const errorMessage = error instanceof Error ? error.message : "Validation error";
|
|
71
|
+
state$.errors[field].set(errorMessage);
|
|
72
|
+
return errorMessage;
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
[validationSchema, state$]
|
|
76
|
+
);
|
|
77
|
+
const validateForm = React2.useCallback(async () => {
|
|
78
|
+
if (!validationSchema) return {};
|
|
79
|
+
const fields = Object.keys(validationSchema);
|
|
80
|
+
const errors2 = {};
|
|
81
|
+
await Promise.all(
|
|
82
|
+
fields.map(async (field) => {
|
|
83
|
+
const error = await validateField(field);
|
|
84
|
+
if (error) {
|
|
85
|
+
errors2[field] = error;
|
|
86
|
+
}
|
|
87
|
+
})
|
|
88
|
+
);
|
|
89
|
+
state$.errors.set(errors2);
|
|
90
|
+
return errors2;
|
|
91
|
+
}, [validationSchema, validateField, state$]);
|
|
92
|
+
const setFieldValue = React2.useCallback(
|
|
93
|
+
(field, value) => {
|
|
94
|
+
state$.values[field].set(value);
|
|
95
|
+
const shouldRevalidate = revalidateOn === "onChange" && state$.hasValidated[String(field)].get();
|
|
96
|
+
if (shouldRevalidate && validationSchema?.[field]) {
|
|
97
|
+
validateField(field);
|
|
98
|
+
}
|
|
99
|
+
if (debug) {
|
|
100
|
+
console.log("[useForm] setFieldValue:", { field, value });
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
[state$, revalidateOn, validationSchema, validateField, debug]
|
|
104
|
+
);
|
|
105
|
+
const setFieldTouched = React2.useCallback(
|
|
106
|
+
(field, touched2) => {
|
|
107
|
+
state$.touched[field].set(touched2);
|
|
108
|
+
if (touched2 && validateOn === "onBlur" && validationSchema?.[field]) {
|
|
109
|
+
state$.hasValidated[String(field)].set(true);
|
|
110
|
+
validateField(field);
|
|
111
|
+
}
|
|
112
|
+
if (debug) {
|
|
113
|
+
console.log("[useForm] setFieldTouched:", { field, touched: touched2 });
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
[state$, validateOn, validationSchema, validateField, debug]
|
|
117
|
+
);
|
|
118
|
+
const resetForm = React2.useCallback(() => {
|
|
119
|
+
state$.values.set(state$.initialValues.get());
|
|
120
|
+
state$.errors.set({});
|
|
121
|
+
state$.touched.set({});
|
|
122
|
+
state$.isSubmitting.set(false);
|
|
123
|
+
state$.status.set("idle");
|
|
124
|
+
state$.hasValidated.set({});
|
|
125
|
+
if (debug) {
|
|
126
|
+
console.log("[useForm] Form reset");
|
|
127
|
+
}
|
|
128
|
+
}, [state$, debug]);
|
|
129
|
+
const handleSubmit = React2.useCallback(
|
|
130
|
+
async (e) => {
|
|
131
|
+
e?.preventDefault();
|
|
132
|
+
if (debug) {
|
|
133
|
+
console.log("[useForm] handleSubmit started");
|
|
134
|
+
}
|
|
135
|
+
state$.isSubmitting.set(true);
|
|
136
|
+
state$.status.set("submitting");
|
|
137
|
+
try {
|
|
138
|
+
const errors2 = await validateForm();
|
|
139
|
+
const hasErrors = Object.keys(errors2).length > 0;
|
|
140
|
+
if (hasErrors) {
|
|
141
|
+
state$.status.set("error");
|
|
142
|
+
onError?.(errors2);
|
|
143
|
+
if (debug) {
|
|
144
|
+
console.log("[useForm] Validation errors:", errors2);
|
|
145
|
+
}
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const helpers = {
|
|
149
|
+
setValues: (values2) => {
|
|
150
|
+
if (typeof values2 === "function") {
|
|
151
|
+
state$.values.set(values2(state$.values.get()));
|
|
152
|
+
} else {
|
|
153
|
+
state$.values.set(values2);
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
setFieldValue,
|
|
157
|
+
setErrors: (errors3) => state$.errors.set(errors3),
|
|
158
|
+
setFieldError: (field, error) => state$.errors[field].set(error),
|
|
159
|
+
setTouched: (touched2) => state$.touched.set(touched2),
|
|
160
|
+
setFieldTouched,
|
|
161
|
+
setSubmitting: (submitting) => state$.isSubmitting.set(submitting),
|
|
162
|
+
resetForm
|
|
163
|
+
};
|
|
164
|
+
await onSubmit(state$.values.get(), helpers);
|
|
165
|
+
state$.status.set("success");
|
|
166
|
+
if (debug) {
|
|
167
|
+
console.log("[useForm] Submit successful");
|
|
168
|
+
}
|
|
169
|
+
} catch (error) {
|
|
170
|
+
state$.status.set("error");
|
|
171
|
+
if (debug) {
|
|
172
|
+
console.error("[useForm] Submit error:", error);
|
|
173
|
+
}
|
|
174
|
+
throw error;
|
|
175
|
+
} finally {
|
|
176
|
+
state$.isSubmitting.set(false);
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
[
|
|
180
|
+
state$,
|
|
181
|
+
validateForm,
|
|
182
|
+
onSubmit,
|
|
183
|
+
onError,
|
|
184
|
+
setFieldValue,
|
|
185
|
+
setFieldTouched,
|
|
186
|
+
resetForm,
|
|
187
|
+
debug
|
|
188
|
+
]
|
|
189
|
+
);
|
|
190
|
+
const getFieldProps = React2.useCallback(
|
|
191
|
+
(field) => {
|
|
192
|
+
return {
|
|
193
|
+
name: String(field),
|
|
194
|
+
value: state$.values[field].get(),
|
|
195
|
+
onChange: (value) => setFieldValue(field, value),
|
|
196
|
+
onBlur: () => setFieldTouched(field, true)
|
|
197
|
+
};
|
|
198
|
+
},
|
|
199
|
+
[state$, setFieldValue, setFieldTouched]
|
|
200
|
+
);
|
|
201
|
+
const getFieldMeta = React2.useCallback(
|
|
202
|
+
(field) => {
|
|
203
|
+
const fieldKey = String(field);
|
|
204
|
+
return {
|
|
205
|
+
error: state$.errors[field].get(),
|
|
206
|
+
touched: state$.touched[field].get() ?? false,
|
|
207
|
+
isDirty: state$.values[field].get() !== state$.initialValues[field].get(),
|
|
208
|
+
isValidating: validationInProgress.current.has(fieldKey)
|
|
209
|
+
};
|
|
210
|
+
},
|
|
211
|
+
[state$]
|
|
212
|
+
);
|
|
213
|
+
const values = react.useSelector(() => state$.values.get());
|
|
214
|
+
const errors = react.useSelector(() => state$.errors.get());
|
|
215
|
+
const touched = react.useSelector(() => state$.touched.get());
|
|
216
|
+
const isSubmitting = react.useSelector(() => state$.isSubmitting.get());
|
|
217
|
+
const status = react.useSelector(() => state$.status.get());
|
|
218
|
+
const isValid = react.useSelector(() => Object.keys(state$.errors.get()).length === 0);
|
|
219
|
+
const isDirty = react.useSelector(() => {
|
|
220
|
+
const currentValues = state$.values.get();
|
|
221
|
+
const initialValues2 = state$.initialValues.get();
|
|
222
|
+
return Object.keys(currentValues).some(
|
|
223
|
+
(key) => currentValues[key] !== initialValues2[key]
|
|
224
|
+
);
|
|
225
|
+
});
|
|
226
|
+
return {
|
|
227
|
+
// State
|
|
228
|
+
values,
|
|
229
|
+
errors,
|
|
230
|
+
touched,
|
|
231
|
+
isSubmitting,
|
|
232
|
+
isValid,
|
|
233
|
+
isDirty,
|
|
234
|
+
status,
|
|
235
|
+
// Actions
|
|
236
|
+
handleSubmit,
|
|
237
|
+
setValues: (values2) => {
|
|
238
|
+
if (typeof values2 === "function") {
|
|
239
|
+
state$.values.set(values2(state$.values.get()));
|
|
240
|
+
} else {
|
|
241
|
+
state$.values.set(values2);
|
|
242
|
+
}
|
|
243
|
+
},
|
|
244
|
+
setFieldValue,
|
|
245
|
+
setErrors: (errors2) => state$.errors.set(errors2),
|
|
246
|
+
setFieldError: (field, error) => state$.errors[field].set(error),
|
|
247
|
+
setTouched: (touched2) => state$.touched.set(touched2),
|
|
248
|
+
setFieldTouched,
|
|
249
|
+
validateForm,
|
|
250
|
+
validateField,
|
|
251
|
+
resetForm,
|
|
252
|
+
getFieldProps,
|
|
253
|
+
getFieldMeta
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
var FormContext = React2.createContext(null);
|
|
257
|
+
FormContext.displayName = "FormContext";
|
|
258
|
+
|
|
259
|
+
// src/core/useField.ts
|
|
260
|
+
function useField(options) {
|
|
261
|
+
const { name, validate, transform } = options;
|
|
262
|
+
const form = React2.useContext(FormContext);
|
|
263
|
+
if (!form) {
|
|
264
|
+
throw new Error(
|
|
265
|
+
"useField must be used within a FormContext. Wrap your component with <Form> or use useForm's getFieldProps instead."
|
|
266
|
+
);
|
|
267
|
+
}
|
|
268
|
+
const baseFieldProps = form.getFieldProps(name);
|
|
269
|
+
const field = {
|
|
270
|
+
...baseFieldProps,
|
|
271
|
+
value: baseFieldProps.value,
|
|
272
|
+
onChange: (value) => {
|
|
273
|
+
const transformedValue = transform ? transform(value) : value;
|
|
274
|
+
baseFieldProps.onChange(transformedValue);
|
|
275
|
+
if (validate) {
|
|
276
|
+
const result = validate(transformedValue, form.values);
|
|
277
|
+
if (result instanceof Promise) {
|
|
278
|
+
result.then((error) => {
|
|
279
|
+
if (error !== void 0) {
|
|
280
|
+
form.setFieldError(name, error);
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
} else if (result !== void 0) {
|
|
284
|
+
form.setFieldError(name, result);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
const meta = form.getFieldMeta(name);
|
|
290
|
+
const helpers = {
|
|
291
|
+
setValue: React2.useCallback(
|
|
292
|
+
(value) => {
|
|
293
|
+
const transformedValue = transform ? transform(value) : value;
|
|
294
|
+
form.setFieldValue(name, transformedValue);
|
|
295
|
+
},
|
|
296
|
+
[name, transform, form]
|
|
297
|
+
),
|
|
298
|
+
setTouched: React2.useCallback(
|
|
299
|
+
(touched) => {
|
|
300
|
+
form.setFieldTouched(name, touched);
|
|
301
|
+
},
|
|
302
|
+
[name, form]
|
|
303
|
+
),
|
|
304
|
+
setError: React2.useCallback(
|
|
305
|
+
(error) => {
|
|
306
|
+
form.setFieldError(name, error);
|
|
307
|
+
},
|
|
308
|
+
[name, form]
|
|
309
|
+
)
|
|
310
|
+
};
|
|
311
|
+
return {
|
|
312
|
+
field,
|
|
313
|
+
meta,
|
|
314
|
+
helpers
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
function Form({
|
|
318
|
+
form,
|
|
319
|
+
children,
|
|
320
|
+
className,
|
|
321
|
+
action,
|
|
322
|
+
method = "post",
|
|
323
|
+
noValidate = true,
|
|
324
|
+
...props
|
|
325
|
+
}) {
|
|
326
|
+
const handleFormSubmit = React2__namespace.useCallback(
|
|
327
|
+
async (e) => {
|
|
328
|
+
try {
|
|
329
|
+
await form.handleSubmit(e);
|
|
330
|
+
} catch (error) {
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
[form]
|
|
334
|
+
);
|
|
335
|
+
return /* @__PURE__ */ React2__namespace.createElement(FormContext.Provider, { value: form }, /* @__PURE__ */ React2__namespace.createElement(
|
|
336
|
+
"form",
|
|
337
|
+
{
|
|
338
|
+
onSubmit: handleFormSubmit,
|
|
339
|
+
action,
|
|
340
|
+
method,
|
|
341
|
+
noValidate,
|
|
342
|
+
className,
|
|
343
|
+
...props
|
|
344
|
+
},
|
|
345
|
+
children
|
|
346
|
+
));
|
|
347
|
+
}
|
|
348
|
+
Form.displayName = "Form";
|
|
349
|
+
function Field({
|
|
350
|
+
name,
|
|
351
|
+
label,
|
|
352
|
+
description,
|
|
353
|
+
children,
|
|
354
|
+
showError = true,
|
|
355
|
+
className,
|
|
356
|
+
validate
|
|
357
|
+
}) {
|
|
358
|
+
const fieldState = useField({ name, validate });
|
|
359
|
+
const { meta } = fieldState;
|
|
360
|
+
const hasError = meta.touched && meta.error;
|
|
361
|
+
const errorId = `${name}-error`;
|
|
362
|
+
const descriptionId = `${name}-description`;
|
|
363
|
+
return /* @__PURE__ */ React2__namespace.createElement("div", { className, "data-field": name }, label && /* @__PURE__ */ React2__namespace.createElement("label", { htmlFor: name, className: "field-label" }, label), description && /* @__PURE__ */ React2__namespace.createElement("div", { id: descriptionId, className: "field-description" }, description), /* @__PURE__ */ React2__namespace.createElement("div", { className: "field-input" }, typeof children === "function" ? children(fieldState) : children), showError && hasError && /* @__PURE__ */ React2__namespace.createElement(
|
|
364
|
+
"div",
|
|
365
|
+
{
|
|
366
|
+
id: errorId,
|
|
367
|
+
className: "field-error",
|
|
368
|
+
role: "alert",
|
|
369
|
+
"aria-live": "polite"
|
|
370
|
+
},
|
|
371
|
+
Array.isArray(meta.error) ? meta.error.join(", ") : meta.error
|
|
372
|
+
));
|
|
373
|
+
}
|
|
374
|
+
Field.displayName = "Field";
|
|
375
|
+
|
|
376
|
+
exports.Field = Field;
|
|
377
|
+
exports.Form = Form;
|
|
378
|
+
exports.FormContext = FormContext;
|
|
379
|
+
exports.useField = useField;
|
|
380
|
+
exports.useForm = useForm;
|
|
381
|
+
//# sourceMappingURL=chunk-ZQCPEOB6.cjs.map
|
|
382
|
+
//# sourceMappingURL=chunk-ZQCPEOB6.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/useForm.ts","../src/core/FormContext.tsx","../src/core/useField.ts","../src/core/Form.tsx","../src/core/Field.tsx"],"names":["useObservable","useRef","useCallback","errors","touched","values","useSelector","initialValues","createContext","useContext","React","React2"],"mappings":"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","file":"chunk-ZQCPEOB6.cjs","sourcesContent":["\"use client\";\n\nimport { useCallback, useRef } from \"react\";\nimport { useObservable, useSelector } from \"@legendapp/state/react\";\nimport type {\n FormValues,\n FormErrors,\n TouchedFields,\n UseFormOptions,\n UseFormReturn,\n SubmissionStatus,\n FieldInputProps,\n FieldMeta,\n FormHelpers,\n} from \"./types\";\n\n/**\n * useForm - High-performance form state management with field-level reactivity\n *\n * Built on @legendapp/state for optimal performance:\n * - Field-level reactivity: Only re-render the specific field that changed\n * - Observable-based state: ~1 re-render per change vs ~10 for traditional hooks\n * - Tree-shakable: Only bundle what you use\n *\n * @example\n * ```tsx\n * const form = useForm({\n * initialValues: { email: '', password: '' },\n * onSubmit: async (values) => {\n * await login(values);\n * },\n * validationSchema: {\n * email: (value) => !value ? 'Required' : undefined,\n * password: (value) => value.length < 8 ? 'Too short' : undefined,\n * },\n * });\n *\n * return (\n * <form onSubmit={form.handleSubmit}>\n * <input {...form.getFieldProps('email')} />\n * {form.errors.email && <span>{form.errors.email}</span>}\n * </form>\n * );\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/use-form\n */\nexport function useForm<T extends FormValues = FormValues>(\n options: UseFormOptions<T>\n): UseFormReturn<T> {\n const {\n initialValues,\n validationSchema,\n validateOn = \"onBlur\",\n revalidateOn = \"onChange\",\n onSubmit,\n onError,\n debug = false,\n } = options;\n\n // Create observable form state for field-level reactivity\n // Note: Type assertion needed for @legendapp/state beta compatibility\n // The beta version's TypeScript types don't properly expose nested Observable properties\n // This will be removed once stable v3.0.0 is released with proper type definitions\n const state$ = useObservable({\n values: initialValues,\n errors: {} as FormErrors<T>,\n touched: {} as TouchedFields<T>,\n isSubmitting: false,\n status: \"idle\" as SubmissionStatus,\n initialValues: { ...initialValues }, // Create a copy to prevent reference sharing\n hasValidated: {} as Record<string, boolean>,\n }) as any;\n\n // Track validation in progress to prevent race conditions\n const validationInProgress = useRef<Set<string>>(new Set());\n\n /**\n * Validate a single field\n */\n const validateField = useCallback(\n async <K extends keyof T>(field: K): Promise<string | undefined> => {\n const validators = validationSchema?.[field];\n if (!validators) return undefined;\n\n const fieldKey = String(field);\n validationInProgress.current.add(fieldKey);\n\n try {\n const value = state$.values[field].get();\n const allValues = state$.values.get();\n\n const validatorArray = Array.isArray(validators)\n ? validators\n : [validators];\n\n for (const validator of validatorArray) {\n const error = await validator(value, allValues);\n if (error) {\n state$.errors[field].set(error);\n validationInProgress.current.delete(fieldKey);\n return error;\n }\n }\n\n // Clear error if validation passed\n state$.errors[field].set(undefined);\n validationInProgress.current.delete(fieldKey);\n return undefined;\n } catch (error) {\n validationInProgress.current.delete(fieldKey);\n const errorMessage =\n error instanceof Error ? error.message : \"Validation error\";\n state$.errors[field].set(errorMessage);\n return errorMessage;\n }\n },\n [validationSchema, state$]\n );\n\n /**\n * Validate entire form\n */\n const validateForm = useCallback(async (): Promise<FormErrors<T>> => {\n if (!validationSchema) return {};\n\n const fields = Object.keys(validationSchema) as Array<keyof T>;\n const errors: FormErrors<T> = {};\n\n await Promise.all(\n fields.map(async (field) => {\n const error = await validateField(field);\n if (error) {\n errors[field] = error;\n }\n })\n );\n\n state$.errors.set(errors);\n return errors;\n }, [validationSchema, validateField, state$]);\n\n /**\n * Set field value with optional validation\n */\n const setFieldValue = useCallback(\n <K extends keyof T>(field: K, value: T[K]) => {\n state$.values[field].set(value);\n\n // Revalidate if field has been validated before\n const shouldRevalidate =\n revalidateOn === \"onChange\" &&\n state$.hasValidated[String(field)].get();\n\n if (shouldRevalidate && validationSchema?.[field]) {\n validateField(field);\n }\n\n if (debug) {\n console.log(\"[useForm] setFieldValue:\", { field, value });\n }\n },\n [state$, revalidateOn, validationSchema, validateField, debug]\n );\n\n /**\n * Set field as touched with optional validation\n */\n const setFieldTouched = useCallback(\n <K extends keyof T>(field: K, touched: boolean) => {\n state$.touched[field].set(touched);\n\n // Validate on blur if configured\n if (touched && validateOn === \"onBlur\" && validationSchema?.[field]) {\n state$.hasValidated[String(field)].set(true);\n validateField(field);\n }\n\n if (debug) {\n console.log(\"[useForm] setFieldTouched:\", { field, touched });\n }\n },\n [state$, validateOn, validationSchema, validateField, debug]\n );\n\n /**\n * Reset form to initial values\n */\n const resetForm = useCallback(() => {\n state$.values.set(state$.initialValues.get());\n state$.errors.set({});\n state$.touched.set({});\n state$.isSubmitting.set(false);\n state$.status.set(\"idle\");\n state$.hasValidated.set({});\n\n if (debug) {\n console.log(\"[useForm] Form reset\");\n }\n }, [state$, debug]);\n\n /**\n * Handle form submission\n */\n const handleSubmit = useCallback(\n async (e?: React.FormEvent) => {\n e?.preventDefault();\n\n if (debug) {\n console.log(\"[useForm] handleSubmit started\");\n }\n\n state$.isSubmitting.set(true);\n state$.status.set(\"submitting\");\n\n try {\n // Validate form\n const errors = await validateForm();\n const hasErrors = Object.keys(errors).length > 0;\n\n if (hasErrors) {\n state$.status.set(\"error\");\n onError?.(errors);\n\n if (debug) {\n console.log(\"[useForm] Validation errors:\", errors);\n }\n\n return;\n }\n\n // Create form helpers\n const helpers: FormHelpers<T> = {\n setValues: (values) => {\n if (typeof values === \"function\") {\n state$.values.set(values(state$.values.get()));\n } else {\n state$.values.set(values);\n }\n },\n setFieldValue,\n setErrors: (errors) => state$.errors.set(errors),\n setFieldError: (field, error) => state$.errors[field].set(error),\n setTouched: (touched) => state$.touched.set(touched),\n setFieldTouched,\n setSubmitting: (submitting) => state$.isSubmitting.set(submitting),\n resetForm,\n };\n\n // Call submission handler\n await onSubmit(state$.values.get(), helpers);\n\n state$.status.set(\"success\");\n\n if (debug) {\n console.log(\"[useForm] Submit successful\");\n }\n } catch (error) {\n state$.status.set(\"error\");\n\n if (debug) {\n console.error(\"[useForm] Submit error:\", error);\n }\n\n throw error;\n } finally {\n state$.isSubmitting.set(false);\n }\n },\n [\n state$,\n validateForm,\n onSubmit,\n onError,\n setFieldValue,\n setFieldTouched,\n resetForm,\n debug,\n ]\n );\n\n /**\n * Get field props for binding to inputs\n */\n const getFieldProps = useCallback(\n <K extends keyof T>(field: K): FieldInputProps<T[K]> => {\n return {\n name: String(field),\n value: state$.values[field].get(),\n onChange: (value: T[K]) => setFieldValue(field, value),\n onBlur: () => setFieldTouched(field, true),\n };\n },\n [state$, setFieldValue, setFieldTouched]\n );\n\n /**\n * Get field meta information\n */\n const getFieldMeta = useCallback(\n <K extends keyof T>(field: K): FieldMeta => {\n const fieldKey = String(field);\n return {\n error: state$.errors[field].get(),\n touched: state$.touched[field].get() ?? false,\n isDirty:\n state$.values[field].get() !== state$.initialValues[field].get(),\n isValidating: validationInProgress.current.has(fieldKey),\n };\n },\n [state$]\n );\n\n // Use selectors for reactive properties\n const values = useSelector(() => state$.values.get());\n const errors = useSelector(() => state$.errors.get());\n const touched = useSelector(() => state$.touched.get());\n const isSubmitting = useSelector(() => state$.isSubmitting.get());\n const status = useSelector(() => state$.status.get());\n\n // Use selectors for derived state to ensure reactivity\n const isValid = useSelector(() => Object.keys(state$.errors.get()).length === 0);\n const isDirty = useSelector(() => {\n const currentValues = state$.values.get();\n const initialValues = state$.initialValues.get();\n return Object.keys(currentValues).some(\n (key) => currentValues[key] !== initialValues[key]\n );\n });\n\n return {\n // State\n values,\n errors,\n touched,\n isSubmitting,\n isValid,\n isDirty,\n status,\n\n // Actions\n handleSubmit,\n setValues: (values) => {\n if (typeof values === \"function\") {\n state$.values.set(values(state$.values.get()));\n } else {\n state$.values.set(values);\n }\n },\n setFieldValue,\n setErrors: (errors) => state$.errors.set(errors),\n setFieldError: (field, error) => state$.errors[field].set(error),\n setTouched: (touched) => state$.touched.set(touched),\n setFieldTouched,\n validateForm,\n validateField,\n resetForm,\n getFieldProps,\n getFieldMeta,\n };\n}\n","\"use client\";\n\nimport { createContext } from \"react\";\nimport type { UseFormReturn } from \"./types\";\n\n/**\n * FormContext - React context for providing form state to child components\n *\n * Allows useField hook to access form state without prop drilling.\n * Automatically provided by the <Form> component.\n *\n * @internal\n */\nexport const FormContext = createContext<UseFormReturn<any> | null>(null);\n\nFormContext.displayName = \"FormContext\";\n","\"use client\";\n\nimport { useCallback, useContext } from \"react\";\nimport { FormContext } from \"./FormContext\";\nimport type { UseFieldOptions, UseFieldReturn, FieldInputProps, FieldMeta } from \"./types\";\n\n/**\n * useField - Field-level reactive hook for form inputs\n *\n * Provides isolated reactivity for individual form fields.\n * Only re-renders when the specific field changes, not when other fields update.\n *\n * Must be used within a FormContext (inside <Form> component).\n *\n * @example\n * ```tsx\n * function EmailInput() {\n * const { field, meta, helpers } = useField({ name: 'email' });\n *\n * return (\n * <div>\n * <input {...field} type=\"email\" />\n * {meta.touched && meta.error && <span>{meta.error}</span>}\n * </div>\n * );\n * }\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/use-field\n */\nexport function useField<T = any>(\n options: UseFieldOptions<T>\n): UseFieldReturn<T> {\n const { name, validate, transform } = options;\n\n const form = useContext(FormContext);\n\n if (!form) {\n throw new Error(\n \"useField must be used within a FormContext. \" +\n \"Wrap your component with <Form> or use useForm's getFieldProps instead.\"\n );\n }\n\n // Get field props with automatic change/blur handling\n const baseFieldProps = form.getFieldProps(name);\n\n // Apply transform if provided\n const field: FieldInputProps<T> = {\n ...baseFieldProps,\n value: baseFieldProps.value as T,\n onChange: (value: T) => {\n const transformedValue = transform ? transform(value) : value;\n baseFieldProps.onChange(transformedValue);\n\n // Run field-level validation if provided\n if (validate) {\n const result = validate(transformedValue, form.values);\n if (result instanceof Promise) {\n result.then((error) => {\n if (error !== undefined) {\n form.setFieldError(name, error);\n }\n });\n } else if (result !== undefined) {\n form.setFieldError(name, result);\n }\n }\n },\n };\n\n // Get field meta information\n const meta: FieldMeta = form.getFieldMeta(name);\n\n // Field helpers\n const helpers = {\n setValue: useCallback(\n (value: T) => {\n const transformedValue = transform ? transform(value) : value;\n form.setFieldValue(name, transformedValue);\n },\n [name, transform, form]\n ),\n setTouched: useCallback(\n (touched: boolean) => {\n form.setFieldTouched(name, touched);\n },\n [name, form]\n ),\n setError: useCallback(\n (error: string | undefined) => {\n form.setFieldError(name, error);\n },\n [name, form]\n ),\n };\n\n return {\n field,\n meta,\n helpers,\n };\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { FormContext } from \"./FormContext\";\nimport type { FormProps, FormValues } from \"./types\";\n\n/**\n * Form - Progressive enhancement form component\n *\n * Provides form context to child components and handles form submission.\n * Supports progressive enhancement with server-side fallback.\n *\n * Features:\n * - Provides FormContext for useField hook\n * - Handles form submission with validation\n * - Progressive enhancement support (works without JavaScript)\n * - Accessible form semantics\n *\n * @example\n * ```tsx\n * const form = useForm({\n * initialValues: { email: '' },\n * onSubmit: async (values) => {\n * await submitForm(values);\n * },\n * });\n *\n * return (\n * <Form form={form} action=\"/api/submit\" method=\"post\">\n * <input {...form.getFieldProps('email')} />\n * <button type=\"submit\">Submit</button>\n * </Form>\n * );\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/form\n */\nexport function Form<T extends FormValues = FormValues>({\n form,\n children,\n className,\n action,\n method = \"post\",\n noValidate = true,\n ...props\n}: FormProps<T> & React.FormHTMLAttributes<HTMLFormElement>) {\n // Wrap handleSubmit to catch any unhandled rejections\n const handleFormSubmit = React.useCallback(\n async (e: React.FormEvent) => {\n try {\n await form.handleSubmit(e);\n } catch (error) {\n // Error is already handled by useForm, just prevent unhandled rejection\n // The form status and errors are already set by useForm's error handling\n }\n },\n [form]\n );\n\n return (\n <FormContext.Provider value={form}>\n <form\n onSubmit={handleFormSubmit}\n action={action}\n method={method}\n noValidate={noValidate}\n className={className}\n {...props}\n >\n {children}\n </form>\n </FormContext.Provider>\n );\n}\n\nForm.displayName = \"Form\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useField } from \"./useField\";\nimport type { FieldProps } from \"./types\";\n\n/**\n * Field - Field wrapper component with label, description, and error display\n *\n * Provides a complete field UI with automatic error handling and accessibility.\n * Uses useField hook internally for field-level reactivity.\n *\n * Features:\n * - Automatic label association\n * - Error display with accessibility\n * - Optional description text\n * - Render prop pattern for flexibility\n * - Full accessibility support\n *\n * @example\n * ```tsx\n * <Field name=\"email\" label=\"Email Address\" description=\"We'll never share your email\">\n * {({ field, meta }) => (\n * <input\n * {...field}\n * type=\"email\"\n * className={meta.error && meta.touched ? 'error' : ''}\n * />\n * )}\n * </Field>\n * ```\n *\n * @see https://opensite.ai/developers/page-speed/forms/field\n */\nexport function Field({\n name,\n label,\n description,\n children,\n showError = true,\n className,\n validate,\n}: FieldProps) {\n const fieldState = useField({ name, validate });\n const { meta } = fieldState;\n\n const hasError = meta.touched && meta.error;\n const errorId = `${name}-error`;\n const descriptionId = `${name}-description`;\n\n return (\n <div className={className} data-field={name}>\n {/* Label */}\n {label && (\n <label htmlFor={name} className=\"field-label\">\n {label}\n </label>\n )}\n\n {/* Description */}\n {description && (\n <div id={descriptionId} className=\"field-description\">\n {description}\n </div>\n )}\n\n {/* Field content (render prop or direct children) */}\n <div className=\"field-input\">\n {typeof children === \"function\" ? children(fieldState) : children}\n </div>\n\n {/* Error message */}\n {showError && hasError && (\n <div\n id={errorId}\n className=\"field-error\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {Array.isArray(meta.error) ? meta.error.join(\", \") : meta.error}\n </div>\n )}\n </div>\n );\n}\n\nField.displayName = \"Field\";\n"]}
|
package/dist/core.cjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkZQCPEOB6_cjs = require('./chunk-ZQCPEOB6.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "Field", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () { return chunkZQCPEOB6_cjs.Field; }
|
|
10
|
+
});
|
|
11
|
+
Object.defineProperty(exports, "Form", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: function () { return chunkZQCPEOB6_cjs.Form; }
|
|
14
|
+
});
|
|
15
|
+
Object.defineProperty(exports, "FormContext", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
get: function () { return chunkZQCPEOB6_cjs.FormContext; }
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports, "useField", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
get: function () { return chunkZQCPEOB6_cjs.useField; }
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(exports, "useForm", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
get: function () { return chunkZQCPEOB6_cjs.useForm; }
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=core.cjs.map
|
|
28
|
+
//# sourceMappingURL=core.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"core.cjs"}
|