@bookinglab/booking-ui-react 1.4.0 → 1.5.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/README.md +35 -1
- package/dist/index.d.cts +16 -1
- package/dist/index.d.ts +16 -1
- package/dist/index.js +25 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +25 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -353,6 +353,7 @@ A form component for collecting contact details (first name, last name, email) a
|
|
|
353
353
|
| Prop | Type | Default | Description |
|
|
354
354
|
|------|------|---------|-------------|
|
|
355
355
|
| `questions` | `Question[]` | `[]` | Additional questions to render after the contact fields |
|
|
356
|
+
| `initialValues` | `ContactDetailsInitialValues` | `undefined` | Initial values for pre-populating the form |
|
|
356
357
|
| `onSubmit` | `(values: ContactDetailsValues) => void` | required | Callback fired on valid submission |
|
|
357
358
|
| `onChange` | `(values: Partial<ContactDetailsValues>, isValid: boolean) => void` | `undefined` | Callback fired on every field change |
|
|
358
359
|
| `submitLabel` | `string` | `"Submit"` | Text for the submit button |
|
|
@@ -399,7 +400,39 @@ interface ContactDetailsFieldSettings {
|
|
|
399
400
|
}
|
|
400
401
|
```
|
|
401
402
|
|
|
402
|
-
###
|
|
403
|
+
### Initial Values
|
|
404
|
+
|
|
405
|
+
Pre-populate the form with existing data using `initialValues`:
|
|
406
|
+
|
|
407
|
+
```tsx
|
|
408
|
+
<ContactDetailsForm
|
|
409
|
+
onSubmit={handleSubmit}
|
|
410
|
+
initialValues={{
|
|
411
|
+
firstName: 'Sarah',
|
|
412
|
+
lastName: 'Grey',
|
|
413
|
+
email: 'sarah@example.com',
|
|
414
|
+
questions: {
|
|
415
|
+
2: '5', // select option ID as string
|
|
416
|
+
7: 25, // number value
|
|
417
|
+
10: 'Wheelchair access needed',
|
|
418
|
+
12: true, // checkbox
|
|
419
|
+
},
|
|
420
|
+
}}
|
|
421
|
+
/>
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
```typescript
|
|
425
|
+
interface ContactDetailsInitialValues {
|
|
426
|
+
firstName?: string;
|
|
427
|
+
lastName?: string;
|
|
428
|
+
email?: string;
|
|
429
|
+
questions?: Record<number, string | number | boolean>;
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
When `reset()` is called via ref, the form restores to these initial values rather than empty fields.
|
|
434
|
+
|
|
435
|
+
|
|
403
436
|
|
|
404
437
|
Pass additional questions to render after the contact fields:
|
|
405
438
|
|
|
@@ -480,6 +513,7 @@ import type {
|
|
|
480
513
|
ContactDetailsQuestionEntry,
|
|
481
514
|
ContactDetailsAnswerEntry,
|
|
482
515
|
ContactDetailsFieldSettings,
|
|
516
|
+
ContactDetailsInitialValues,
|
|
483
517
|
ContactFieldSettings,
|
|
484
518
|
} from '@bookinglab/booking-ui-react';
|
|
485
519
|
```
|
package/dist/index.d.cts
CHANGED
|
@@ -168,12 +168,27 @@ interface ContactDetailsFieldSettings {
|
|
|
168
168
|
lastName?: ContactFieldSettings;
|
|
169
169
|
email?: ContactFieldSettings;
|
|
170
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Initial values for pre-populating the form
|
|
173
|
+
*/
|
|
174
|
+
interface ContactDetailsInitialValues {
|
|
175
|
+
/** Initial first name value */
|
|
176
|
+
firstName?: string;
|
|
177
|
+
/** Initial last name value */
|
|
178
|
+
lastName?: string;
|
|
179
|
+
/** Initial email value */
|
|
180
|
+
email?: string;
|
|
181
|
+
/** Initial question values keyed by question ID */
|
|
182
|
+
questions?: Record<number, string | number | boolean>;
|
|
183
|
+
}
|
|
171
184
|
/**
|
|
172
185
|
* Props for the ContactDetailsForm component
|
|
173
186
|
*/
|
|
174
187
|
interface ContactDetailsFormProps {
|
|
175
188
|
/** Additional questions to render after the contact fields */
|
|
176
189
|
questions?: Question[];
|
|
190
|
+
/** Initial values for pre-populating the form fields */
|
|
191
|
+
initialValues?: ContactDetailsInitialValues;
|
|
177
192
|
/** Callback fired when form is submitted with valid values */
|
|
178
193
|
onSubmit: (values: ContactDetailsValues) => void;
|
|
179
194
|
/** Callback fired on every field change */
|
|
@@ -373,4 +388,4 @@ declare function minLen(min: number): (value: string) => string | null;
|
|
|
373
388
|
*/
|
|
374
389
|
declare function compose(...validators: Array<(value: string) => string | null>): (value: string) => string | null;
|
|
375
390
|
|
|
376
|
-
export { BookingForm, type BookingFormClassNames, type BookingFormProps, type BookingUIConfig, type ContactDetailsAnswerEntry, type ContactDetailsFieldSettings, ContactDetailsForm, type ContactDetailsFormClassNames, type ContactDetailsFormProps, type ContactDetailsFormRef, type ContactDetailsQuestionEntry, type ContactDetailsValues, type ContactFieldSettings, type FieldConfig, type FieldOption, type FormErrors, type FormValues, type Question, type QuestionOption, type QuestionSettings, RegistrationForm, type RegistrationFormClassNames, type RegistrationFormErrors, type RegistrationFormProps, type RegistrationFormRef, type RegistrationFormValues, compose, email, minLen, phone, required, ukPostcode };
|
|
391
|
+
export { BookingForm, type BookingFormClassNames, type BookingFormProps, type BookingUIConfig, type ContactDetailsAnswerEntry, type ContactDetailsFieldSettings, ContactDetailsForm, type ContactDetailsFormClassNames, type ContactDetailsFormProps, type ContactDetailsFormRef, type ContactDetailsInitialValues, type ContactDetailsQuestionEntry, type ContactDetailsValues, type ContactFieldSettings, type FieldConfig, type FieldOption, type FormErrors, type FormValues, type Question, type QuestionOption, type QuestionSettings, RegistrationForm, type RegistrationFormClassNames, type RegistrationFormErrors, type RegistrationFormProps, type RegistrationFormRef, type RegistrationFormValues, compose, email, minLen, phone, required, ukPostcode };
|
package/dist/index.d.ts
CHANGED
|
@@ -168,12 +168,27 @@ interface ContactDetailsFieldSettings {
|
|
|
168
168
|
lastName?: ContactFieldSettings;
|
|
169
169
|
email?: ContactFieldSettings;
|
|
170
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* Initial values for pre-populating the form
|
|
173
|
+
*/
|
|
174
|
+
interface ContactDetailsInitialValues {
|
|
175
|
+
/** Initial first name value */
|
|
176
|
+
firstName?: string;
|
|
177
|
+
/** Initial last name value */
|
|
178
|
+
lastName?: string;
|
|
179
|
+
/** Initial email value */
|
|
180
|
+
email?: string;
|
|
181
|
+
/** Initial question values keyed by question ID */
|
|
182
|
+
questions?: Record<number, string | number | boolean>;
|
|
183
|
+
}
|
|
171
184
|
/**
|
|
172
185
|
* Props for the ContactDetailsForm component
|
|
173
186
|
*/
|
|
174
187
|
interface ContactDetailsFormProps {
|
|
175
188
|
/** Additional questions to render after the contact fields */
|
|
176
189
|
questions?: Question[];
|
|
190
|
+
/** Initial values for pre-populating the form fields */
|
|
191
|
+
initialValues?: ContactDetailsInitialValues;
|
|
177
192
|
/** Callback fired when form is submitted with valid values */
|
|
178
193
|
onSubmit: (values: ContactDetailsValues) => void;
|
|
179
194
|
/** Callback fired on every field change */
|
|
@@ -373,4 +388,4 @@ declare function minLen(min: number): (value: string) => string | null;
|
|
|
373
388
|
*/
|
|
374
389
|
declare function compose(...validators: Array<(value: string) => string | null>): (value: string) => string | null;
|
|
375
390
|
|
|
376
|
-
export { BookingForm, type BookingFormClassNames, type BookingFormProps, type BookingUIConfig, type ContactDetailsAnswerEntry, type ContactDetailsFieldSettings, ContactDetailsForm, type ContactDetailsFormClassNames, type ContactDetailsFormProps, type ContactDetailsFormRef, type ContactDetailsQuestionEntry, type ContactDetailsValues, type ContactFieldSettings, type FieldConfig, type FieldOption, type FormErrors, type FormValues, type Question, type QuestionOption, type QuestionSettings, RegistrationForm, type RegistrationFormClassNames, type RegistrationFormErrors, type RegistrationFormProps, type RegistrationFormRef, type RegistrationFormValues, compose, email, minLen, phone, required, ukPostcode };
|
|
391
|
+
export { BookingForm, type BookingFormClassNames, type BookingFormProps, type BookingUIConfig, type ContactDetailsAnswerEntry, type ContactDetailsFieldSettings, ContactDetailsForm, type ContactDetailsFormClassNames, type ContactDetailsFormProps, type ContactDetailsFormRef, type ContactDetailsInitialValues, type ContactDetailsQuestionEntry, type ContactDetailsValues, type ContactFieldSettings, type FieldConfig, type FieldOption, type FormErrors, type FormValues, type Question, type QuestionOption, type QuestionSettings, RegistrationForm, type RegistrationFormClassNames, type RegistrationFormErrors, type RegistrationFormProps, type RegistrationFormRef, type RegistrationFormValues, compose, email, minLen, phone, required, ukPostcode };
|
package/dist/index.js
CHANGED
|
@@ -674,6 +674,7 @@ var ContactDetailsForm = react.forwardRef(
|
|
|
674
674
|
questions = [],
|
|
675
675
|
onSubmit,
|
|
676
676
|
onChange: _onChange,
|
|
677
|
+
initialValues,
|
|
677
678
|
validateOnBlur = true,
|
|
678
679
|
submitLabel = "Submit",
|
|
679
680
|
className = "",
|
|
@@ -681,12 +682,19 @@ var ContactDetailsForm = react.forwardRef(
|
|
|
681
682
|
fieldSettings = {}
|
|
682
683
|
}, ref) => {
|
|
683
684
|
const formId = react.useId();
|
|
684
|
-
const [firstName, setFirstName] = react.useState("");
|
|
685
|
-
const [lastName, setLastName] = react.useState("");
|
|
686
|
-
const [emailValue, setEmailValue] = react.useState("");
|
|
685
|
+
const [firstName, setFirstName] = react.useState(initialValues?.firstName || "");
|
|
686
|
+
const [lastName, setLastName] = react.useState(initialValues?.lastName || "");
|
|
687
|
+
const [emailValue, setEmailValue] = react.useState(initialValues?.email || "");
|
|
687
688
|
const [contactErrors, setContactErrors] = react.useState({});
|
|
688
689
|
const [contactTouched, setContactTouched] = react.useState({});
|
|
689
|
-
const [questionValues, setQuestionValues] = react.useState({
|
|
690
|
+
const [questionValues, setQuestionValues] = react.useState(() => {
|
|
691
|
+
if (!initialValues?.questions) return {};
|
|
692
|
+
const init = {};
|
|
693
|
+
for (const [key, val] of Object.entries(initialValues.questions)) {
|
|
694
|
+
init[Number(key)] = val;
|
|
695
|
+
}
|
|
696
|
+
return init;
|
|
697
|
+
});
|
|
690
698
|
const [questionErrors, setQuestionErrors] = react.useState({});
|
|
691
699
|
const [questionTouched, setQuestionTouched] = react.useState({});
|
|
692
700
|
const getFieldRequired = (name) => {
|
|
@@ -850,12 +858,20 @@ var ContactDetailsForm = react.forwardRef(
|
|
|
850
858
|
}, [contactFields, questions, validateAllContacts, validateAllQuestions, onSubmit, buildOutput]);
|
|
851
859
|
react.useImperativeHandle(ref, () => ({
|
|
852
860
|
reset: () => {
|
|
853
|
-
setFirstName("");
|
|
854
|
-
setLastName("");
|
|
855
|
-
setEmailValue("");
|
|
861
|
+
setFirstName(initialValues?.firstName || "");
|
|
862
|
+
setLastName(initialValues?.lastName || "");
|
|
863
|
+
setEmailValue(initialValues?.email || "");
|
|
856
864
|
setContactErrors({});
|
|
857
865
|
setContactTouched({});
|
|
858
|
-
|
|
866
|
+
if (initialValues?.questions) {
|
|
867
|
+
const init = {};
|
|
868
|
+
for (const [key, val] of Object.entries(initialValues.questions)) {
|
|
869
|
+
init[Number(key)] = val;
|
|
870
|
+
}
|
|
871
|
+
setQuestionValues(init);
|
|
872
|
+
} else {
|
|
873
|
+
setQuestionValues({});
|
|
874
|
+
}
|
|
859
875
|
setQuestionErrors({});
|
|
860
876
|
setQuestionTouched({});
|
|
861
877
|
},
|
|
@@ -864,7 +880,7 @@ var ContactDetailsForm = react.forwardRef(
|
|
|
864
880
|
if (vals.lastName !== void 0) setLastName(vals.lastName);
|
|
865
881
|
if (vals.email !== void 0) setEmailValue(vals.email);
|
|
866
882
|
}
|
|
867
|
-
}), []);
|
|
883
|
+
}), [initialValues]);
|
|
868
884
|
const styles = {
|
|
869
885
|
fieldWrapper: classNames.fieldWrapper || "mb-4",
|
|
870
886
|
label: classNames.label || "block text-sm font-medium mb-1",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/BookingForm.tsx","../src/utils/validators.ts","../src/components/RegistrationForm.tsx","../src/components/ContactDetailsForm.tsx"],"names":["jsxs","jsx","useState","useCallback","useEffect","forwardRef","useId","useImperativeHandle","cx"],"mappings":"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","file":"index.js","sourcesContent":["import React, { useState, useEffect, useCallback } from 'react';\nimport type { Question, FormValues, FormErrors, BookingFormProps, BookingFormClassNames } from '../types';\n\n/** Merge base classes with optional custom classes */\nconst cx = (...classes: (string | undefined)[]) => classes.filter(Boolean).join(' ');\n\n/**\n * Renders a single form field based on question type\n */\nfunction FormField({\n question,\n value,\n error,\n onChange,\n classNames,\n}: {\n question: Question;\n value: string | number | boolean | undefined;\n error?: string;\n onChange: (value: string | number | boolean) => void;\n classNames?: BookingFormClassNames;\n}) {\n const inputId = `question-${question.id}`;\n const errorId = `${inputId}-error`;\n const hasError = !!error;\n\n // Default classes (can be overridden via classNames prop)\n const defaultFieldWrapper = 'mb-4';\n const defaultLabel = 'block text-sm font-medium mb-1 text-gray-700';\n const defaultHeading = 'text-lg font-semibold text-gray-900 mt-4 mb-2 first:mt-0';\n const defaultInput = 'w-full px-3 py-2 border rounded-md text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-offset-1 border-gray-300 focus:ring-blue-500 focus:border-blue-500';\n const defaultInputError = 'border-red-500 focus:ring-red-500';\n const defaultCheckbox = 'mt-1 h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500';\n const defaultHelpText = 'mt-1 text-xs text-gray-500';\n const defaultErrorText = 'mt-1 text-xs text-red-600';\n\n const inputClasses = hasError\n ? cx(classNames?.input ?? defaultInput, classNames?.inputError ?? defaultInputError)\n : cx(classNames?.input ?? defaultInput);\n\n const labelClasses = classNames?.label ?? defaultLabel;\n const checkboxLabelClasses = cx('text-sm', classNames?.label ?? 'text-gray-700');\n\n const renderLabel = () => {\n if (question.detail_type === 'heading') return null;\n return (\n <label htmlFor={inputId} className={labelClasses}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n );\n };\n\n const renderHelpText = () => {\n if (!question.help_text) return null;\n return <p className={classNames?.helpText ?? defaultHelpText}>{question.help_text}</p>;\n };\n\n const renderError = () => {\n if (!error) return null;\n return (\n <p id={errorId} className={classNames?.errorText ?? defaultErrorText} role=\"alert\">\n {error}\n </p>\n );\n };\n\n const ariaProps = {\n 'aria-invalid': hasError ? true : undefined,\n 'aria-describedby': hasError ? errorId : undefined,\n 'aria-required': question.required || undefined,\n };\n\n switch (question.detail_type) {\n case 'heading':\n return (\n <h3 className={classNames?.heading ?? defaultHeading}>\n {question.name}\n </h3>\n );\n\n case 'text_field':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={question.settings?.placeholder}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'text_area':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <textarea\n id={inputId}\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={question.settings?.placeholder}\n rows={4}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'select':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <select\n id={inputId}\n value={(value as string | number) ?? ''}\n onChange={(e) => onChange(e.target.value)}\n className={inputClasses}\n {...ariaProps}\n >\n <option value=\"\">Select an option</option>\n {question.options?.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'date':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"date\"\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n min={question.settings?.min?.toString()}\n max={question.settings?.max?.toString()}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'number':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"number\"\n value={(value as number) ?? ''}\n onChange={(e) => onChange(e.target.value ? Number(e.target.value) : '')}\n min={question.settings?.min}\n max={question.settings?.max}\n placeholder={question.settings?.placeholder}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'check':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n <div className=\"flex items-start gap-2\">\n <input\n id={inputId}\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n className={classNames?.checkbox ?? defaultCheckbox}\n {...ariaProps}\n />\n <label htmlFor={inputId} className={checkboxLabelClasses}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n </div>\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n default:\n return null;\n }\n}\n\n/**\n * BookingForm - A dynamic form component for booking questions\n *\n * @example\n * ```tsx\n * const questions: Question[] = [\n * { id: 1, name: 'Personal Details', detail_type: 'heading' },\n * { id: 2, name: 'Full Name', detail_type: 'text_field', required: true },\n * { id: 3, name: 'Email', detail_type: 'text_field', required: true },\n * ];\n *\n * <BookingForm\n * questions={questions}\n * onSubmit={(values) => console.log(values)}\n * />\n * ```\n */\nexport function BookingForm({\n questions,\n onSubmit,\n submitLabel = 'Submit',\n className = '',\n labelClassName,\n classNames: classNamesProp,\n}: BookingFormProps) {\n // Merge deprecated labelClassName into classNames for backwards compatibility\n const classNames: BookingFormClassNames = {\n ...classNamesProp,\n label: classNamesProp?.label ?? labelClassName,\n };\n const [values, setValues] = useState<FormValues>({});\n const [errors, setErrors] = useState<FormErrors>({});\n const [touched, setTouched] = useState<Record<number, boolean>>({});\n\n\n // Check if a question should be visible based on conditional settings\n const isQuestionVisible = useCallback(\n (question: Question): boolean => {\n const { settings } = question;\n if (!settings?.conditional_answers) {\n return true;\n }\n\n // Check all conditions in conditional_answers\n // Each entry is { questionId: expectedAnswerValue }\n const conditionEntries = Object.entries(settings.conditional_answers as Record<string, unknown>);\n if (conditionEntries.length === 0) {\n return true;\n }\n\n // Question is visible if ANY condition is met\n return conditionEntries.some(([questionIdStr, expectedAnswer]) => {\n const questionId = Number(questionIdStr);\n const currentValue = (values as Record<string, unknown>)[String(questionId)];\n\n if (currentValue === undefined || currentValue === '' || currentValue === null) {\n return false;\n }\n\n // Selects typically store the option id (as string), but allow `{ id, name }` objects too\n const normalizedCurrent =\n typeof currentValue === 'object' && currentValue !== null && 'id' in (currentValue as any)\n ? (currentValue as any)\n : currentValue;\n\n // Build a set of candidate strings for comparison.\n // For select questions we support matching by BOTH option id and option name.\n const candidates = new Set<string>();\n\n const addCandidate = (v: unknown) => {\n if (v === undefined || v === null) return;\n const s = String(v).trim();\n if (s) candidates.add(s);\n };\n\n const sourceQuestion = questions.find((q) => q.id === questionId);\n\n if (typeof normalizedCurrent === 'object' && normalizedCurrent !== null) {\n addCandidate((normalizedCurrent as any).id);\n addCandidate((normalizedCurrent as any).name);\n } else {\n addCandidate(normalizedCurrent);\n }\n\n if (sourceQuestion?.detail_type === 'select' && sourceQuestion.options?.length) {\n // Try to resolve the selected option via id or name.\n const currentStr = [...candidates][0] ?? '';\n const optionById = sourceQuestion.options.find((o) => String(o.id) === currentStr);\n const optionByName = sourceQuestion.options.find((o) => String(o.name).trim() === currentStr);\n const opt = optionById ?? optionByName;\n if (opt) {\n addCandidate(opt.id);\n addCandidate(opt.name);\n }\n }\n\n const matchesScalar = (expected: unknown) => {\n const expectedStr = String(expected).trim();\n return candidates.has(expectedStr);\n };\n\n // Support multiple expected formats:\n // - scalar: \"Consultation\" / \"1\" / 1 / true\n // - array: [\"Consultation\", \"Follow-up\"]\n // - map/object: { \"Consultation\": true }\n if (Array.isArray(expectedAnswer)) {\n return expectedAnswer.some((v) => matchesScalar(v));\n }\n\n if (expectedAnswer && typeof expectedAnswer === 'object') {\n const expectedMap = expectedAnswer as Record<string, unknown>;\n for (const c of candidates) {\n if (Object.prototype.hasOwnProperty.call(expectedMap, c)) {\n const flag = expectedMap[c];\n return flag === undefined ? true : !!flag;\n }\n }\n return false;\n }\n\n return matchesScalar(expectedAnswer);\n });\n },\n [values, questions]\n );\n\n // Get visible questions\n const visibleQuestions = questions.filter(isQuestionVisible);\n\n\n // Validate a single field\n const validateField = useCallback((question: Question, value: FormValues[number]): string | null => {\n if (question.detail_type === 'heading') return null;\n\n if (question.required) {\n if (value === undefined || value === '' || value === null) {\n return `${question.name} is required`;\n }\n if (question.detail_type === 'check' && !value) {\n return `${question.name} must be checked`;\n }\n }\n\n if (question.detail_type === 'number' && value !== '' && value !== undefined) {\n const numValue = Number(value);\n if (question.settings?.min !== undefined && numValue < question.settings.min) {\n return `Minimum value is ${question.settings.min}`;\n }\n if (question.settings?.max !== undefined && numValue > question.settings.max) {\n return `Maximum value is ${question.settings.max}`;\n }\n }\n\n return null;\n }, []);\n\n // Validate all visible fields\n const validateAll = useCallback((): boolean => {\n const newErrors: FormErrors = {};\n let isValid = true;\n\n visibleQuestions.forEach((question) => {\n const error = validateField(question, values[question.id]);\n if (error) {\n newErrors[question.id] = error;\n isValid = false;\n }\n });\n\n setErrors(newErrors);\n return isValid;\n }, [visibleQuestions, values, validateField]);\n\n // Clear errors for hidden questions\n useEffect(() => {\n const visibleIds = new Set(visibleQuestions.map((q) => q.id));\n\n setErrors((prev) => {\n let changed = false;\n const next = { ...prev };\n\n Object.keys(next).forEach((idStr) => {\n const id = Number(idStr);\n if (!visibleIds.has(id)) {\n delete next[id];\n changed = true;\n }\n });\n\n return changed ? next : prev;\n });\n }, [visibleQuestions]);\n\n const handleChange = (questionId: number, value: string | number | boolean) => {\n setValues((prev) => ({ ...prev, [questionId]: value }));\n setTouched((prev) => ({ ...prev, [questionId]: true }));\n\n // Clear error on change if touched\n if (touched[questionId]) {\n const question = questions.find((q) => q.id === questionId);\n if (question) {\n const error = validateField(question, value);\n setErrors((prev) => {\n if (error) {\n return { ...prev, [questionId]: error };\n }\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all fields as touched\n const allTouched: Record<number, boolean> = {};\n visibleQuestions.forEach((q) => {\n allTouched[q.id] = true;\n });\n setTouched(allTouched);\n\n if (validateAll()) {\n // Only include visible question values\n const visibleValues: FormValues = {};\n visibleQuestions.forEach((q) => {\n if (q.detail_type !== 'heading' && values[q.id] !== undefined) {\n visibleValues[q.id] = values[q.id];\n }\n });\n onSubmit(visibleValues);\n }\n };\n\n const defaultButton = 'w-full mt-4 px-4 py-2 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors';\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {visibleQuestions.map((question) => (\n <FormField\n key={question.id}\n question={question}\n value={values[question.id]}\n error={touched[question.id] ? errors[question.id] : undefined}\n onChange={(value) => handleChange(question.id, value)}\n classNames={classNames}\n />\n ))}\n <button\n type=\"submit\"\n className={classNames?.button ?? defaultButton}\n >\n {submitLabel}\n </button>\n </form>\n );\n}\n\nexport default BookingForm;\n","/**\n * Validation helper functions for form fields\n * Each validator returns an error message string if invalid, or null if valid\n */\n\n/**\n * Validates that a value is not empty\n */\nexport function required(value: string): string | null {\n if (!value || value.trim() === '') {\n return 'This field is required';\n }\n return null;\n}\n\n/**\n * Validates email format (RFC 5322 compliant)\n */\nexport function email(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n const emailRegex = /^[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 if (!emailRegex.test(value)) {\n return 'Please enter a valid email address';\n }\n return null;\n}\n\n/**\n * Validates phone number format (international)\n * Accepts formats like: +44 1234 567890, 01onal234 567890, +1-234-567-8900\n */\nexport function phone(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n // Remove all spaces, dashes, and parentheses for validation\n const cleaned = value.replace(/[\\s\\-\\(\\)]/g, '');\n \n // Check for valid phone format: optional + followed by 7-15 digits\n const phoneRegex = /^\\+?[0-9]{7,15}$/;\n \n if (!phoneRegex.test(cleaned)) {\n return 'Please enter a valid phone number';\n }\n return null;\n}\n\n/**\n * Validates UK postcode format\n * Accepts formats like: SW1A 1AA, SW1A1AA, M1 1AA, B33 8TH\n */\nexport function ukPostcode(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n // UK postcode regex - covers all valid formats\n const postcodeRegex = /^([A-Z]{1,2}[0-9][A-Z0-9]? ?[0-9][A-Z]{2})$/i;\n \n if (!postcodeRegex.test(value.trim())) {\n return 'Please enter a valid UK postcode';\n }\n return null;\n}\n\n/**\n * Creates a minimum length validator\n * @param min - Minimum number of characters required\n */\nexport function minLen(min: number): (value: string) => string | null {\n return (value: string) => {\n if (!value) return null; // Let required handle empty values\n \n if (value.trim().length < min) {\n return `Must be at least ${min} character${min === 1 ? '' : 's'}`;\n }\n return null;\n };\n}\n\n/**\n * Combines multiple validators into one\n * Returns the first error encountered, or null if all pass\n */\nexport function compose(\n ...validators: Array<(value: string) => string | null>\n): (value: string) => string | null {\n return (value: string) => {\n for (const validator of validators) {\n const error = validator(value);\n if (error) return error;\n }\n return null;\n };\n}\n","import React, {\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n useId,\n} from 'react';\nimport type {\n FieldConfig,\n RegistrationFormProps,\n RegistrationFormRef,\n RegistrationFormValues,\n RegistrationFormErrors,\n} from '../types/registration';\nimport { required, email, phone, ukPostcode, compose } from '../utils/validators';\n\n/**\n * Default field configuration for the registration form\n */\nconst DEFAULT_FIELDS: FieldConfig[] = [\n {\n name: 'firstName',\n label: 'First name',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'lastName',\n label: 'Last name',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'email',\n label: 'Email address',\n type: 'email',\n required: true,\n validate: compose(required, email),\n },\n {\n name: 'password',\n label: 'Password',\n type: 'password',\n required: false,\n },\n {\n name: 'phone',\n label: 'Contact number',\n type: 'tel',\n required: false,\n validate: phone,\n },\n {\n name: 'address1',\n label: 'Address 1',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'address2',\n label: 'Address 2',\n type: 'text',\n required: false,\n },\n {\n name: 'city',\n label: 'Town/City',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'postcode',\n label: 'Postcode',\n type: 'text',\n required: true,\n validate: compose(required, ukPostcode),\n },\n];\n\n/**\n * A reusable, accessible registration form component.\n * \n * Features:\n * - Customizable fields via props\n * - Built-in validation with blur and submit triggers\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Imperative handle for programmatic control (reset, setValues)\n * - Granular styling via classNames prop\n * \n * @example\n * ```tsx\n * const formRef = useRef<RegistrationFormRef>(null);\n * \n * <RegistrationForm\n * ref={formRef}\n * onSubmit={(values) => console.log(values)}\n * onChange={(values, isValid) => console.log(isValid)}\n * submitLabel=\"Register\"\n * />\n * \n * // Programmatic control\n * formRef.current?.reset();\n * formRef.current?.setValues({ email: 'test@example.com' });\n * ```\n */\nexport const RegistrationForm = forwardRef<RegistrationFormRef, RegistrationFormProps>(\n (\n {\n fields = DEFAULT_FIELDS,\n additionalFields,\n onSubmit,\n onChange,\n validateOnBlur = true,\n submitLabel = 'Submit',\n className = '',\n classNames = {},\n },\n ref\n ) => {\n const formId = useId();\n const [values, setValues] = useState<RegistrationFormValues>({});\n const [errors, setErrors] = useState<RegistrationFormErrors>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n // Merge fields with additional fields\n const allFields = additionalFields ? [...fields, ...additionalFields] : fields;\n\n /**\n * Validate a single field\n */\n const validateField = useCallback(\n (field: FieldConfig, value: string): string | null => {\n // Check required first\n if (field.required && (!value || value.trim() === '')) {\n return 'This field is required';\n }\n // Run custom validator if value is present\n if (field.validate && value) {\n return field.validate(value);\n }\n return null;\n },\n []\n );\n\n /**\n * Validate all fields and return whether form is valid\n */\n const validateAll = useCallback((): boolean => {\n const newErrors: RegistrationFormErrors = {};\n let isValid = true;\n\n for (const field of allFields) {\n const value = values[field.name] || '';\n const error = validateField(field, value);\n if (error) {\n newErrors[field.name] = error;\n isValid = false;\n }\n }\n\n setErrors(newErrors);\n return isValid;\n }, [allFields, values, validateField]);\n\n /**\n * Check if current form state is valid (without updating errors)\n */\n const checkIsValid = useCallback(\n (currentValues: RegistrationFormValues): boolean => {\n for (const field of allFields) {\n const value = currentValues[field.name] || '';\n const error = validateField(field, value);\n if (error) return false;\n }\n return true;\n },\n [allFields, validateField]\n );\n\n /**\n * Handle input change\n */\n const handleChange = useCallback(\n (fieldName: string, value: string) => {\n const newValues = { ...values, [fieldName]: value };\n setValues(newValues);\n\n // Clear error if field was touched and is now valid\n if (touched[fieldName]) {\n const field = allFields.find((f) => f.name === fieldName);\n if (field) {\n const error = validateField(field, value);\n if (!error) {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[fieldName];\n return next;\n });\n }\n }\n }\n\n // Call onChange callback\n if (onChange) {\n const isValid = checkIsValid(newValues);\n onChange(newValues, isValid);\n }\n },\n [values, touched, allFields, validateField, onChange, checkIsValid]\n );\n\n /**\n * Handle input blur\n */\n const handleBlur = useCallback(\n (fieldName: string) => {\n setTouched((prev) => ({ ...prev, [fieldName]: true }));\n\n if (validateOnBlur) {\n const field = allFields.find((f) => f.name === fieldName);\n if (field) {\n const value = values[fieldName] || '';\n const error = validateField(field, value);\n if (error) {\n setErrors((prev) => ({ ...prev, [fieldName]: error }));\n } else {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[fieldName];\n return next;\n });\n }\n }\n }\n },\n [validateOnBlur, allFields, values, validateField]\n );\n\n /**\n * Handle form submission\n */\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all fields as touched\n const allTouched: Record<string, boolean> = {};\n for (const field of allFields) {\n allTouched[field.name] = true;\n }\n setTouched(allTouched);\n\n // Validate all and submit if valid\n if (validateAll()) {\n onSubmit(values);\n }\n },\n [allFields, validateAll, onSubmit, values]\n );\n\n /**\n * Expose imperative methods via ref\n */\n useImperativeHandle(\n ref,\n () => ({\n reset: () => {\n setValues({});\n setErrors({});\n setTouched({});\n },\n setValues: (newValues: Partial<RegistrationFormValues>) => {\n setValues((prev) => {\n const merged = { ...prev };\n for (const [key, value] of Object.entries(newValues)) {\n if (value !== undefined) {\n merged[key] = value;\n }\n }\n return merged;\n });\n },\n }),\n []\n );\n\n // Default styles\n const styles = {\n fieldWrapper: classNames.fieldWrapper || 'mb-4',\n label: classNames.label || 'block text-sm font-medium mb-1',\n input: classNames.input || 'w-full px-3 py-2 border rounded-md',\n inputError: classNames.inputError || 'border-red-500',\n errorText: classNames.errorText || 'mt-1 text-xs text-red-600',\n button:\n classNames.button ||\n 'w-full mt-4 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50',\n };\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {allFields.map((field) => {\n const fieldId = `${formId}-${field.name}`;\n const errorId = `${fieldId}-error`;\n const value = values[field.name] || '';\n const error = errors[field.name];\n const isTouched = touched[field.name];\n const showError = isTouched && error;\n\n return (\n <div key={field.name} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {field.label}\n {field.required && (\n <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n {field.type === 'select' && field.options ? (\n <select\n id={fieldId}\n name={field.name}\n value={value}\n onChange={(e) => handleChange(field.name, e.target.value)}\n onBlur={() => handleBlur(field.name)}\n className={`${styles.input} ${showError ? styles.inputError : ''}`}\n aria-invalid={showError ? 'true' : 'false'}\n aria-describedby={showError ? errorId : undefined}\n aria-required={field.required ? 'true' : 'false'}\n >\n <option value=\"\">{field.placeholder || 'Select an option'}</option>\n {field.options.map((option) => (\n <option key={option.id} value={String(option.id)}>\n {option.name}\n {option.price !== undefined && option.price > 0 ? ` (+£${option.price})` : ''}\n </option>\n ))}\n </select>\n ) : (\n <input\n id={fieldId}\n name={field.name}\n type={field.type === 'select' ? 'text' : field.type}\n value={value}\n onChange={(e) => handleChange(field.name, e.target.value)}\n onBlur={() => handleBlur(field.name)}\n placeholder={field.placeholder}\n className={`${styles.input} ${showError ? styles.inputError : ''}`}\n aria-invalid={showError ? 'true' : 'false'}\n aria-describedby={showError ? errorId : undefined}\n aria-required={field.required ? 'true' : 'false'}\n />\n )}\n {showError && (\n <p id={errorId} className={styles.errorText} role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n })}\n <button type=\"submit\" className={styles.button}>\n {submitLabel}\n </button>\n </form>\n );\n }\n);\n\nRegistrationForm.displayName = 'RegistrationForm';\n","import React, {\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n useId,\n} from 'react';\nimport type { Question, QuestionOption, FormValues, FormErrors } from '../types';\nimport type {\n ContactDetailsFormProps,\n ContactDetailsFormRef,\n ContactDetailsValues,\n ContactDetailsFieldSettings,\n} from '../types/contact-details';\nimport { required, email as emailValidator, compose } from '../utils/validators';\n\n/** Merge base classes with optional custom classes */\nconst cx = (...classes: (string | undefined)[]) => classes.filter(Boolean).join(' ');\n\n/**\n * ContactDetailsForm — collects first name, last name, email and optional\n * dynamic questions. On submit it emits values with `q` and `answers` fields\n * matching the JRNI Update Client / Member API format.\n *\n * @example\n * ```tsx\n * <ContactDetailsForm\n * questions={[\n * { id: 2, name: 'Purpose', detail_type: 'select', required: true,\n * options: [{ id: 5, name: 'School Trip' }, { id: 6, name: 'Corporate' }] },\n * { id: 7, name: 'Group Size', detail_type: 'number', required: true },\n * ]}\n * onSubmit={(values) => console.log(values)}\n * />\n * ```\n */\nexport const ContactDetailsForm = forwardRef<ContactDetailsFormRef, ContactDetailsFormProps>(\n (\n {\n questions = [],\n onSubmit,\n onChange: _onChange,\n validateOnBlur = true,\n submitLabel = 'Submit',\n className = '',\n classNames = {},\n fieldSettings = {},\n },\n ref\n ) => {\n const formId = useId();\n\n // Contact detail fields\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n const [emailValue, setEmailValue] = useState('');\n\n // Contact detail errors\n const [contactErrors, setContactErrors] = useState<Record<string, string>>({});\n const [contactTouched, setContactTouched] = useState<Record<string, boolean>>({});\n\n // Question field values and errors (keyed by question id)\n const [questionValues, setQuestionValues] = useState<FormValues>({});\n const [questionErrors, setQuestionErrors] = useState<FormErrors>({});\n const [questionTouched, setQuestionTouched] = useState<Record<number, boolean>>({});\n\n // ── Resolve per-field settings (default: required=true, disabled=false) ──\n const getFieldRequired = (name: string) => {\n const s = fieldSettings[name as keyof ContactDetailsFieldSettings];\n return s?.required !== undefined ? s.required : true;\n };\n const getFieldDisabled = (name: string) => {\n const s = fieldSettings[name as keyof ContactDetailsFieldSettings];\n return !!s?.disabled;\n };\n\n const contactFields = [\n { name: 'firstName', label: 'First name', value: firstName, setter: setFirstName },\n { name: 'lastName', label: 'Last name', value: lastName, setter: setLastName },\n { name: 'email', label: 'Email', value: emailValue, setter: setEmailValue },\n ] as const;\n\n // ── Validation helpers ──\n\n const validateContactField = useCallback((name: string, value: string): string | null => {\n const isRequired = getFieldRequired(name);\n if (name === 'email') {\n const validators = isRequired ? compose(required, emailValidator) : emailValidator;\n return value ? validators(value) : (isRequired ? required(value) : null);\n }\n return isRequired ? required(value) : null;\n }, [fieldSettings]);\n\n const validateQuestionField = useCallback((question: Question, value: FormValues[number]): string | null => {\n if (question.detail_type === 'heading') return null;\n if (question.required) {\n if (value === undefined || value === '' || value === null) {\n return `${question.name} is required`;\n }\n if (question.detail_type === 'check' && !value) {\n return `${question.name} must be checked`;\n }\n }\n if (question.detail_type === 'number' && value !== '' && value !== undefined) {\n const numValue = Number(value);\n if (question.settings?.min !== undefined && numValue < question.settings.min) {\n return `Minimum value is ${question.settings.min}`;\n }\n if (question.settings?.max !== undefined && numValue > question.settings.max) {\n return `Maximum value is ${question.settings.max}`;\n }\n }\n return null;\n }, []);\n\n const validateAllContacts = useCallback((): boolean => {\n const errs: Record<string, string> = {};\n let valid = true;\n for (const f of contactFields) {\n if (getFieldDisabled(f.name)) continue;\n const err = validateContactField(f.name, f.value);\n if (err) { errs[f.name] = err; valid = false; }\n }\n setContactErrors(errs);\n return valid;\n }, [firstName, lastName, emailValue, validateContactField, fieldSettings]);\n\n const validateAllQuestions = useCallback((): boolean => {\n const errs: FormErrors = {};\n let valid = true;\n for (const q of questions) {\n const err = validateQuestionField(q, questionValues[q.id]);\n if (err) { errs[q.id] = err; valid = false; }\n }\n setQuestionErrors(errs);\n return valid;\n }, [questions, questionValues, validateQuestionField]);\n\n // ── Build output ──\n\n const buildOutput = useCallback((): ContactDetailsValues => {\n const q: ContactDetailsValues['q'] = {};\n const answers: ContactDetailsValues['answers'] = [];\n\n for (const question of questions) {\n if (question.detail_type === 'heading') continue;\n const rawValue = questionValues[question.id];\n if (rawValue === undefined || rawValue === '') continue;\n\n let answer = String(rawValue);\n let answerId = 0;\n\n // For selects, resolve the option\n if (question.detail_type === 'select' && question.options?.length) {\n const option = question.options.find(\n (o: QuestionOption) => String(o.id) === String(rawValue)\n );\n if (option) {\n answer = option.name;\n answerId = typeof option.id === 'number' ? option.id : parseInt(String(option.id), 10) || 0;\n }\n }\n\n const idStr = String(question.id);\n q[idStr] = { answer, answer_id: answerId, name: question.name };\n answers.push({ question_id: question.id, name: question.name, answer, answer_id: answerId });\n }\n\n return { firstName, lastName, email: emailValue, q, answers };\n }, [firstName, lastName, emailValue, questions, questionValues]);\n\n // ── Handlers ──\n\n const handleContactChange = useCallback((name: string, value: string) => {\n const setter = name === 'firstName' ? setFirstName : name === 'lastName' ? setLastName : setEmailValue;\n setter(value);\n\n if (contactTouched[name]) {\n const err = validateContactField(name, value);\n setContactErrors(prev => {\n if (err) return { ...prev, [name]: err };\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n }\n }, [contactTouched, validateContactField]);\n\n const handleContactBlur = useCallback((name: string, value: string) => {\n setContactTouched(prev => ({ ...prev, [name]: true }));\n if (validateOnBlur) {\n const err = validateContactField(name, value);\n setContactErrors(prev => {\n if (err) return { ...prev, [name]: err };\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n }\n }, [validateOnBlur, validateContactField]);\n\n const handleQuestionChange = useCallback((questionId: number, value: string | number | boolean) => {\n setQuestionValues(prev => ({ ...prev, [questionId]: value }));\n setQuestionTouched(prev => ({ ...prev, [questionId]: true }));\n\n if (questionTouched[questionId]) {\n const question = questions.find(q => q.id === questionId);\n if (question) {\n const err = validateQuestionField(question, value);\n setQuestionErrors(prev => {\n if (err) return { ...prev, [questionId]: err };\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n }, [questionTouched, questions, validateQuestionField]);\n\n const handleQuestionBlur = useCallback((questionId: number) => {\n setQuestionTouched(prev => ({ ...prev, [questionId]: true }));\n if (validateOnBlur) {\n const question = questions.find(q => q.id === questionId);\n if (question) {\n const err = validateQuestionField(question, questionValues[questionId]);\n setQuestionErrors(prev => {\n if (err) return { ...prev, [questionId]: err };\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n }, [validateOnBlur, questions, questionValues, validateQuestionField]);\n\n const handleSubmit = useCallback((e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all touched\n const allContactTouched: Record<string, boolean> = {};\n for (const f of contactFields) allContactTouched[f.name] = true;\n setContactTouched(allContactTouched);\n\n const allQTouched: Record<number, boolean> = {};\n for (const q of questions) allQTouched[q.id] = true;\n setQuestionTouched(allQTouched);\n\n const contactValid = validateAllContacts();\n const questionsValid = validateAllQuestions();\n\n if (contactValid && questionsValid) {\n onSubmit(buildOutput());\n }\n }, [contactFields, questions, validateAllContacts, validateAllQuestions, onSubmit, buildOutput]);\n\n // ── Imperative handle ──\n\n useImperativeHandle(ref, () => ({\n reset: () => {\n setFirstName('');\n setLastName('');\n setEmailValue('');\n setContactErrors({});\n setContactTouched({});\n setQuestionValues({});\n setQuestionErrors({});\n setQuestionTouched({});\n },\n setValues: (vals) => {\n if (vals.firstName !== undefined) setFirstName(vals.firstName);\n if (vals.lastName !== undefined) setLastName(vals.lastName);\n if (vals.email !== undefined) setEmailValue(vals.email);\n },\n }), []);\n\n // ── Styles ──\n\n const styles = {\n fieldWrapper: classNames.fieldWrapper || 'mb-4',\n label: classNames.label || 'block text-sm font-medium mb-1',\n heading: classNames.heading || 'text-lg font-semibold mt-4 mb-2 first:mt-0',\n input: classNames.input || 'w-full px-3 py-2 border rounded-md text-sm',\n inputError: classNames.inputError || 'border-red-500',\n checkbox: classNames.checkbox || 'mt-1 h-4 w-4 rounded border-gray-300',\n helpText: classNames.helpText || 'mt-1 text-xs text-gray-500',\n errorText: classNames.errorText || 'mt-1 text-xs text-red-600',\n button: classNames.button || 'w-full mt-4 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50',\n };\n\n const inputClasses = (hasError: boolean) =>\n hasError ? cx(styles.input, styles.inputError) : styles.input;\n\n // ── Render contact field ──\n\n const renderContactField = (name: string, label: string, value: string, type = 'text') => {\n const fieldId = `${formId}-${name}`;\n const errorId = `${fieldId}-error`;\n const isDisabled = getFieldDisabled(name);\n const isRequired = getFieldRequired(name);\n const error = contactTouched[name] ? contactErrors[name] : undefined;\n const hasError = !!error;\n\n return (\n <div key={name} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {label}\n {isRequired && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n name={name}\n type={type}\n value={value}\n disabled={isDisabled}\n onChange={(e) => handleContactChange(name, e.target.value)}\n onBlur={() => handleContactBlur(name, name === 'firstName' ? firstName : name === 'lastName' ? lastName : emailValue)}\n className={cx(inputClasses(hasError), isDisabled ? 'opacity-50 cursor-not-allowed' : '')}\n aria-invalid={hasError ? 'true' : 'false'}\n aria-describedby={hasError ? errorId : undefined}\n aria-required={isRequired ? 'true' : undefined}\n />\n {hasError && (\n <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>\n )}\n </div>\n );\n };\n\n // ── Render question field ──\n\n const renderQuestionField = (question: Question) => {\n const fieldId = `${formId}-q-${question.id}`;\n const errorId = `${fieldId}-error`;\n const value = questionValues[question.id];\n const error = questionTouched[question.id] ? questionErrors[question.id] : undefined;\n const hasError = !!error;\n\n const ariaProps = {\n 'aria-invalid': hasError ? true as const : undefined,\n 'aria-describedby': hasError ? errorId : undefined,\n 'aria-required': question.required || undefined,\n };\n\n switch (question.detail_type) {\n case 'heading':\n return (\n <h3 key={question.id} className={styles.heading}>\n {question.name}\n </h3>\n );\n\n case 'text_field':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n placeholder={question.settings?.placeholder}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'text_area':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <textarea\n id={fieldId}\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n placeholder={question.settings?.placeholder}\n rows={4}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'select':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <select\n id={fieldId}\n value={(value as string | number) ?? ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={inputClasses(hasError)}\n {...ariaProps}\n >\n <option value=\"\">Select an option</option>\n {question.options?.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'number':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"number\"\n value={(value as number) ?? ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value ? Number(e.target.value) : '')}\n onBlur={() => handleQuestionBlur(question.id)}\n min={question.settings?.min}\n max={question.settings?.max}\n placeholder={question.settings?.placeholder}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'date':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"date\"\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'check':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <div className=\"flex items-start gap-2\">\n <input\n id={fieldId}\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => handleQuestionChange(question.id, e.target.checked)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={styles.checkbox}\n {...ariaProps}\n />\n <label htmlFor={fieldId} className=\"text-sm\">\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n </div>\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {renderContactField('firstName', 'First name', firstName)}\n {renderContactField('lastName', 'Last name', lastName)}\n {renderContactField('email', 'Email', emailValue, 'email')}\n {questions.map(renderQuestionField)}\n <button type=\"submit\" className={styles.button}>\n {submitLabel}\n </button>\n </form>\n );\n }\n);\n\nContactDetailsForm.displayName = 'ContactDetailsForm';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/BookingForm.tsx","../src/utils/validators.ts","../src/components/RegistrationForm.tsx","../src/components/ContactDetailsForm.tsx"],"names":["jsxs","jsx","useState","useCallback","useEffect","forwardRef","useId","useImperativeHandle","cx"],"mappings":"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","file":"index.js","sourcesContent":["import React, { useState, useEffect, useCallback } from 'react';\nimport type { Question, FormValues, FormErrors, BookingFormProps, BookingFormClassNames } from '../types';\n\n/** Merge base classes with optional custom classes */\nconst cx = (...classes: (string | undefined)[]) => classes.filter(Boolean).join(' ');\n\n/**\n * Renders a single form field based on question type\n */\nfunction FormField({\n question,\n value,\n error,\n onChange,\n classNames,\n}: {\n question: Question;\n value: string | number | boolean | undefined;\n error?: string;\n onChange: (value: string | number | boolean) => void;\n classNames?: BookingFormClassNames;\n}) {\n const inputId = `question-${question.id}`;\n const errorId = `${inputId}-error`;\n const hasError = !!error;\n\n // Default classes (can be overridden via classNames prop)\n const defaultFieldWrapper = 'mb-4';\n const defaultLabel = 'block text-sm font-medium mb-1 text-gray-700';\n const defaultHeading = 'text-lg font-semibold text-gray-900 mt-4 mb-2 first:mt-0';\n const defaultInput = 'w-full px-3 py-2 border rounded-md text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-offset-1 border-gray-300 focus:ring-blue-500 focus:border-blue-500';\n const defaultInputError = 'border-red-500 focus:ring-red-500';\n const defaultCheckbox = 'mt-1 h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500';\n const defaultHelpText = 'mt-1 text-xs text-gray-500';\n const defaultErrorText = 'mt-1 text-xs text-red-600';\n\n const inputClasses = hasError\n ? cx(classNames?.input ?? defaultInput, classNames?.inputError ?? defaultInputError)\n : cx(classNames?.input ?? defaultInput);\n\n const labelClasses = classNames?.label ?? defaultLabel;\n const checkboxLabelClasses = cx('text-sm', classNames?.label ?? 'text-gray-700');\n\n const renderLabel = () => {\n if (question.detail_type === 'heading') return null;\n return (\n <label htmlFor={inputId} className={labelClasses}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n );\n };\n\n const renderHelpText = () => {\n if (!question.help_text) return null;\n return <p className={classNames?.helpText ?? defaultHelpText}>{question.help_text}</p>;\n };\n\n const renderError = () => {\n if (!error) return null;\n return (\n <p id={errorId} className={classNames?.errorText ?? defaultErrorText} role=\"alert\">\n {error}\n </p>\n );\n };\n\n const ariaProps = {\n 'aria-invalid': hasError ? true : undefined,\n 'aria-describedby': hasError ? errorId : undefined,\n 'aria-required': question.required || undefined,\n };\n\n switch (question.detail_type) {\n case 'heading':\n return (\n <h3 className={classNames?.heading ?? defaultHeading}>\n {question.name}\n </h3>\n );\n\n case 'text_field':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={question.settings?.placeholder}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'text_area':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <textarea\n id={inputId}\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={question.settings?.placeholder}\n rows={4}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'select':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <select\n id={inputId}\n value={(value as string | number) ?? ''}\n onChange={(e) => onChange(e.target.value)}\n className={inputClasses}\n {...ariaProps}\n >\n <option value=\"\">Select an option</option>\n {question.options?.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'date':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"date\"\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n min={question.settings?.min?.toString()}\n max={question.settings?.max?.toString()}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'number':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"number\"\n value={(value as number) ?? ''}\n onChange={(e) => onChange(e.target.value ? Number(e.target.value) : '')}\n min={question.settings?.min}\n max={question.settings?.max}\n placeholder={question.settings?.placeholder}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'check':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n <div className=\"flex items-start gap-2\">\n <input\n id={inputId}\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n className={classNames?.checkbox ?? defaultCheckbox}\n {...ariaProps}\n />\n <label htmlFor={inputId} className={checkboxLabelClasses}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n </div>\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n default:\n return null;\n }\n}\n\n/**\n * BookingForm - A dynamic form component for booking questions\n *\n * @example\n * ```tsx\n * const questions: Question[] = [\n * { id: 1, name: 'Personal Details', detail_type: 'heading' },\n * { id: 2, name: 'Full Name', detail_type: 'text_field', required: true },\n * { id: 3, name: 'Email', detail_type: 'text_field', required: true },\n * ];\n *\n * <BookingForm\n * questions={questions}\n * onSubmit={(values) => console.log(values)}\n * />\n * ```\n */\nexport function BookingForm({\n questions,\n onSubmit,\n submitLabel = 'Submit',\n className = '',\n labelClassName,\n classNames: classNamesProp,\n}: BookingFormProps) {\n // Merge deprecated labelClassName into classNames for backwards compatibility\n const classNames: BookingFormClassNames = {\n ...classNamesProp,\n label: classNamesProp?.label ?? labelClassName,\n };\n const [values, setValues] = useState<FormValues>({});\n const [errors, setErrors] = useState<FormErrors>({});\n const [touched, setTouched] = useState<Record<number, boolean>>({});\n\n\n // Check if a question should be visible based on conditional settings\n const isQuestionVisible = useCallback(\n (question: Question): boolean => {\n const { settings } = question;\n if (!settings?.conditional_answers) {\n return true;\n }\n\n // Check all conditions in conditional_answers\n // Each entry is { questionId: expectedAnswerValue }\n const conditionEntries = Object.entries(settings.conditional_answers as Record<string, unknown>);\n if (conditionEntries.length === 0) {\n return true;\n }\n\n // Question is visible if ANY condition is met\n return conditionEntries.some(([questionIdStr, expectedAnswer]) => {\n const questionId = Number(questionIdStr);\n const currentValue = (values as Record<string, unknown>)[String(questionId)];\n\n if (currentValue === undefined || currentValue === '' || currentValue === null) {\n return false;\n }\n\n // Selects typically store the option id (as string), but allow `{ id, name }` objects too\n const normalizedCurrent =\n typeof currentValue === 'object' && currentValue !== null && 'id' in (currentValue as any)\n ? (currentValue as any)\n : currentValue;\n\n // Build a set of candidate strings for comparison.\n // For select questions we support matching by BOTH option id and option name.\n const candidates = new Set<string>();\n\n const addCandidate = (v: unknown) => {\n if (v === undefined || v === null) return;\n const s = String(v).trim();\n if (s) candidates.add(s);\n };\n\n const sourceQuestion = questions.find((q) => q.id === questionId);\n\n if (typeof normalizedCurrent === 'object' && normalizedCurrent !== null) {\n addCandidate((normalizedCurrent as any).id);\n addCandidate((normalizedCurrent as any).name);\n } else {\n addCandidate(normalizedCurrent);\n }\n\n if (sourceQuestion?.detail_type === 'select' && sourceQuestion.options?.length) {\n // Try to resolve the selected option via id or name.\n const currentStr = [...candidates][0] ?? '';\n const optionById = sourceQuestion.options.find((o) => String(o.id) === currentStr);\n const optionByName = sourceQuestion.options.find((o) => String(o.name).trim() === currentStr);\n const opt = optionById ?? optionByName;\n if (opt) {\n addCandidate(opt.id);\n addCandidate(opt.name);\n }\n }\n\n const matchesScalar = (expected: unknown) => {\n const expectedStr = String(expected).trim();\n return candidates.has(expectedStr);\n };\n\n // Support multiple expected formats:\n // - scalar: \"Consultation\" / \"1\" / 1 / true\n // - array: [\"Consultation\", \"Follow-up\"]\n // - map/object: { \"Consultation\": true }\n if (Array.isArray(expectedAnswer)) {\n return expectedAnswer.some((v) => matchesScalar(v));\n }\n\n if (expectedAnswer && typeof expectedAnswer === 'object') {\n const expectedMap = expectedAnswer as Record<string, unknown>;\n for (const c of candidates) {\n if (Object.prototype.hasOwnProperty.call(expectedMap, c)) {\n const flag = expectedMap[c];\n return flag === undefined ? true : !!flag;\n }\n }\n return false;\n }\n\n return matchesScalar(expectedAnswer);\n });\n },\n [values, questions]\n );\n\n // Get visible questions\n const visibleQuestions = questions.filter(isQuestionVisible);\n\n\n // Validate a single field\n const validateField = useCallback((question: Question, value: FormValues[number]): string | null => {\n if (question.detail_type === 'heading') return null;\n\n if (question.required) {\n if (value === undefined || value === '' || value === null) {\n return `${question.name} is required`;\n }\n if (question.detail_type === 'check' && !value) {\n return `${question.name} must be checked`;\n }\n }\n\n if (question.detail_type === 'number' && value !== '' && value !== undefined) {\n const numValue = Number(value);\n if (question.settings?.min !== undefined && numValue < question.settings.min) {\n return `Minimum value is ${question.settings.min}`;\n }\n if (question.settings?.max !== undefined && numValue > question.settings.max) {\n return `Maximum value is ${question.settings.max}`;\n }\n }\n\n return null;\n }, []);\n\n // Validate all visible fields\n const validateAll = useCallback((): boolean => {\n const newErrors: FormErrors = {};\n let isValid = true;\n\n visibleQuestions.forEach((question) => {\n const error = validateField(question, values[question.id]);\n if (error) {\n newErrors[question.id] = error;\n isValid = false;\n }\n });\n\n setErrors(newErrors);\n return isValid;\n }, [visibleQuestions, values, validateField]);\n\n // Clear errors for hidden questions\n useEffect(() => {\n const visibleIds = new Set(visibleQuestions.map((q) => q.id));\n\n setErrors((prev) => {\n let changed = false;\n const next = { ...prev };\n\n Object.keys(next).forEach((idStr) => {\n const id = Number(idStr);\n if (!visibleIds.has(id)) {\n delete next[id];\n changed = true;\n }\n });\n\n return changed ? next : prev;\n });\n }, [visibleQuestions]);\n\n const handleChange = (questionId: number, value: string | number | boolean) => {\n setValues((prev) => ({ ...prev, [questionId]: value }));\n setTouched((prev) => ({ ...prev, [questionId]: true }));\n\n // Clear error on change if touched\n if (touched[questionId]) {\n const question = questions.find((q) => q.id === questionId);\n if (question) {\n const error = validateField(question, value);\n setErrors((prev) => {\n if (error) {\n return { ...prev, [questionId]: error };\n }\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all fields as touched\n const allTouched: Record<number, boolean> = {};\n visibleQuestions.forEach((q) => {\n allTouched[q.id] = true;\n });\n setTouched(allTouched);\n\n if (validateAll()) {\n // Only include visible question values\n const visibleValues: FormValues = {};\n visibleQuestions.forEach((q) => {\n if (q.detail_type !== 'heading' && values[q.id] !== undefined) {\n visibleValues[q.id] = values[q.id];\n }\n });\n onSubmit(visibleValues);\n }\n };\n\n const defaultButton = 'w-full mt-4 px-4 py-2 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors';\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {visibleQuestions.map((question) => (\n <FormField\n key={question.id}\n question={question}\n value={values[question.id]}\n error={touched[question.id] ? errors[question.id] : undefined}\n onChange={(value) => handleChange(question.id, value)}\n classNames={classNames}\n />\n ))}\n <button\n type=\"submit\"\n className={classNames?.button ?? defaultButton}\n >\n {submitLabel}\n </button>\n </form>\n );\n}\n\nexport default BookingForm;\n","/**\n * Validation helper functions for form fields\n * Each validator returns an error message string if invalid, or null if valid\n */\n\n/**\n * Validates that a value is not empty\n */\nexport function required(value: string): string | null {\n if (!value || value.trim() === '') {\n return 'This field is required';\n }\n return null;\n}\n\n/**\n * Validates email format (RFC 5322 compliant)\n */\nexport function email(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n const emailRegex = /^[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 if (!emailRegex.test(value)) {\n return 'Please enter a valid email address';\n }\n return null;\n}\n\n/**\n * Validates phone number format (international)\n * Accepts formats like: +44 1234 567890, 01onal234 567890, +1-234-567-8900\n */\nexport function phone(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n // Remove all spaces, dashes, and parentheses for validation\n const cleaned = value.replace(/[\\s\\-\\(\\)]/g, '');\n \n // Check for valid phone format: optional + followed by 7-15 digits\n const phoneRegex = /^\\+?[0-9]{7,15}$/;\n \n if (!phoneRegex.test(cleaned)) {\n return 'Please enter a valid phone number';\n }\n return null;\n}\n\n/**\n * Validates UK postcode format\n * Accepts formats like: SW1A 1AA, SW1A1AA, M1 1AA, B33 8TH\n */\nexport function ukPostcode(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n // UK postcode regex - covers all valid formats\n const postcodeRegex = /^([A-Z]{1,2}[0-9][A-Z0-9]? ?[0-9][A-Z]{2})$/i;\n \n if (!postcodeRegex.test(value.trim())) {\n return 'Please enter a valid UK postcode';\n }\n return null;\n}\n\n/**\n * Creates a minimum length validator\n * @param min - Minimum number of characters required\n */\nexport function minLen(min: number): (value: string) => string | null {\n return (value: string) => {\n if (!value) return null; // Let required handle empty values\n \n if (value.trim().length < min) {\n return `Must be at least ${min} character${min === 1 ? '' : 's'}`;\n }\n return null;\n };\n}\n\n/**\n * Combines multiple validators into one\n * Returns the first error encountered, or null if all pass\n */\nexport function compose(\n ...validators: Array<(value: string) => string | null>\n): (value: string) => string | null {\n return (value: string) => {\n for (const validator of validators) {\n const error = validator(value);\n if (error) return error;\n }\n return null;\n };\n}\n","import React, {\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n useId,\n} from 'react';\nimport type {\n FieldConfig,\n RegistrationFormProps,\n RegistrationFormRef,\n RegistrationFormValues,\n RegistrationFormErrors,\n} from '../types/registration';\nimport { required, email, phone, ukPostcode, compose } from '../utils/validators';\n\n/**\n * Default field configuration for the registration form\n */\nconst DEFAULT_FIELDS: FieldConfig[] = [\n {\n name: 'firstName',\n label: 'First name',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'lastName',\n label: 'Last name',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'email',\n label: 'Email address',\n type: 'email',\n required: true,\n validate: compose(required, email),\n },\n {\n name: 'password',\n label: 'Password',\n type: 'password',\n required: false,\n },\n {\n name: 'phone',\n label: 'Contact number',\n type: 'tel',\n required: false,\n validate: phone,\n },\n {\n name: 'address1',\n label: 'Address 1',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'address2',\n label: 'Address 2',\n type: 'text',\n required: false,\n },\n {\n name: 'city',\n label: 'Town/City',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'postcode',\n label: 'Postcode',\n type: 'text',\n required: true,\n validate: compose(required, ukPostcode),\n },\n];\n\n/**\n * A reusable, accessible registration form component.\n * \n * Features:\n * - Customizable fields via props\n * - Built-in validation with blur and submit triggers\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Imperative handle for programmatic control (reset, setValues)\n * - Granular styling via classNames prop\n * \n * @example\n * ```tsx\n * const formRef = useRef<RegistrationFormRef>(null);\n * \n * <RegistrationForm\n * ref={formRef}\n * onSubmit={(values) => console.log(values)}\n * onChange={(values, isValid) => console.log(isValid)}\n * submitLabel=\"Register\"\n * />\n * \n * // Programmatic control\n * formRef.current?.reset();\n * formRef.current?.setValues({ email: 'test@example.com' });\n * ```\n */\nexport const RegistrationForm = forwardRef<RegistrationFormRef, RegistrationFormProps>(\n (\n {\n fields = DEFAULT_FIELDS,\n additionalFields,\n onSubmit,\n onChange,\n validateOnBlur = true,\n submitLabel = 'Submit',\n className = '',\n classNames = {},\n },\n ref\n ) => {\n const formId = useId();\n const [values, setValues] = useState<RegistrationFormValues>({});\n const [errors, setErrors] = useState<RegistrationFormErrors>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n // Merge fields with additional fields\n const allFields = additionalFields ? [...fields, ...additionalFields] : fields;\n\n /**\n * Validate a single field\n */\n const validateField = useCallback(\n (field: FieldConfig, value: string): string | null => {\n // Check required first\n if (field.required && (!value || value.trim() === '')) {\n return 'This field is required';\n }\n // Run custom validator if value is present\n if (field.validate && value) {\n return field.validate(value);\n }\n return null;\n },\n []\n );\n\n /**\n * Validate all fields and return whether form is valid\n */\n const validateAll = useCallback((): boolean => {\n const newErrors: RegistrationFormErrors = {};\n let isValid = true;\n\n for (const field of allFields) {\n const value = values[field.name] || '';\n const error = validateField(field, value);\n if (error) {\n newErrors[field.name] = error;\n isValid = false;\n }\n }\n\n setErrors(newErrors);\n return isValid;\n }, [allFields, values, validateField]);\n\n /**\n * Check if current form state is valid (without updating errors)\n */\n const checkIsValid = useCallback(\n (currentValues: RegistrationFormValues): boolean => {\n for (const field of allFields) {\n const value = currentValues[field.name] || '';\n const error = validateField(field, value);\n if (error) return false;\n }\n return true;\n },\n [allFields, validateField]\n );\n\n /**\n * Handle input change\n */\n const handleChange = useCallback(\n (fieldName: string, value: string) => {\n const newValues = { ...values, [fieldName]: value };\n setValues(newValues);\n\n // Clear error if field was touched and is now valid\n if (touched[fieldName]) {\n const field = allFields.find((f) => f.name === fieldName);\n if (field) {\n const error = validateField(field, value);\n if (!error) {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[fieldName];\n return next;\n });\n }\n }\n }\n\n // Call onChange callback\n if (onChange) {\n const isValid = checkIsValid(newValues);\n onChange(newValues, isValid);\n }\n },\n [values, touched, allFields, validateField, onChange, checkIsValid]\n );\n\n /**\n * Handle input blur\n */\n const handleBlur = useCallback(\n (fieldName: string) => {\n setTouched((prev) => ({ ...prev, [fieldName]: true }));\n\n if (validateOnBlur) {\n const field = allFields.find((f) => f.name === fieldName);\n if (field) {\n const value = values[fieldName] || '';\n const error = validateField(field, value);\n if (error) {\n setErrors((prev) => ({ ...prev, [fieldName]: error }));\n } else {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[fieldName];\n return next;\n });\n }\n }\n }\n },\n [validateOnBlur, allFields, values, validateField]\n );\n\n /**\n * Handle form submission\n */\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all fields as touched\n const allTouched: Record<string, boolean> = {};\n for (const field of allFields) {\n allTouched[field.name] = true;\n }\n setTouched(allTouched);\n\n // Validate all and submit if valid\n if (validateAll()) {\n onSubmit(values);\n }\n },\n [allFields, validateAll, onSubmit, values]\n );\n\n /**\n * Expose imperative methods via ref\n */\n useImperativeHandle(\n ref,\n () => ({\n reset: () => {\n setValues({});\n setErrors({});\n setTouched({});\n },\n setValues: (newValues: Partial<RegistrationFormValues>) => {\n setValues((prev) => {\n const merged = { ...prev };\n for (const [key, value] of Object.entries(newValues)) {\n if (value !== undefined) {\n merged[key] = value;\n }\n }\n return merged;\n });\n },\n }),\n []\n );\n\n // Default styles\n const styles = {\n fieldWrapper: classNames.fieldWrapper || 'mb-4',\n label: classNames.label || 'block text-sm font-medium mb-1',\n input: classNames.input || 'w-full px-3 py-2 border rounded-md',\n inputError: classNames.inputError || 'border-red-500',\n errorText: classNames.errorText || 'mt-1 text-xs text-red-600',\n button:\n classNames.button ||\n 'w-full mt-4 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50',\n };\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {allFields.map((field) => {\n const fieldId = `${formId}-${field.name}`;\n const errorId = `${fieldId}-error`;\n const value = values[field.name] || '';\n const error = errors[field.name];\n const isTouched = touched[field.name];\n const showError = isTouched && error;\n\n return (\n <div key={field.name} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {field.label}\n {field.required && (\n <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n {field.type === 'select' && field.options ? (\n <select\n id={fieldId}\n name={field.name}\n value={value}\n onChange={(e) => handleChange(field.name, e.target.value)}\n onBlur={() => handleBlur(field.name)}\n className={`${styles.input} ${showError ? styles.inputError : ''}`}\n aria-invalid={showError ? 'true' : 'false'}\n aria-describedby={showError ? errorId : undefined}\n aria-required={field.required ? 'true' : 'false'}\n >\n <option value=\"\">{field.placeholder || 'Select an option'}</option>\n {field.options.map((option) => (\n <option key={option.id} value={String(option.id)}>\n {option.name}\n {option.price !== undefined && option.price > 0 ? ` (+£${option.price})` : ''}\n </option>\n ))}\n </select>\n ) : (\n <input\n id={fieldId}\n name={field.name}\n type={field.type === 'select' ? 'text' : field.type}\n value={value}\n onChange={(e) => handleChange(field.name, e.target.value)}\n onBlur={() => handleBlur(field.name)}\n placeholder={field.placeholder}\n className={`${styles.input} ${showError ? styles.inputError : ''}`}\n aria-invalid={showError ? 'true' : 'false'}\n aria-describedby={showError ? errorId : undefined}\n aria-required={field.required ? 'true' : 'false'}\n />\n )}\n {showError && (\n <p id={errorId} className={styles.errorText} role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n })}\n <button type=\"submit\" className={styles.button}>\n {submitLabel}\n </button>\n </form>\n );\n }\n);\n\nRegistrationForm.displayName = 'RegistrationForm';\n","import React, {\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n useId,\n} from 'react';\nimport type { Question, QuestionOption, FormValues, FormErrors } from '../types';\nimport type {\n ContactDetailsFormProps,\n ContactDetailsFormRef,\n ContactDetailsValues,\n ContactDetailsFieldSettings,\n} from '../types/contact-details';\nimport { required, email as emailValidator, compose } from '../utils/validators';\n\n/** Merge base classes with optional custom classes */\nconst cx = (...classes: (string | undefined)[]) => classes.filter(Boolean).join(' ');\n\n/**\n * ContactDetailsForm — collects first name, last name, email and optional\n * dynamic questions. On submit it emits values with `q` and `answers` fields\n * matching the JRNI Update Client / Member API format.\n *\n * @example\n * ```tsx\n * <ContactDetailsForm\n * questions={[\n * { id: 2, name: 'Purpose', detail_type: 'select', required: true,\n * options: [{ id: 5, name: 'School Trip' }, { id: 6, name: 'Corporate' }] },\n * { id: 7, name: 'Group Size', detail_type: 'number', required: true },\n * ]}\n * onSubmit={(values) => console.log(values)}\n * />\n * ```\n */\nexport const ContactDetailsForm = forwardRef<ContactDetailsFormRef, ContactDetailsFormProps>(\n (\n {\n questions = [],\n onSubmit,\n onChange: _onChange,\n initialValues,\n validateOnBlur = true,\n submitLabel = 'Submit',\n className = '',\n classNames = {},\n fieldSettings = {},\n },\n ref\n ) => {\n const formId = useId();\n\n // Contact detail fields\n const [firstName, setFirstName] = useState(initialValues?.firstName || '');\n const [lastName, setLastName] = useState(initialValues?.lastName || '');\n const [emailValue, setEmailValue] = useState(initialValues?.email || '');\n\n // Contact detail errors\n const [contactErrors, setContactErrors] = useState<Record<string, string>>({});\n const [contactTouched, setContactTouched] = useState<Record<string, boolean>>({});\n\n // Question field values and errors (keyed by question id)\n const [questionValues, setQuestionValues] = useState<FormValues>(() => {\n if (!initialValues?.questions) return {};\n const init: FormValues = {};\n for (const [key, val] of Object.entries(initialValues.questions)) {\n init[Number(key)] = val;\n }\n return init;\n });\n const [questionErrors, setQuestionErrors] = useState<FormErrors>({});\n const [questionTouched, setQuestionTouched] = useState<Record<number, boolean>>({});\n\n // ── Resolve per-field settings (default: required=true, disabled=false) ──\n const getFieldRequired = (name: string) => {\n const s = fieldSettings[name as keyof ContactDetailsFieldSettings];\n return s?.required !== undefined ? s.required : true;\n };\n const getFieldDisabled = (name: string) => {\n const s = fieldSettings[name as keyof ContactDetailsFieldSettings];\n return !!s?.disabled;\n };\n\n const contactFields = [\n { name: 'firstName', label: 'First name', value: firstName, setter: setFirstName },\n { name: 'lastName', label: 'Last name', value: lastName, setter: setLastName },\n { name: 'email', label: 'Email', value: emailValue, setter: setEmailValue },\n ] as const;\n\n // ── Validation helpers ──\n\n const validateContactField = useCallback((name: string, value: string): string | null => {\n const isRequired = getFieldRequired(name);\n if (name === 'email') {\n const validators = isRequired ? compose(required, emailValidator) : emailValidator;\n return value ? validators(value) : (isRequired ? required(value) : null);\n }\n return isRequired ? required(value) : null;\n }, [fieldSettings]);\n\n const validateQuestionField = useCallback((question: Question, value: FormValues[number]): string | null => {\n if (question.detail_type === 'heading') return null;\n if (question.required) {\n if (value === undefined || value === '' || value === null) {\n return `${question.name} is required`;\n }\n if (question.detail_type === 'check' && !value) {\n return `${question.name} must be checked`;\n }\n }\n if (question.detail_type === 'number' && value !== '' && value !== undefined) {\n const numValue = Number(value);\n if (question.settings?.min !== undefined && numValue < question.settings.min) {\n return `Minimum value is ${question.settings.min}`;\n }\n if (question.settings?.max !== undefined && numValue > question.settings.max) {\n return `Maximum value is ${question.settings.max}`;\n }\n }\n return null;\n }, []);\n\n const validateAllContacts = useCallback((): boolean => {\n const errs: Record<string, string> = {};\n let valid = true;\n for (const f of contactFields) {\n if (getFieldDisabled(f.name)) continue;\n const err = validateContactField(f.name, f.value);\n if (err) { errs[f.name] = err; valid = false; }\n }\n setContactErrors(errs);\n return valid;\n }, [firstName, lastName, emailValue, validateContactField, fieldSettings]);\n\n const validateAllQuestions = useCallback((): boolean => {\n const errs: FormErrors = {};\n let valid = true;\n for (const q of questions) {\n const err = validateQuestionField(q, questionValues[q.id]);\n if (err) { errs[q.id] = err; valid = false; }\n }\n setQuestionErrors(errs);\n return valid;\n }, [questions, questionValues, validateQuestionField]);\n\n // ── Build output ──\n\n const buildOutput = useCallback((): ContactDetailsValues => {\n const q: ContactDetailsValues['q'] = {};\n const answers: ContactDetailsValues['answers'] = [];\n\n for (const question of questions) {\n if (question.detail_type === 'heading') continue;\n const rawValue = questionValues[question.id];\n if (rawValue === undefined || rawValue === '') continue;\n\n let answer = String(rawValue);\n let answerId = 0;\n\n // For selects, resolve the option\n if (question.detail_type === 'select' && question.options?.length) {\n const option = question.options.find(\n (o: QuestionOption) => String(o.id) === String(rawValue)\n );\n if (option) {\n answer = option.name;\n answerId = typeof option.id === 'number' ? option.id : parseInt(String(option.id), 10) || 0;\n }\n }\n\n const idStr = String(question.id);\n q[idStr] = { answer, answer_id: answerId, name: question.name };\n answers.push({ question_id: question.id, name: question.name, answer, answer_id: answerId });\n }\n\n return { firstName, lastName, email: emailValue, q, answers };\n }, [firstName, lastName, emailValue, questions, questionValues]);\n\n // ── Handlers ──\n\n const handleContactChange = useCallback((name: string, value: string) => {\n const setter = name === 'firstName' ? setFirstName : name === 'lastName' ? setLastName : setEmailValue;\n setter(value);\n\n if (contactTouched[name]) {\n const err = validateContactField(name, value);\n setContactErrors(prev => {\n if (err) return { ...prev, [name]: err };\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n }\n }, [contactTouched, validateContactField]);\n\n const handleContactBlur = useCallback((name: string, value: string) => {\n setContactTouched(prev => ({ ...prev, [name]: true }));\n if (validateOnBlur) {\n const err = validateContactField(name, value);\n setContactErrors(prev => {\n if (err) return { ...prev, [name]: err };\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n }\n }, [validateOnBlur, validateContactField]);\n\n const handleQuestionChange = useCallback((questionId: number, value: string | number | boolean) => {\n setQuestionValues(prev => ({ ...prev, [questionId]: value }));\n setQuestionTouched(prev => ({ ...prev, [questionId]: true }));\n\n if (questionTouched[questionId]) {\n const question = questions.find(q => q.id === questionId);\n if (question) {\n const err = validateQuestionField(question, value);\n setQuestionErrors(prev => {\n if (err) return { ...prev, [questionId]: err };\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n }, [questionTouched, questions, validateQuestionField]);\n\n const handleQuestionBlur = useCallback((questionId: number) => {\n setQuestionTouched(prev => ({ ...prev, [questionId]: true }));\n if (validateOnBlur) {\n const question = questions.find(q => q.id === questionId);\n if (question) {\n const err = validateQuestionField(question, questionValues[questionId]);\n setQuestionErrors(prev => {\n if (err) return { ...prev, [questionId]: err };\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n }, [validateOnBlur, questions, questionValues, validateQuestionField]);\n\n const handleSubmit = useCallback((e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all touched\n const allContactTouched: Record<string, boolean> = {};\n for (const f of contactFields) allContactTouched[f.name] = true;\n setContactTouched(allContactTouched);\n\n const allQTouched: Record<number, boolean> = {};\n for (const q of questions) allQTouched[q.id] = true;\n setQuestionTouched(allQTouched);\n\n const contactValid = validateAllContacts();\n const questionsValid = validateAllQuestions();\n\n if (contactValid && questionsValid) {\n onSubmit(buildOutput());\n }\n }, [contactFields, questions, validateAllContacts, validateAllQuestions, onSubmit, buildOutput]);\n\n // ── Imperative handle ──\n\n useImperativeHandle(ref, () => ({\n reset: () => {\n setFirstName(initialValues?.firstName || '');\n setLastName(initialValues?.lastName || '');\n setEmailValue(initialValues?.email || '');\n setContactErrors({});\n setContactTouched({});\n if (initialValues?.questions) {\n const init: FormValues = {};\n for (const [key, val] of Object.entries(initialValues.questions)) {\n init[Number(key)] = val;\n }\n setQuestionValues(init);\n } else {\n setQuestionValues({});\n }\n setQuestionErrors({});\n setQuestionTouched({});\n },\n setValues: (vals) => {\n if (vals.firstName !== undefined) setFirstName(vals.firstName);\n if (vals.lastName !== undefined) setLastName(vals.lastName);\n if (vals.email !== undefined) setEmailValue(vals.email);\n },\n }), [initialValues]);\n\n // ── Styles ──\n\n const styles = {\n fieldWrapper: classNames.fieldWrapper || 'mb-4',\n label: classNames.label || 'block text-sm font-medium mb-1',\n heading: classNames.heading || 'text-lg font-semibold mt-4 mb-2 first:mt-0',\n input: classNames.input || 'w-full px-3 py-2 border rounded-md text-sm',\n inputError: classNames.inputError || 'border-red-500',\n checkbox: classNames.checkbox || 'mt-1 h-4 w-4 rounded border-gray-300',\n helpText: classNames.helpText || 'mt-1 text-xs text-gray-500',\n errorText: classNames.errorText || 'mt-1 text-xs text-red-600',\n button: classNames.button || 'w-full mt-4 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50',\n };\n\n const inputClasses = (hasError: boolean) =>\n hasError ? cx(styles.input, styles.inputError) : styles.input;\n\n // ── Render contact field ──\n\n const renderContactField = (name: string, label: string, value: string, type = 'text') => {\n const fieldId = `${formId}-${name}`;\n const errorId = `${fieldId}-error`;\n const isDisabled = getFieldDisabled(name);\n const isRequired = getFieldRequired(name);\n const error = contactTouched[name] ? contactErrors[name] : undefined;\n const hasError = !!error;\n\n return (\n <div key={name} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {label}\n {isRequired && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n name={name}\n type={type}\n value={value}\n disabled={isDisabled}\n onChange={(e) => handleContactChange(name, e.target.value)}\n onBlur={() => handleContactBlur(name, name === 'firstName' ? firstName : name === 'lastName' ? lastName : emailValue)}\n className={cx(inputClasses(hasError), isDisabled ? 'opacity-50 cursor-not-allowed' : '')}\n aria-invalid={hasError ? 'true' : 'false'}\n aria-describedby={hasError ? errorId : undefined}\n aria-required={isRequired ? 'true' : undefined}\n />\n {hasError && (\n <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>\n )}\n </div>\n );\n };\n\n // ── Render question field ──\n\n const renderQuestionField = (question: Question) => {\n const fieldId = `${formId}-q-${question.id}`;\n const errorId = `${fieldId}-error`;\n const value = questionValues[question.id];\n const error = questionTouched[question.id] ? questionErrors[question.id] : undefined;\n const hasError = !!error;\n\n const ariaProps = {\n 'aria-invalid': hasError ? true as const : undefined,\n 'aria-describedby': hasError ? errorId : undefined,\n 'aria-required': question.required || undefined,\n };\n\n switch (question.detail_type) {\n case 'heading':\n return (\n <h3 key={question.id} className={styles.heading}>\n {question.name}\n </h3>\n );\n\n case 'text_field':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n placeholder={question.settings?.placeholder}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'text_area':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <textarea\n id={fieldId}\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n placeholder={question.settings?.placeholder}\n rows={4}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'select':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <select\n id={fieldId}\n value={(value as string | number) ?? ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={inputClasses(hasError)}\n {...ariaProps}\n >\n <option value=\"\">Select an option</option>\n {question.options?.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'number':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"number\"\n value={(value as number) ?? ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value ? Number(e.target.value) : '')}\n onBlur={() => handleQuestionBlur(question.id)}\n min={question.settings?.min}\n max={question.settings?.max}\n placeholder={question.settings?.placeholder}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'date':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"date\"\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'check':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <div className=\"flex items-start gap-2\">\n <input\n id={fieldId}\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => handleQuestionChange(question.id, e.target.checked)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={styles.checkbox}\n {...ariaProps}\n />\n <label htmlFor={fieldId} className=\"text-sm\">\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n </div>\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {renderContactField('firstName', 'First name', firstName)}\n {renderContactField('lastName', 'Last name', lastName)}\n {renderContactField('email', 'Email', emailValue, 'email')}\n {questions.map(renderQuestionField)}\n <button type=\"submit\" className={styles.button}>\n {submitLabel}\n </button>\n </form>\n );\n }\n);\n\nContactDetailsForm.displayName = 'ContactDetailsForm';\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -672,6 +672,7 @@ var ContactDetailsForm = forwardRef(
|
|
|
672
672
|
questions = [],
|
|
673
673
|
onSubmit,
|
|
674
674
|
onChange: _onChange,
|
|
675
|
+
initialValues,
|
|
675
676
|
validateOnBlur = true,
|
|
676
677
|
submitLabel = "Submit",
|
|
677
678
|
className = "",
|
|
@@ -679,12 +680,19 @@ var ContactDetailsForm = forwardRef(
|
|
|
679
680
|
fieldSettings = {}
|
|
680
681
|
}, ref) => {
|
|
681
682
|
const formId = useId();
|
|
682
|
-
const [firstName, setFirstName] = useState("");
|
|
683
|
-
const [lastName, setLastName] = useState("");
|
|
684
|
-
const [emailValue, setEmailValue] = useState("");
|
|
683
|
+
const [firstName, setFirstName] = useState(initialValues?.firstName || "");
|
|
684
|
+
const [lastName, setLastName] = useState(initialValues?.lastName || "");
|
|
685
|
+
const [emailValue, setEmailValue] = useState(initialValues?.email || "");
|
|
685
686
|
const [contactErrors, setContactErrors] = useState({});
|
|
686
687
|
const [contactTouched, setContactTouched] = useState({});
|
|
687
|
-
const [questionValues, setQuestionValues] = useState({
|
|
688
|
+
const [questionValues, setQuestionValues] = useState(() => {
|
|
689
|
+
if (!initialValues?.questions) return {};
|
|
690
|
+
const init = {};
|
|
691
|
+
for (const [key, val] of Object.entries(initialValues.questions)) {
|
|
692
|
+
init[Number(key)] = val;
|
|
693
|
+
}
|
|
694
|
+
return init;
|
|
695
|
+
});
|
|
688
696
|
const [questionErrors, setQuestionErrors] = useState({});
|
|
689
697
|
const [questionTouched, setQuestionTouched] = useState({});
|
|
690
698
|
const getFieldRequired = (name) => {
|
|
@@ -848,12 +856,20 @@ var ContactDetailsForm = forwardRef(
|
|
|
848
856
|
}, [contactFields, questions, validateAllContacts, validateAllQuestions, onSubmit, buildOutput]);
|
|
849
857
|
useImperativeHandle(ref, () => ({
|
|
850
858
|
reset: () => {
|
|
851
|
-
setFirstName("");
|
|
852
|
-
setLastName("");
|
|
853
|
-
setEmailValue("");
|
|
859
|
+
setFirstName(initialValues?.firstName || "");
|
|
860
|
+
setLastName(initialValues?.lastName || "");
|
|
861
|
+
setEmailValue(initialValues?.email || "");
|
|
854
862
|
setContactErrors({});
|
|
855
863
|
setContactTouched({});
|
|
856
|
-
|
|
864
|
+
if (initialValues?.questions) {
|
|
865
|
+
const init = {};
|
|
866
|
+
for (const [key, val] of Object.entries(initialValues.questions)) {
|
|
867
|
+
init[Number(key)] = val;
|
|
868
|
+
}
|
|
869
|
+
setQuestionValues(init);
|
|
870
|
+
} else {
|
|
871
|
+
setQuestionValues({});
|
|
872
|
+
}
|
|
857
873
|
setQuestionErrors({});
|
|
858
874
|
setQuestionTouched({});
|
|
859
875
|
},
|
|
@@ -862,7 +878,7 @@ var ContactDetailsForm = forwardRef(
|
|
|
862
878
|
if (vals.lastName !== void 0) setLastName(vals.lastName);
|
|
863
879
|
if (vals.email !== void 0) setEmailValue(vals.email);
|
|
864
880
|
}
|
|
865
|
-
}), []);
|
|
881
|
+
}), [initialValues]);
|
|
866
882
|
const styles = {
|
|
867
883
|
fieldWrapper: classNames.fieldWrapper || "mb-4",
|
|
868
884
|
label: classNames.label || "block text-sm font-medium mb-1",
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/BookingForm.tsx","../src/utils/validators.ts","../src/components/RegistrationForm.tsx","../src/components/ContactDetailsForm.tsx"],"names":["useState","useCallback","jsxs","jsx","cx","forwardRef","useId","useImperativeHandle"],"mappings":";;;;AAIA,IAAM,EAAA,GAAK,IAAI,OAAA,KAAoC,OAAA,CAAQ,OAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAKnF,SAAS,SAAA,CAAU;AAAA,EACjB,QAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,OAAA,GAAU,CAAA,SAAA,EAAY,QAAA,CAAS,EAAE,CAAA,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,GAAG,OAAO,CAAA,MAAA,CAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,KAAA;AAGnB,EAAA,MAAM,mBAAA,GAAsB,MAAA;AAC5B,EAAA,MAAM,YAAA,GAAe,8CAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,0DAAA;AACvB,EAAA,MAAM,YAAA,GAAe,4KAAA;AACrB,EAAA,MAAM,iBAAA,GAAoB,mCAAA;AAC1B,EAAA,MAAM,eAAA,GAAkB,wEAAA;AACxB,EAAA,MAAM,eAAA,GAAkB,4BAAA;AACxB,EAAA,MAAM,gBAAA,GAAmB,2BAAA;AAEzB,EAAA,MAAM,YAAA,GAAe,QAAA,GACjB,EAAA,CAAG,UAAA,EAAY,KAAA,IAAS,YAAA,EAAc,UAAA,EAAY,UAAA,IAAc,iBAAiB,CAAA,GACjF,EAAA,CAAG,UAAA,EAAY,SAAS,YAAY,CAAA;AAExC,EAAA,MAAM,YAAA,GAAe,YAAY,KAAA,IAAS,YAAA;AAC1C,EAAA,MAAM,oBAAA,GAAuB,EAAA,CAAG,SAAA,EAAW,UAAA,EAAY,SAAS,eAAe,CAAA;AAE/E,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,QAAA,CAAS,WAAA,KAAgB,SAAA,EAAW,OAAO,IAAA;AAC/C,IAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,WAAW,YAAA,EACjC,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,IAAA;AAAA,MACT,QAAA,CAAS,4BAAY,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mBAAA,EAAoB,aAAA,EAAY,QAAO,QAAA,EAAA,GAAA,EAAC;AAAA,KAAA,EAChF,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,QAAA,CAAS,SAAA,EAAW,OAAO,IAAA;AAChC,IAAA,2BAAQ,GAAA,EAAA,EAAE,SAAA,EAAW,YAAY,QAAA,IAAY,eAAA,EAAkB,mBAAS,SAAA,EAAU,CAAA;AAAA,EACpF,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,uBACE,GAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,OAAA,EAAS,SAAA,EAAW,YAAY,SAAA,IAAa,gBAAA,EAAkB,IAAA,EAAK,OAAA,EACxE,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,cAAA,EAAgB,WAAW,IAAA,GAAO,MAAA;AAAA,IAClC,kBAAA,EAAoB,WAAW,OAAA,GAAU,MAAA;AAAA,IACzC,eAAA,EAAiB,SAAS,QAAA,IAAY;AAAA,GACxC;AAEA,EAAA,QAAQ,SAAS,WAAA;AAAa,IAC5B,KAAK,SAAA;AACH,MAAA,2BACG,IAAA,EAAA,EAAG,SAAA,EAAW,YAAY,OAAA,IAAW,cAAA,EACnC,mBAAS,IAAA,EACZ,CAAA;AAAA,IAGJ,KAAK,YAAA;AACH,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EACzC,QAAA,EAAA;AAAA,QAAA,WAAA,EAAY;AAAA,wBACb,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,OAAA;AAAA,YACJ,IAAA,EAAK,MAAA;AAAA,YACL,OAAQ,KAAA,IAAoB,EAAA;AAAA,YAC5B,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,WAAA,EAAa,SAAS,QAAA,EAAU,WAAA;AAAA,YAChC,SAAA,EAAW,YAAA;AAAA,YACV,GAAG;AAAA;AAAA,SACN;AAAA,QACC,cAAA,EAAe;AAAA,QACf,WAAA;AAAY,OAAA,EACf,CAAA;AAAA,IAGJ,KAAK,WAAA;AACH,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EACzC,QAAA,EAAA;AAAA,QAAA,WAAA,EAAY;AAAA,wBACb,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,OAAA;AAAA,YACJ,OAAQ,KAAA,IAAoB,EAAA;AAAA,YAC5B,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,WAAA,EAAa,SAAS,QAAA,EAAU,WAAA;AAAA,YAChC,IAAA,EAAM,CAAA;AAAA,YACN,SAAA,EAAW,YAAA;AAAA,YACV,GAAG;AAAA;AAAA,SACN;AAAA,QACC,cAAA,EAAe;AAAA,QACf,WAAA;AAAY,OAAA,EACf,CAAA;AAAA,IAGJ,KAAK,QAAA;AACH,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EACzC,QAAA,EAAA;AAAA,QAAA,WAAA,EAAY;AAAA,wBACb,IAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,OAAA;AAAA,YACJ,OAAQ,KAAA,IAA6B,EAAA;AAAA,YACrC,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,SAAA,EAAW,YAAA;AAAA,YACV,GAAG,SAAA;AAAA,YAEJ,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,cAChC,QAAA,CAAS,OAAA,EAAS,GAAA,CAAI,CAAC,2BACtB,GAAA,CAAC,QAAA,EAAA,EAAuB,KAAA,EAAO,MAAA,CAAO,EAAA,EACnC,QAAA,EAAA,MAAA,CAAO,IAAA,EAAA,EADG,MAAA,CAAO,EAEpB,CACD;AAAA;AAAA;AAAA,SACH;AAAA,QACC,cAAA,EAAe;AAAA,QACf,WAAA;AAAY,OAAA,EACf,CAAA;AAAA,IAGJ,KAAK,MAAA;AACH,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EACzC,QAAA,EAAA;AAAA,QAAA,WAAA,EAAY;AAAA,wBACb,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,OAAA;AAAA,YACJ,IAAA,EAAK,MAAA;AAAA,YACL,OAAQ,KAAA,IAAoB,EAAA;AAAA,YAC5B,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,GAAA,EAAK,QAAA,CAAS,QAAA,EAAU,GAAA,EAAK,QAAA,EAAS;AAAA,YACtC,GAAA,EAAK,QAAA,CAAS,QAAA,EAAU,GAAA,EAAK,QAAA,EAAS;AAAA,YACtC,SAAA,EAAW,YAAA;AAAA,YACV,GAAG;AAAA;AAAA,SACN;AAAA,QACC,cAAA,EAAe;AAAA,QACf,WAAA;AAAY,OAAA,EACf,CAAA;AAAA,IAGJ,KAAK,QAAA;AACH,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EACzC,QAAA,EAAA;AAAA,QAAA,WAAA,EAAY;AAAA,wBACb,GAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,OAAA;AAAA,YACJ,IAAA,EAAK,QAAA;AAAA,YACL,OAAQ,KAAA,IAAoB,EAAA;AAAA,YAC5B,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,GAAI,EAAE,CAAA;AAAA,YACtE,GAAA,EAAK,SAAS,QAAA,EAAU,GAAA;AAAA,YACxB,GAAA,EAAK,SAAS,QAAA,EAAU,GAAA;AAAA,YACxB,WAAA,EAAa,SAAS,QAAA,EAAU,WAAA;AAAA,YAChC,SAAA,EAAW,YAAA;AAAA,YACV,GAAG;AAAA;AAAA,SACN;AAAA,QACC,cAAA,EAAe;AAAA,QACf,WAAA;AAAY,OAAA,EACf,CAAA;AAAA,IAGJ,KAAK,OAAA;AACH,MAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EAC1C,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,OAAA;AAAA,cACJ,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,CAAC,CAAC,KAAA;AAAA,cACX,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,cAC1C,SAAA,EAAW,YAAY,QAAA,IAAY,eAAA;AAAA,cAClC,GAAG;AAAA;AAAA,WACN;AAAA,0BACA,IAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,WAAW,oBAAA,EACjC,QAAA,EAAA;AAAA,YAAA,QAAA,CAAS,IAAA;AAAA,YACT,QAAA,CAAS,4BAAY,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mBAAA,EAAoB,aAAA,EAAY,QAAO,QAAA,EAAA,GAAA,EAAC;AAAA,WAAA,EAChF;AAAA,SAAA,EACF,CAAA;AAAA,QACC,cAAA,EAAe;AAAA,QACf,WAAA;AAAY,OAAA,EACf,CAAA;AAAA,IAGJ;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAmBO,SAAS,WAAA,CAAY;AAAA,EAC1B,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,QAAA;AAAA,EACd,SAAA,GAAY,EAAA;AAAA,EACZ,cAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAqB;AAEnB,EAAA,MAAM,UAAA,GAAoC;AAAA,IACxC,GAAG,cAAA;AAAA,IACH,KAAA,EAAO,gBAAgB,KAAA,IAAS;AAAA,GAClC;AACA,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA,CAAqB,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA,CAAqB,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAAkC,EAAE,CAAA;AAIlE,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAAC,QAAA,KAAgC;AAC/B,MAAA,MAAM,EAAE,UAAS,GAAI,QAAA;AACrB,MAAA,IAAI,CAAC,UAAU,mBAAA,EAAqB;AAClC,QAAA,OAAO,IAAA;AAAA,MACT;AAIA,MAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,mBAA8C,CAAA;AAC/F,MAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,OAAO,iBAAiB,IAAA,CAAK,CAAC,CAAC,aAAA,EAAe,cAAc,CAAA,KAAM;AAChE,QAAA,MAAM,UAAA,GAAa,OAAO,aAAa,CAAA;AACvC,QAAA,MAAM,YAAA,GAAgB,MAAA,CAAmC,MAAA,CAAO,UAAU,CAAC,CAAA;AAE3E,QAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,YAAA,KAAiB,EAAA,IAAM,iBAAiB,IAAA,EAAM;AAC9E,UAAA,OAAO,KAAA;AAAA,QACT;AAGA,QAAA,MAAM,iBAAA,GACJ,OAAO,YAAA,KAAiB,QAAA,IAAY,iBAAiB,IAAA,IAAQ,IAAA,IAAS,eACjE,YAAA,GACD,YAAA;AAIN,QAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AAEnC,QAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAe;AACnC,UAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,IAAA,EAAM;AACnC,UAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,EAAK;AACzB,UAAA,IAAI,CAAA,EAAG,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA;AAAA,QACzB,CAAA;AAEA,QAAA,MAAM,iBAAiB,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,UAAU,CAAA;AAEhE,QAAA,IAAI,OAAO,iBAAA,KAAsB,QAAA,IAAY,iBAAA,KAAsB,IAAA,EAAM;AACvE,UAAA,YAAA,CAAc,kBAA0B,EAAE,CAAA;AAC1C,UAAA,YAAA,CAAc,kBAA0B,IAAI,CAAA;AAAA,QAC9C,CAAA,MAAO;AACL,UAAA,YAAA,CAAa,iBAAiB,CAAA;AAAA,QAChC;AAEA,QAAA,IAAI,cAAA,EAAgB,WAAA,KAAgB,QAAA,IAAY,cAAA,CAAe,SAAS,MAAA,EAAQ;AAE9E,UAAA,MAAM,aAAa,CAAC,GAAG,UAAU,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACzC,UAAA,MAAM,UAAA,GAAa,cAAA,CAAe,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,KAAM,UAAU,CAAA;AACjF,UAAA,MAAM,YAAA,GAAe,cAAA,CAAe,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,EAAK,KAAM,UAAU,CAAA;AAC5F,UAAA,MAAM,MAAM,UAAA,IAAc,YAAA;AAC1B,UAAA,IAAI,GAAA,EAAK;AACP,YAAA,YAAA,CAAa,IAAI,EAAE,CAAA;AACnB,YAAA,YAAA,CAAa,IAAI,IAAI,CAAA;AAAA,UACvB;AAAA,QACF;AAEA,QAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,KAAsB;AAC3C,UAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,EAAK;AAC1C,UAAA,OAAO,UAAA,CAAW,IAAI,WAAW,CAAA;AAAA,QACnC,CAAA;AAMA,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,EAAG;AACjC,UAAA,OAAO,eAAe,IAAA,CAAK,CAAC,CAAA,KAAM,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,QACpD;AAEA,QAAA,IAAI,cAAA,IAAkB,OAAO,cAAA,KAAmB,QAAA,EAAU;AACxD,UAAA,MAAM,WAAA,GAAc,cAAA;AACpB,UAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,YAAA,IAAI,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA,EAAG;AACxD,cAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAC1B,cAAA,OAAO,IAAA,KAAS,MAAA,GAAY,IAAA,GAAO,CAAC,CAAC,IAAA;AAAA,YACvC;AAAA,UACF;AACA,UAAA,OAAO,KAAA;AAAA,QACT;AAEA,QAAA,OAAO,cAAc,cAAc,CAAA;AAAA,MACrC,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,QAAQ,SAAS;AAAA,GACpB;AAGA,EAAA,MAAM,gBAAA,GAAmB,SAAA,CAAU,MAAA,CAAO,iBAAiB,CAAA;AAI3D,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,QAAA,EAAoB,KAAA,KAA6C;AAClG,IAAA,IAAI,QAAA,CAAS,WAAA,KAAgB,SAAA,EAAW,OAAO,IAAA;AAE/C,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA,IAAM,UAAU,IAAA,EAAM;AACzD,QAAA,OAAO,CAAA,EAAG,SAAS,IAAI,CAAA,YAAA,CAAA;AAAA,MACzB;AACA,MAAA,IAAI,QAAA,CAAS,WAAA,KAAgB,OAAA,IAAW,CAAC,KAAA,EAAO;AAC9C,QAAA,OAAO,CAAA,EAAG,SAAS,IAAI,CAAA,gBAAA,CAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,WAAA,KAAgB,QAAA,IAAY,KAAA,KAAU,EAAA,IAAM,UAAU,MAAA,EAAW;AAC5E,MAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,MAAA,IAAI,SAAS,QAAA,EAAU,GAAA,KAAQ,UAAa,QAAA,GAAW,QAAA,CAAS,SAAS,GAAA,EAAK;AAC5E,QAAA,OAAO,CAAA,iBAAA,EAAoB,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,CAAA;AAAA,MAClD;AACA,MAAA,IAAI,SAAS,QAAA,EAAU,GAAA,KAAQ,UAAa,QAAA,GAAW,QAAA,CAAS,SAAS,GAAA,EAAK;AAC5E,QAAA,OAAO,CAAA,iBAAA,EAAoB,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,CAAA;AAAA,MAClD;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,WAAA,GAAc,YAAY,MAAe;AAC7C,IAAA,MAAM,YAAwB,EAAC;AAC/B,IAAA,IAAI,OAAA,GAAU,IAAA;AAEd,IAAA,gBAAA,CAAiB,OAAA,CAAQ,CAAC,QAAA,KAAa;AACrC,MAAA,MAAM,QAAQ,aAAA,CAAc,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,EAAE,CAAC,CAAA;AACzD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,SAAA,CAAU,QAAA,CAAS,EAAE,CAAA,GAAI,KAAA;AACzB,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAAA,IACF,CAAC,CAAA;AAED,IAAA,SAAA,CAAU,SAAS,CAAA;AACnB,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,gBAAA,EAAkB,MAAA,EAAQ,aAAa,CAAC,CAAA;AAG5C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,gBAAA,CAAiB,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAE5D,IAAA,SAAA,CAAU,CAAC,IAAA,KAAS;AAClB,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK;AAEvB,MAAA,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU;AACnC,QAAA,MAAM,EAAA,GAAK,OAAO,KAAK,CAAA;AACvB,QAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA,EAAG;AACvB,UAAA,OAAO,KAAK,EAAE,CAAA;AACd,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF,CAAC,CAAA;AAED,MAAA,OAAO,UAAU,IAAA,GAAO,IAAA;AAAA,IAC1B,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,YAAA,GAAe,CAAC,UAAA,EAAoB,KAAA,KAAqC;AAC7E,IAAA,SAAA,CAAU,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,UAAU,GAAG,KAAA,EAAM,CAAE,CAAA;AACtD,IAAA,UAAA,CAAW,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,UAAU,GAAG,IAAA,EAAK,CAAE,CAAA;AAGtD,IAAA,IAAI,OAAA,CAAQ,UAAU,CAAA,EAAG;AACvB,MAAA,MAAM,WAAW,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,UAAU,CAAA;AAC1D,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,QAAA,EAAU,KAAK,CAAA;AAC3C,QAAA,SAAA,CAAU,CAAC,IAAA,KAAS;AAClB,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,OAAO,EAAE,GAAG,IAAA,EAAM,CAAC,UAAU,GAAG,KAAA,EAAM;AAAA,UACxC;AACA,UAAA,MAAM,EAAE,CAAC,UAAU,GAAG,CAAA,EAAG,GAAG,MAAK,GAAI,IAAA;AACrC,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAuB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AAGjB,IAAA,MAAM,aAAsC,EAAC;AAC7C,IAAA,gBAAA,CAAiB,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC9B,MAAA,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA,GAAI,IAAA;AAAA,IACrB,CAAC,CAAA;AACD,IAAA,UAAA,CAAW,UAAU,CAAA;AAErB,IAAA,IAAI,aAAY,EAAG;AAEjB,MAAA,MAAM,gBAA4B,EAAC;AACnC,MAAA,gBAAA,CAAiB,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC9B,QAAA,IAAI,EAAE,WAAA,KAAgB,SAAA,IAAa,OAAO,CAAA,CAAE,EAAE,MAAM,MAAA,EAAW;AAC7D,UAAA,aAAA,CAAc,CAAA,CAAE,EAAE,CAAA,GAAI,MAAA,CAAO,EAAE,EAAE,CAAA;AAAA,QACnC;AAAA,MACF,CAAC,CAAA;AACD,MAAA,QAAA,CAAS,aAAa,CAAA;AAAA,IACxB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,iLAAA;AAEtB,EAAA,4BACG,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,SAAA,EAAsB,YAAU,IAAA,EAC3D,QAAA,EAAA;AAAA,IAAA,gBAAA,CAAiB,GAAA,CAAI,CAAC,QAAA,qBACrB,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QAEC,QAAA;AAAA,QACA,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,QACzB,KAAA,EAAO,QAAQ,QAAA,CAAS,EAAE,IAAI,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,GAAI,MAAA;AAAA,QACpD,UAAU,CAAC,KAAA,KAAU,YAAA,CAAa,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,QACpD;AAAA,OAAA;AAAA,MALK,QAAA,CAAS;AAAA,KAOjB,CAAA;AAAA,oBACD,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,YAAY,MAAA,IAAU,aAAA;AAAA,QAEhC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;;;ACvcO,SAAS,SAAS,KAAA,EAA8B;AACrD,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,IAAA,OAAW,EAAA,EAAI;AACjC,IAAA,OAAO,wBAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,MAAM,KAAA,EAA8B;AAClD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,UAAA,GAAa,sIAAA;AAEnB,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,oCAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,MAAM,KAAA,EAA8B;AAClD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAGnB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAG/C,EAAA,MAAM,UAAA,GAAa,kBAAA;AAEnB,EAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA,EAAG;AAC7B,IAAA,OAAO,mCAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,WAAW,KAAA,EAA8B;AACvD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAGnB,EAAA,MAAM,aAAA,GAAgB,8CAAA;AAEtB,EAAA,IAAI,CAAC,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,CAAA,EAAG;AACrC,IAAA,OAAO,kCAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,OAAO,GAAA,EAA+C;AACpE,EAAA,OAAO,CAAC,KAAA,KAAkB;AACxB,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,IAAI,KAAA,CAAM,IAAA,EAAK,CAAE,MAAA,GAAS,GAAA,EAAK;AAC7B,MAAA,OAAO,oBAAoB,GAAG,CAAA,UAAA,EAAa,GAAA,KAAQ,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACF;AAMO,SAAS,WACX,UAAA,EAC+B;AAClC,EAAA,OAAO,CAAC,KAAA,KAAkB;AACxB,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,MAAM,KAAA,GAAQ,UAAU,KAAK,CAAA;AAC7B,MAAA,IAAI,OAAO,OAAO,KAAA;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AACF;AC1EA,IAAM,cAAA,GAAgC;AAAA,EACpC;AAAA,IACE,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,WAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,eAAA;AAAA,IACP,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,KAAK;AAAA,GACnC;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,gBAAA;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,KAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,WAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,WAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,WAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU,OAAA,CAAQ,QAAA,EAAU,UAAU;AAAA;AAE1C,CAAA;AA4BO,IAAM,gBAAA,GAAmB,UAAA;AAAA,EAC9B,CACE;AAAA,IACE,MAAA,GAAS,cAAA;AAAA,IACT,gBAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA,GAAiB,IAAA;AAAA,IACjB,WAAA,GAAc,QAAA;AAAA,IACd,SAAA,GAAY,EAAA;AAAA,IACZ,aAAa;AAAC,KAEhB,GAAA,KACG;AACH,IAAA,MAAM,SAAS,KAAA,EAAM;AACrB,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAiC,EAAE,CAAA;AAC/D,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAiC,EAAE,CAAA;AAC/D,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,QAAAA,CAAkC,EAAE,CAAA;AAGlE,IAAA,MAAM,YAAY,gBAAA,GAAmB,CAAC,GAAG,MAAA,EAAQ,GAAG,gBAAgB,CAAA,GAAI,MAAA;AAKxE,IAAA,MAAM,aAAA,GAAgBC,WAAAA;AAAA,MACpB,CAAC,OAAoB,KAAA,KAAiC;AAEpD,QAAA,IAAI,MAAM,QAAA,KAAa,CAAC,SAAS,KAAA,CAAM,IAAA,OAAW,EAAA,CAAA,EAAK;AACrD,UAAA,OAAO,wBAAA;AAAA,QACT;AAEA,QAAA,IAAI,KAAA,CAAM,YAAY,KAAA,EAAO;AAC3B,UAAA,OAAO,KAAA,CAAM,SAAS,KAAK,CAAA;AAAA,QAC7B;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA;AAAC,KACH;AAKA,IAAA,MAAM,WAAA,GAAcA,YAAY,MAAe;AAC7C,MAAA,MAAM,YAAoC,EAAC;AAC3C,MAAA,IAAI,OAAA,GAAU,IAAA;AAEd,MAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,IAAK,EAAA;AACpC,QAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,KAAK,CAAA;AACxC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA;AACxB,UAAA,OAAA,GAAU,KAAA;AAAA,QACZ;AAAA,MACF;AAEA,MAAA,SAAA,CAAU,SAAS,CAAA;AACnB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,EAAG,CAAC,SAAA,EAAW,MAAA,EAAQ,aAAa,CAAC,CAAA;AAKrC,IAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,MACnB,CAAC,aAAA,KAAmD;AAClD,QAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,UAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA,IAAK,EAAA;AAC3C,UAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,KAAK,CAAA;AACxC,UAAA,IAAI,OAAO,OAAO,KAAA;AAAA,QACpB;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,CAAC,WAAW,aAAa;AAAA,KAC3B;AAKA,IAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,MACnB,CAAC,WAAmB,KAAA,KAAkB;AACpC,QAAA,MAAM,YAAY,EAAE,GAAG,QAAQ,CAAC,SAAS,GAAG,KAAA,EAAM;AAClD,QAAA,SAAA,CAAU,SAAS,CAAA;AAGnB,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,MAAM,QAAQ,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AACxD,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,KAAK,CAAA;AACxC,YAAA,IAAI,CAAC,KAAA,EAAO;AACV,cAAA,SAAA,CAAU,CAAC,IAAA,KAAS;AAClB,gBAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK;AACvB,gBAAA,OAAO,KAAK,SAAS,CAAA;AACrB,gBAAA,OAAO,IAAA;AAAA,cACT,CAAC,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,OAAA,GAAU,aAAa,SAAS,CAAA;AACtC,UAAA,QAAA,CAAS,WAAW,OAAO,CAAA;AAAA,QAC7B;AAAA,MACF,CAAA;AAAA,MACA,CAAC,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,aAAA,EAAe,UAAU,YAAY;AAAA,KACpE;AAKA,IAAA,MAAM,UAAA,GAAaA,WAAAA;AAAA,MACjB,CAAC,SAAA,KAAsB;AACrB,QAAA,UAAA,CAAW,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAA,EAAK,CAAE,CAAA;AAErD,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,MAAM,QAAQ,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAS,CAAA;AACxD,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAS,CAAA,IAAK,EAAA;AACnC,YAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,EAAO,KAAK,CAAA;AACxC,YAAA,IAAI,KAAA,EAAO;AACT,cAAA,SAAA,CAAU,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,KAAA,EAAM,CAAE,CAAA;AAAA,YACvD,CAAA,MAAO;AACL,cAAA,SAAA,CAAU,CAAC,IAAA,KAAS;AAClB,gBAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK;AACvB,gBAAA,OAAO,KAAK,SAAS,CAAA;AACrB,gBAAA,OAAO,IAAA;AAAA,cACT,CAAC,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,CAAC,cAAA,EAAgB,SAAA,EAAW,MAAA,EAAQ,aAAa;AAAA,KACnD;AAKA,IAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,MACnB,CAAC,CAAA,KAAuB;AACtB,QAAA,CAAA,CAAE,cAAA,EAAe;AAGjB,QAAA,MAAM,aAAsC,EAAC;AAC7C,QAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,UAAA,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAAA,QAC3B;AACA,QAAA,UAAA,CAAW,UAAU,CAAA;AAGrB,QAAA,IAAI,aAAY,EAAG;AACjB,UAAA,QAAA,CAAS,MAAM,CAAA;AAAA,QACjB;AAAA,MACF,CAAA;AAAA,MACA,CAAC,SAAA,EAAW,WAAA,EAAa,QAAA,EAAU,MAAM;AAAA,KAC3C;AAKA,IAAA,mBAAA;AAAA,MACE,GAAA;AAAA,MACA,OAAO;AAAA,QACL,OAAO,MAAM;AACX,UAAA,SAAA,CAAU,EAAE,CAAA;AACZ,UAAA,SAAA,CAAU,EAAE,CAAA;AACZ,UAAA,UAAA,CAAW,EAAE,CAAA;AAAA,QACf,CAAA;AAAA,QACA,SAAA,EAAW,CAAC,SAAA,KAA+C;AACzD,UAAA,SAAA,CAAU,CAAC,IAAA,KAAS;AAClB,YAAA,MAAM,MAAA,GAAS,EAAE,GAAG,IAAA,EAAK;AACzB,YAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,cAAA,IAAI,UAAU,MAAA,EAAW;AACvB,gBAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,cAChB;AAAA,YACF;AACA,YAAA,OAAO,MAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH;AAAA,OACF,CAAA;AAAA,MACA;AAAC,KACH;AAGA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,YAAA,EAAc,WAAW,YAAA,IAAgB,MAAA;AAAA,MACzC,KAAA,EAAO,WAAW,KAAA,IAAS,gCAAA;AAAA,MAC3B,KAAA,EAAO,WAAW,KAAA,IAAS,oCAAA;AAAA,MAC3B,UAAA,EAAY,WAAW,UAAA,IAAc,gBAAA;AAAA,MACrC,SAAA,EAAW,WAAW,SAAA,IAAa,2BAAA;AAAA,MACnC,MAAA,EACE,WAAW,MAAA,IACX;AAAA,KACJ;AAEA,IAAA,uBACEC,IAAAA,CAAC,MAAA,EAAA,EAAK,UAAU,YAAA,EAAc,SAAA,EAAsB,YAAU,IAAA,EAC3D,QAAA,EAAA;AAAA,MAAA,SAAA,CAAU,GAAA,CAAI,CAAC,KAAA,KAAU;AACxB,QAAA,MAAM,OAAA,GAAU,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,CAAA;AACvC,QAAA,MAAM,OAAA,GAAU,GAAG,OAAO,CAAA,MAAA,CAAA;AAC1B,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,IAAK,EAAA;AACpC,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,QAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AACpC,QAAA,MAAM,YAAY,SAAA,IAAa,KAAA;AAE/B,QAAA,uBACEA,IAAAA,CAAC,KAAA,EAAA,EAAqB,SAAA,EAAW,OAAO,YAAA,EACtC,QAAA,EAAA;AAAA,0BAAAA,KAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,KAAA;AAAA,YACN,KAAA,CAAM,4BACLC,GAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAEvD;AAAA,WAAA,EAEJ,CAAA;AAAA,UACC,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,0BAChCD,IAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,OAAA;AAAA,cACJ,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,KAAA;AAAA,cACA,QAAA,EAAU,CAAC,CAAA,KAAM,YAAA,CAAa,MAAM,IAAA,EAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACxD,MAAA,EAAQ,MAAM,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AAAA,cACnC,SAAA,EAAW,GAAG,MAAA,CAAO,KAAK,IAAI,SAAA,GAAY,MAAA,CAAO,aAAa,EAAE,CAAA,CAAA;AAAA,cAChE,cAAA,EAAc,YAAY,MAAA,GAAS,OAAA;AAAA,cACnC,kBAAA,EAAkB,YAAY,OAAA,GAAU,MAAA;AAAA,cACxC,eAAA,EAAe,KAAA,CAAM,QAAA,GAAW,MAAA,GAAS,OAAA;AAAA,cAEzC,QAAA,EAAA;AAAA,gCAAAC,IAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAI,QAAA,EAAA,KAAA,CAAM,eAAe,kBAAA,EAAmB,CAAA;AAAA,gBACzD,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBAClBD,IAAAA,CAAC,QAAA,EAAA,EAAuB,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,EAC5C,QAAA,EAAA;AAAA,kBAAA,MAAA,CAAO,IAAA;AAAA,kBACP,MAAA,CAAO,UAAU,MAAA,IAAa,MAAA,CAAO,QAAQ,CAAA,GAAI,CAAA,OAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAA,CAAA,GAAM;AAAA,iBAAA,EAAA,EAFhE,MAAA,CAAO,EAGpB,CACD;AAAA;AAAA;AAAA,8BAGHC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAI,OAAA;AAAA,cACJ,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,IAAA,EAAM,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,SAAS,KAAA,CAAM,IAAA;AAAA,cAC/C,KAAA;AAAA,cACA,QAAA,EAAU,CAAC,CAAA,KAAM,YAAA,CAAa,MAAM,IAAA,EAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACxD,MAAA,EAAQ,MAAM,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AAAA,cACnC,aAAa,KAAA,CAAM,WAAA;AAAA,cACnB,SAAA,EAAW,GAAG,MAAA,CAAO,KAAK,IAAI,SAAA,GAAY,MAAA,CAAO,aAAa,EAAE,CAAA,CAAA;AAAA,cAChE,cAAA,EAAc,YAAY,MAAA,GAAS,OAAA;AAAA,cACnC,kBAAA,EAAkB,YAAY,OAAA,GAAU,MAAA;AAAA,cACxC,eAAA,EAAe,KAAA,CAAM,QAAA,GAAW,MAAA,GAAS;AAAA;AAAA,WAC3C;AAAA,UAED,SAAA,oBACCA,GAAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,IAAA,EAAK,OAAA,EAC/C,QAAA,EAAA,KAAA,EACH;AAAA,SAAA,EAAA,EA/CM,MAAM,IAiDhB,CAAA;AAAA,MAEJ,CAAC,CAAA;AAAA,sBACDA,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,MAAA,CAAO,QACrC,QAAA,EAAA,WAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,gBAAA,CAAiB,WAAA,GAAc,kBAAA;ACrW/B,IAAMC,GAAAA,GAAK,IAAI,OAAA,KAAoC,OAAA,CAAQ,OAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAmB5E,IAAM,kBAAA,GAAqBC,UAAAA;AAAA,EAChC,CACE;AAAA,IACE,YAAY,EAAC;AAAA,IACb,QAAA;AAAA,IACA,QAAA,EAAU,SAAA;AAAA,IACV,cAAA,GAAiB,IAAA;AAAA,IACjB,WAAA,GAAc,QAAA;AAAA,IACd,SAAA,GAAY,EAAA;AAAA,IACZ,aAAa,EAAC;AAAA,IACd,gBAAgB;AAAC,KAEnB,GAAA,KACG;AACH,IAAA,MAAM,SAASC,KAAAA,EAAM;AAGrB,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIN,SAAS,EAAE,CAAA;AAC7C,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC3C,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,EAAE,CAAA;AAG/C,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,QAAAA,CAAiC,EAAE,CAAA;AAC7E,IAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAAkC,EAAE,CAAA;AAGhF,IAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAAqB,EAAE,CAAA;AACnE,IAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,QAAAA,CAAqB,EAAE,CAAA;AACnE,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,QAAAA,CAAkC,EAAE,CAAA;AAGlF,IAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAiB;AACzC,MAAA,MAAM,CAAA,GAAI,cAAc,IAAyC,CAAA;AACjE,MAAA,OAAO,CAAA,EAAG,QAAA,KAAa,MAAA,GAAY,CAAA,CAAE,QAAA,GAAW,IAAA;AAAA,IAClD,CAAA;AACA,IAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAiB;AACzC,MAAA,MAAM,CAAA,GAAI,cAAc,IAAyC,CAAA;AACjE,MAAA,OAAO,CAAC,CAAC,CAAA,EAAG,QAAA;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,EAAE,MAAM,WAAA,EAAa,KAAA,EAAO,cAAc,KAAA,EAAO,SAAA,EAAW,QAAQ,YAAA,EAAa;AAAA,MACjF,EAAE,MAAM,UAAA,EAAY,KAAA,EAAO,aAAa,KAAA,EAAO,QAAA,EAAU,QAAQ,WAAA,EAAY;AAAA,MAC7E,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,SAAS,KAAA,EAAO,UAAA,EAAY,QAAQ,aAAA;AAAc,KAC5E;AAIA,IAAA,MAAM,oBAAA,GAAuBC,WAAAA,CAAY,CAAC,IAAA,EAAc,KAAA,KAAiC;AACvF,MAAA,MAAM,UAAA,GAAa,iBAAiB,IAAI,CAAA;AACxC,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,MAAM,UAAA,GAAa,UAAA,GAAa,OAAA,CAAQ,QAAA,EAAU,KAAc,CAAA,GAAI,KAAA;AACpE,QAAA,OAAO,QAAQ,UAAA,CAAW,KAAK,IAAK,UAAA,GAAa,QAAA,CAAS,KAAK,CAAA,GAAI,IAAA;AAAA,MACrE;AACA,MAAA,OAAO,UAAA,GAAa,QAAA,CAAS,KAAK,CAAA,GAAI,IAAA;AAAA,IACxC,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,IAAA,MAAM,qBAAA,GAAwBA,WAAAA,CAAY,CAAC,QAAA,EAAoB,KAAA,KAA6C;AAC1G,MAAA,IAAI,QAAA,CAAS,WAAA,KAAgB,SAAA,EAAW,OAAO,IAAA;AAC/C,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA,IAAM,UAAU,IAAA,EAAM;AACzD,UAAA,OAAO,CAAA,EAAG,SAAS,IAAI,CAAA,YAAA,CAAA;AAAA,QACzB;AACA,QAAA,IAAI,QAAA,CAAS,WAAA,KAAgB,OAAA,IAAW,CAAC,KAAA,EAAO;AAC9C,UAAA,OAAO,CAAA,EAAG,SAAS,IAAI,CAAA,gBAAA,CAAA;AAAA,QACzB;AAAA,MACF;AACA,MAAA,IAAI,SAAS,WAAA,KAAgB,QAAA,IAAY,KAAA,KAAU,EAAA,IAAM,UAAU,MAAA,EAAW;AAC5E,QAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,QAAA,IAAI,SAAS,QAAA,EAAU,GAAA,KAAQ,UAAa,QAAA,GAAW,QAAA,CAAS,SAAS,GAAA,EAAK;AAC5E,UAAA,OAAO,CAAA,iBAAA,EAAoB,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,CAAA;AAAA,QAClD;AACA,QAAA,IAAI,SAAS,QAAA,EAAU,GAAA,KAAQ,UAAa,QAAA,GAAW,QAAA,CAAS,SAAS,GAAA,EAAK;AAC5E,UAAA,OAAO,CAAA,iBAAA,EAAoB,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,CAAA;AAAA,QAClD;AAAA,MACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,mBAAA,GAAsBA,YAAY,MAAe;AACrD,MAAA,MAAM,OAA+B,EAAC;AACtC,MAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,KAAA,MAAW,KAAK,aAAA,EAAe;AAC7B,QAAA,IAAI,gBAAA,CAAiB,CAAA,CAAE,IAAI,CAAA,EAAG;AAC9B,QAAA,MAAM,GAAA,GAAM,oBAAA,CAAqB,CAAA,CAAE,IAAA,EAAM,EAAE,KAAK,CAAA;AAChD,QAAA,IAAI,GAAA,EAAK;AAAE,UAAA,IAAA,CAAK,CAAA,CAAE,IAAI,CAAA,GAAI,GAAA;AAAK,UAAA,KAAA,GAAQ,KAAA;AAAA,QAAO;AAAA,MAChD;AACA,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA,OAAO,KAAA;AAAA,IACT,GAAG,CAAC,SAAA,EAAW,UAAU,UAAA,EAAY,oBAAA,EAAsB,aAAa,CAAC,CAAA;AAEzE,IAAA,MAAM,oBAAA,GAAuBA,YAAY,MAAe;AACtD,MAAA,MAAM,OAAmB,EAAC;AAC1B,MAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,QAAA,MAAM,MAAM,qBAAA,CAAsB,CAAA,EAAG,cAAA,CAAe,CAAA,CAAE,EAAE,CAAC,CAAA;AACzD,QAAA,IAAI,GAAA,EAAK;AAAE,UAAA,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA,GAAI,GAAA;AAAK,UAAA,KAAA,GAAQ,KAAA;AAAA,QAAO;AAAA,MAC9C;AACA,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,EAAG,CAAC,SAAA,EAAW,cAAA,EAAgB,qBAAqB,CAAC,CAAA;AAIrD,IAAA,MAAM,WAAA,GAAcA,YAAY,MAA4B;AAC1D,MAAA,MAAM,IAA+B,EAAC;AACtC,MAAA,MAAM,UAA2C,EAAC;AAElD,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,IAAI,QAAA,CAAS,gBAAgB,SAAA,EAAW;AACxC,QAAA,MAAM,QAAA,GAAW,cAAA,CAAe,QAAA,CAAS,EAAE,CAAA;AAC3C,QAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,EAAA,EAAI;AAE/C,QAAA,IAAI,MAAA,GAAS,OAAO,QAAQ,CAAA;AAC5B,QAAA,IAAI,QAAA,GAAW,CAAA;AAGf,QAAA,IAAI,QAAA,CAAS,WAAA,KAAgB,QAAA,IAAY,QAAA,CAAS,SAAS,MAAA,EAAQ;AACjE,UAAA,MAAM,MAAA,GAAS,SAAS,OAAA,CAAQ,IAAA;AAAA,YAC9B,CAAC,CAAA,KAAsB,MAAA,CAAO,EAAE,EAAE,CAAA,KAAM,OAAO,QAAQ;AAAA,WACzD;AACA,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,MAAA,GAAS,MAAA,CAAO,IAAA;AAChB,YAAA,QAAA,GAAW,OAAO,MAAA,CAAO,EAAA,KAAO,QAAA,GAAW,MAAA,CAAO,EAAA,GAAK,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,EAAG,EAAE,CAAA,IAAK,CAAA;AAAA,UAC5F;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAChC,QAAA,CAAA,CAAE,KAAK,IAAI,EAAE,MAAA,EAAQ,WAAW,QAAA,EAAU,IAAA,EAAM,SAAS,IAAA,EAAK;AAC9D,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,WAAA,EAAa,QAAA,CAAS,EAAA,EAAI,IAAA,EAAM,QAAA,CAAS,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,CAAA;AAAA,MAC7F;AAEA,MAAA,OAAO,EAAE,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,GAAG,OAAA,EAAQ;AAAA,IAC9D,GAAG,CAAC,SAAA,EAAW,UAAU,UAAA,EAAY,SAAA,EAAW,cAAc,CAAC,CAAA;AAI/D,IAAA,MAAM,mBAAA,GAAsBA,WAAAA,CAAY,CAAC,IAAA,EAAc,KAAA,KAAkB;AACvE,MAAA,MAAM,SAAS,IAAA,KAAS,WAAA,GAAc,YAAA,GAAe,IAAA,KAAS,aAAa,WAAA,GAAc,aAAA;AACzF,MAAA,MAAA,CAAO,KAAK,CAAA;AAEZ,MAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG;AACxB,QAAA,MAAM,GAAA,GAAM,oBAAA,CAAqB,IAAA,EAAM,KAAK,CAAA;AAC5C,QAAA,gBAAA,CAAiB,CAAA,IAAA,KAAQ;AACvB,UAAA,IAAI,GAAA,SAAY,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,GAAA,EAAI;AACvC,UAAA,MAAM,EAAE,CAAC,IAAI,GAAG,CAAA,EAAG,GAAG,MAAK,GAAI,IAAA;AAC/B,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA,EAAG,CAAC,cAAA,EAAgB,oBAAoB,CAAC,CAAA;AAEzC,IAAA,MAAM,iBAAA,GAAoBA,WAAAA,CAAY,CAAC,IAAA,EAAc,KAAA,KAAkB;AACrE,MAAA,iBAAA,CAAkB,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,CAAC,IAAI,GAAG,MAAK,CAAE,CAAA;AACrD,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAM,GAAA,GAAM,oBAAA,CAAqB,IAAA,EAAM,KAAK,CAAA;AAC5C,QAAA,gBAAA,CAAiB,CAAA,IAAA,KAAQ;AACvB,UAAA,IAAI,GAAA,SAAY,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,GAAA,EAAI;AACvC,UAAA,MAAM,EAAE,CAAC,IAAI,GAAG,CAAA,EAAG,GAAG,MAAK,GAAI,IAAA;AAC/B,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA,EAAG,CAAC,cAAA,EAAgB,oBAAoB,CAAC,CAAA;AAEzC,IAAA,MAAM,oBAAA,GAAuBA,WAAAA,CAAY,CAAC,UAAA,EAAoB,KAAA,KAAqC;AACjG,MAAA,iBAAA,CAAkB,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,CAAC,UAAU,GAAG,OAAM,CAAE,CAAA;AAC5D,MAAA,kBAAA,CAAmB,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,CAAC,UAAU,GAAG,MAAK,CAAE,CAAA;AAE5D,MAAA,IAAI,eAAA,CAAgB,UAAU,CAAA,EAAG;AAC/B,QAAA,MAAM,WAAW,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,UAAU,CAAA;AACxD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,QAAA,EAAU,KAAK,CAAA;AACjD,UAAA,iBAAA,CAAkB,CAAA,IAAA,KAAQ;AACxB,YAAA,IAAI,GAAA,SAAY,EAAE,GAAG,MAAM,CAAC,UAAU,GAAG,GAAA,EAAI;AAC7C,YAAA,MAAM,EAAE,CAAC,UAAU,GAAG,CAAA,EAAG,GAAG,MAAK,GAAI,IAAA;AACrC,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAA,EAAG,CAAC,eAAA,EAAiB,SAAA,EAAW,qBAAqB,CAAC,CAAA;AAEtD,IAAA,MAAM,kBAAA,GAAqBA,WAAAA,CAAY,CAAC,UAAA,KAAuB;AAC7D,MAAA,kBAAA,CAAmB,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,CAAC,UAAU,GAAG,MAAK,CAAE,CAAA;AAC5D,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAM,WAAW,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,UAAU,CAAA;AACxD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,QAAA,EAAU,cAAA,CAAe,UAAU,CAAC,CAAA;AACtE,UAAA,iBAAA,CAAkB,CAAA,IAAA,KAAQ;AACxB,YAAA,IAAI,GAAA,SAAY,EAAE,GAAG,MAAM,CAAC,UAAU,GAAG,GAAA,EAAI;AAC7C,YAAA,MAAM,EAAE,CAAC,UAAU,GAAG,CAAA,EAAG,GAAG,MAAK,GAAI,IAAA;AACrC,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF,GAAG,CAAC,cAAA,EAAgB,SAAA,EAAW,cAAA,EAAgB,qBAAqB,CAAC,CAAA;AAErE,IAAA,MAAM,YAAA,GAAeA,WAAAA,CAAY,CAAC,CAAA,KAAuB;AACvD,MAAA,CAAA,CAAE,cAAA,EAAe;AAGjB,MAAA,MAAM,oBAA6C,EAAC;AACpD,MAAA,KAAA,MAAW,CAAA,IAAK,aAAA,EAAe,iBAAA,CAAkB,CAAA,CAAE,IAAI,CAAA,GAAI,IAAA;AAC3D,MAAA,iBAAA,CAAkB,iBAAiB,CAAA;AAEnC,MAAA,MAAM,cAAuC,EAAC;AAC9C,MAAA,KAAA,MAAW,CAAA,IAAK,SAAA,EAAW,WAAA,CAAY,CAAA,CAAE,EAAE,CAAA,GAAI,IAAA;AAC/C,MAAA,kBAAA,CAAmB,WAAW,CAAA;AAE9B,MAAA,MAAM,eAAe,mBAAA,EAAoB;AACzC,MAAA,MAAM,iBAAiB,oBAAA,EAAqB;AAE5C,MAAA,IAAI,gBAAgB,cAAA,EAAgB;AAClC,QAAA,QAAA,CAAS,aAAa,CAAA;AAAA,MACxB;AAAA,IACF,CAAA,EAAG,CAAC,aAAA,EAAe,SAAA,EAAW,qBAAqB,oBAAA,EAAsB,QAAA,EAAU,WAAW,CAAC,CAAA;AAI/F,IAAAM,mBAAAA,CAAoB,KAAK,OAAO;AAAA,MAC9B,OAAO,MAAM;AACX,QAAA,YAAA,CAAa,EAAE,CAAA;AACf,QAAA,WAAA,CAAY,EAAE,CAAA;AACd,QAAA,aAAA,CAAc,EAAE,CAAA;AAChB,QAAA,gBAAA,CAAiB,EAAE,CAAA;AACnB,QAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,QAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,QAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,QAAA,kBAAA,CAAmB,EAAE,CAAA;AAAA,MACvB,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,IAAA,KAAS;AACnB,QAAA,IAAI,IAAA,CAAK,SAAA,KAAc,MAAA,EAAW,YAAA,CAAa,KAAK,SAAS,CAAA;AAC7D,QAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,EAAW,WAAA,CAAY,KAAK,QAAQ,CAAA;AAC1D,QAAA,IAAI,IAAA,CAAK,KAAA,KAAU,MAAA,EAAW,aAAA,CAAc,KAAK,KAAK,CAAA;AAAA,MACxD;AAAA,KACF,CAAA,EAAI,EAAE,CAAA;AAIN,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,YAAA,EAAc,WAAW,YAAA,IAAgB,MAAA;AAAA,MACzC,KAAA,EAAO,WAAW,KAAA,IAAS,gCAAA;AAAA,MAC3B,OAAA,EAAS,WAAW,OAAA,IAAW,4CAAA;AAAA,MAC/B,KAAA,EAAO,WAAW,KAAA,IAAS,4CAAA;AAAA,MAC3B,UAAA,EAAY,WAAW,UAAA,IAAc,gBAAA;AAAA,MACrC,QAAA,EAAU,WAAW,QAAA,IAAY,sCAAA;AAAA,MACjC,QAAA,EAAU,WAAW,QAAA,IAAY,4BAAA;AAAA,MACjC,SAAA,EAAW,WAAW,SAAA,IAAa,2BAAA;AAAA,MACnC,MAAA,EAAQ,WAAW,MAAA,IAAU;AAAA,KAC/B;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,QAAA,KACpB,QAAA,GAAWH,GAAAA,CAAG,OAAO,KAAA,EAAO,MAAA,CAAO,UAAU,CAAA,GAAI,MAAA,CAAO,KAAA;AAI1D,IAAA,MAAM,qBAAqB,CAAC,IAAA,EAAc,KAAA,EAAe,KAAA,EAAe,OAAO,MAAA,KAAW;AACxF,MAAA,MAAM,OAAA,GAAU,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACjC,MAAA,MAAM,OAAA,GAAU,GAAG,OAAO,CAAA,MAAA,CAAA;AAC1B,MAAA,MAAM,UAAA,GAAa,iBAAiB,IAAI,CAAA;AACxC,MAAA,MAAM,UAAA,GAAa,iBAAiB,IAAI,CAAA;AACxC,MAAA,MAAM,QAAQ,cAAA,CAAe,IAAI,CAAA,GAAI,aAAA,CAAc,IAAI,CAAA,GAAI,MAAA;AAC3D,MAAA,MAAM,QAAA,GAAW,CAAC,CAAC,KAAA;AAEnB,MAAA,uBACEF,IAAAA,CAAC,KAAA,EAAA,EAAe,SAAA,EAAW,OAAO,YAAA,EAChC,QAAA,EAAA;AAAA,wBAAAA,KAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UACA,UAAA,oBAAcC,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mBAAA,EAAoB,aAAA,EAAY,QAAO,QAAA,EAAA,GAAA,EAAC;AAAA,SAAA,EACzE,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,OAAA;AAAA,YACJ,IAAA;AAAA,YACA,IAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA,EAAU,UAAA;AAAA,YACV,UAAU,CAAC,CAAA,KAAM,oBAAoB,IAAA,EAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACzD,MAAA,EAAQ,MAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,KAAS,cAAc,SAAA,GAAY,IAAA,KAAS,UAAA,GAAa,QAAA,GAAW,UAAU,CAAA;AAAA,YACpH,WAAWC,GAAAA,CAAG,YAAA,CAAa,QAAQ,CAAA,EAAG,UAAA,GAAa,kCAAkC,EAAE,CAAA;AAAA,YACvF,cAAA,EAAc,WAAW,MAAA,GAAS,OAAA;AAAA,YAClC,kBAAA,EAAkB,WAAW,OAAA,GAAU,MAAA;AAAA,YACvC,eAAA,EAAe,aAAa,MAAA,GAAS;AAAA;AAAA,SACvC;AAAA,QACC,QAAA,oBACCD,GAAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,IAAA,EAAK,OAAA,EAAS,QAAA,EAAA,KAAA,EAAM;AAAA,OAAA,EAAA,EAnB3D,IAqBV,CAAA;AAAA,IAEJ,CAAA;AAIA,IAAA,MAAM,mBAAA,GAAsB,CAAC,QAAA,KAAuB;AAClD,MAAA,MAAM,OAAA,GAAU,CAAA,EAAG,MAAM,CAAA,GAAA,EAAM,SAAS,EAAE,CAAA,CAAA;AAC1C,MAAA,MAAM,OAAA,GAAU,GAAG,OAAO,CAAA,MAAA,CAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,QAAA,CAAS,EAAE,CAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,gBAAgB,QAAA,CAAS,EAAE,IAAI,cAAA,CAAe,QAAA,CAAS,EAAE,CAAA,GAAI,MAAA;AAC3E,MAAA,MAAM,QAAA,GAAW,CAAC,CAAC,KAAA;AAEnB,MAAA,MAAM,SAAA,GAAY;AAAA,QAChB,cAAA,EAAgB,WAAW,IAAA,GAAgB,MAAA;AAAA,QAC3C,kBAAA,EAAoB,WAAW,OAAA,GAAU,MAAA;AAAA,QACzC,eAAA,EAAiB,SAAS,QAAA,IAAY;AAAA,OACxC;AAEA,MAAA,QAAQ,SAAS,WAAA;AAAa,QAC5B,KAAK,SAAA;AACH,UAAA,uBACEA,IAAC,IAAA,EAAA,EAAqB,SAAA,EAAW,OAAO,OAAA,EACrC,QAAA,EAAA,QAAA,CAAS,IAAA,EAAA,EADH,QAAA,CAAS,EAElB,CAAA;AAAA,QAGJ,KAAK,YAAA;AACH,UAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,KAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,IAAA;AAAA,cACT,QAAA,CAAS,4BAAYC,GAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC;AAAA,aAAA,EAChF,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,OAAA;AAAA,gBACJ,IAAA,EAAK,MAAA;AAAA,gBACL,OAAQ,KAAA,IAAoB,EAAA;AAAA,gBAC5B,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,SAAS,EAAA,EAAI,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACjE,MAAA,EAAQ,MAAM,kBAAA,CAAmB,QAAA,CAAS,EAAE,CAAA;AAAA,gBAC5C,WAAA,EAAa,SAAS,QAAA,EAAU,WAAA;AAAA,gBAChC,SAAA,EAAW,aAAa,QAAQ,CAAA;AAAA,gBAC/B,GAAG;AAAA;AAAA,aACN;AAAA,YACC,QAAA,CAAS,6BAAaA,GAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,IAAA,EAAK,OAAA,EAAS,QAAA,EAAA,KAAA,EAAM;AAAA,WAAA,EAAA,EAhBtE,SAAS,EAiBnB,CAAA;AAAA,QAGJ,KAAK,WAAA;AACH,UAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,KAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,IAAA;AAAA,cACT,QAAA,CAAS,4BAAYC,GAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC;AAAA,aAAA,EAChF,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,OAAA;AAAA,gBACJ,OAAQ,KAAA,IAAoB,EAAA;AAAA,gBAC5B,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,SAAS,EAAA,EAAI,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACjE,MAAA,EAAQ,MAAM,kBAAA,CAAmB,QAAA,CAAS,EAAE,CAAA;AAAA,gBAC5C,WAAA,EAAa,SAAS,QAAA,EAAU,WAAA;AAAA,gBAChC,IAAA,EAAM,CAAA;AAAA,gBACN,SAAA,EAAW,aAAa,QAAQ,CAAA;AAAA,gBAC/B,GAAG;AAAA;AAAA,aACN;AAAA,YACC,QAAA,CAAS,6BAAaA,GAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,IAAA,EAAK,OAAA,EAAS,QAAA,EAAA,KAAA,EAAM;AAAA,WAAA,EAAA,EAhBtE,SAAS,EAiBnB,CAAA;AAAA,QAGJ,KAAK,QAAA;AACH,UAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,KAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,IAAA;AAAA,cACT,QAAA,CAAS,4BAAYC,GAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC;AAAA,aAAA,EAChF,CAAA;AAAA,4BACAD,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,OAAA;AAAA,gBACJ,OAAQ,KAAA,IAA6B,EAAA;AAAA,gBACrC,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,SAAS,EAAA,EAAI,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACjE,MAAA,EAAQ,MAAM,kBAAA,CAAmB,QAAA,CAAS,EAAE,CAAA;AAAA,gBAC5C,SAAA,EAAW,aAAa,QAAQ,CAAA;AAAA,gBAC/B,GAAG,SAAA;AAAA,gBAEJ,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,kBAChC,QAAA,CAAS,OAAA,EAAS,GAAA,CAAI,CAAC,2BACtBA,GAAAA,CAAC,QAAA,EAAA,EAAuB,KAAA,EAAO,OAAO,EAAA,EACnC,QAAA,EAAA,MAAA,CAAO,IAAA,EAAA,EADG,MAAA,CAAO,EAEpB,CACD;AAAA;AAAA;AAAA,aACH;AAAA,YACC,QAAA,CAAS,6BAAaA,GAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,IAAA,EAAK,OAAA,EAAS,QAAA,EAAA,KAAA,EAAM;AAAA,WAAA,EAAA,EArBtE,SAAS,EAsBnB,CAAA;AAAA,QAGJ,KAAK,QAAA;AACH,UAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,KAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,IAAA;AAAA,cACT,QAAA,CAAS,4BAAYC,GAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC;AAAA,aAAA,EAChF,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,OAAA;AAAA,gBACJ,IAAA,EAAK,QAAA;AAAA,gBACL,OAAQ,KAAA,IAAoB,EAAA;AAAA,gBAC5B,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,SAAS,EAAA,EAAI,CAAA,CAAE,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,IAAI,EAAE,CAAA;AAAA,gBAC/F,MAAA,EAAQ,MAAM,kBAAA,CAAmB,QAAA,CAAS,EAAE,CAAA;AAAA,gBAC5C,GAAA,EAAK,SAAS,QAAA,EAAU,GAAA;AAAA,gBACxB,GAAA,EAAK,SAAS,QAAA,EAAU,GAAA;AAAA,gBACxB,WAAA,EAAa,SAAS,QAAA,EAAU,WAAA;AAAA,gBAChC,SAAA,EAAW,aAAa,QAAQ,CAAA;AAAA,gBAC/B,GAAG;AAAA;AAAA,aACN;AAAA,YACC,QAAA,CAAS,6BAAaA,GAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,IAAA,EAAK,OAAA,EAAS,QAAA,EAAA,KAAA,EAAM;AAAA,WAAA,EAAA,EAlBtE,SAAS,EAmBnB,CAAA;AAAA,QAGJ,KAAK,MAAA;AACH,UAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,KAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,IAAA;AAAA,cACT,QAAA,CAAS,4BAAYC,GAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC;AAAA,aAAA,EAChF,CAAA;AAAA,4BACAA,GAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI,OAAA;AAAA,gBACJ,IAAA,EAAK,MAAA;AAAA,gBACL,OAAQ,KAAA,IAAoB,EAAA;AAAA,gBAC5B,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,SAAS,EAAA,EAAI,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACjE,MAAA,EAAQ,MAAM,kBAAA,CAAmB,QAAA,CAAS,EAAE,CAAA;AAAA,gBAC5C,SAAA,EAAW,aAAa,QAAQ,CAAA;AAAA,gBAC/B,GAAG;AAAA;AAAA,aACN;AAAA,YACC,QAAA,CAAS,6BAAaA,GAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,IAAA,EAAK,OAAA,EAAS,QAAA,EAAA,KAAA,EAAM;AAAA,WAAA,EAAA,EAftE,SAAS,EAgBnB,CAAA;AAAA,QAGJ,KAAK,OAAA;AACH,UAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,GAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAI,OAAA;AAAA,kBACJ,IAAA,EAAK,UAAA;AAAA,kBACL,OAAA,EAAS,CAAC,CAAC,KAAA;AAAA,kBACX,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,SAAS,EAAA,EAAI,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,kBACnE,MAAA,EAAQ,MAAM,kBAAA,CAAmB,QAAA,CAAS,EAAE,CAAA;AAAA,kBAC5C,WAAW,MAAA,CAAO,QAAA;AAAA,kBACjB,GAAG;AAAA;AAAA,eACN;AAAA,8BACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,WAAU,SAAA,EAChC,QAAA,EAAA;AAAA,gBAAA,QAAA,CAAS,IAAA;AAAA,gBACT,QAAA,CAAS,4BAAYC,GAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC;AAAA,eAAA,EAChF;AAAA,aAAA,EACF,CAAA;AAAA,YACC,QAAA,CAAS,6BAAaA,GAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,GAAAA,CAAC,GAAA,EAAA,EAAE,EAAA,EAAI,OAAA,EAAS,SAAA,EAAW,MAAA,CAAO,SAAA,EAAW,IAAA,EAAK,OAAA,EAAS,QAAA,EAAA,KAAA,EAAM;AAAA,WAAA,EAAA,EAjBtE,SAAS,EAkBnB,CAAA;AAAA,QAGJ;AACE,UAAA,OAAO,IAAA;AAAA;AACX,IACF,CAAA;AAEA,IAAA,uBACED,IAAAA,CAAC,MAAA,EAAA,EAAK,UAAU,YAAA,EAAc,SAAA,EAAsB,YAAU,IAAA,EAC3D,QAAA,EAAA;AAAA,MAAA,kBAAA,CAAmB,WAAA,EAAa,cAAc,SAAS,CAAA;AAAA,MACvD,kBAAA,CAAmB,UAAA,EAAY,WAAA,EAAa,QAAQ,CAAA;AAAA,MACpD,kBAAA,CAAmB,OAAA,EAAS,OAAA,EAAS,UAAA,EAAY,OAAO,CAAA;AAAA,MACxD,SAAA,CAAU,IAAI,mBAAmB,CAAA;AAAA,sBAClCC,IAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAW,MAAA,CAAO,QACrC,QAAA,EAAA,WAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACF;AAEA,kBAAA,CAAmB,WAAA,GAAc,oBAAA","file":"index.mjs","sourcesContent":["import React, { useState, useEffect, useCallback } from 'react';\nimport type { Question, FormValues, FormErrors, BookingFormProps, BookingFormClassNames } from '../types';\n\n/** Merge base classes with optional custom classes */\nconst cx = (...classes: (string | undefined)[]) => classes.filter(Boolean).join(' ');\n\n/**\n * Renders a single form field based on question type\n */\nfunction FormField({\n question,\n value,\n error,\n onChange,\n classNames,\n}: {\n question: Question;\n value: string | number | boolean | undefined;\n error?: string;\n onChange: (value: string | number | boolean) => void;\n classNames?: BookingFormClassNames;\n}) {\n const inputId = `question-${question.id}`;\n const errorId = `${inputId}-error`;\n const hasError = !!error;\n\n // Default classes (can be overridden via classNames prop)\n const defaultFieldWrapper = 'mb-4';\n const defaultLabel = 'block text-sm font-medium mb-1 text-gray-700';\n const defaultHeading = 'text-lg font-semibold text-gray-900 mt-4 mb-2 first:mt-0';\n const defaultInput = 'w-full px-3 py-2 border rounded-md text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-offset-1 border-gray-300 focus:ring-blue-500 focus:border-blue-500';\n const defaultInputError = 'border-red-500 focus:ring-red-500';\n const defaultCheckbox = 'mt-1 h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500';\n const defaultHelpText = 'mt-1 text-xs text-gray-500';\n const defaultErrorText = 'mt-1 text-xs text-red-600';\n\n const inputClasses = hasError\n ? cx(classNames?.input ?? defaultInput, classNames?.inputError ?? defaultInputError)\n : cx(classNames?.input ?? defaultInput);\n\n const labelClasses = classNames?.label ?? defaultLabel;\n const checkboxLabelClasses = cx('text-sm', classNames?.label ?? 'text-gray-700');\n\n const renderLabel = () => {\n if (question.detail_type === 'heading') return null;\n return (\n <label htmlFor={inputId} className={labelClasses}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n );\n };\n\n const renderHelpText = () => {\n if (!question.help_text) return null;\n return <p className={classNames?.helpText ?? defaultHelpText}>{question.help_text}</p>;\n };\n\n const renderError = () => {\n if (!error) return null;\n return (\n <p id={errorId} className={classNames?.errorText ?? defaultErrorText} role=\"alert\">\n {error}\n </p>\n );\n };\n\n const ariaProps = {\n 'aria-invalid': hasError ? true : undefined,\n 'aria-describedby': hasError ? errorId : undefined,\n 'aria-required': question.required || undefined,\n };\n\n switch (question.detail_type) {\n case 'heading':\n return (\n <h3 className={classNames?.heading ?? defaultHeading}>\n {question.name}\n </h3>\n );\n\n case 'text_field':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={question.settings?.placeholder}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'text_area':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <textarea\n id={inputId}\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={question.settings?.placeholder}\n rows={4}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'select':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <select\n id={inputId}\n value={(value as string | number) ?? ''}\n onChange={(e) => onChange(e.target.value)}\n className={inputClasses}\n {...ariaProps}\n >\n <option value=\"\">Select an option</option>\n {question.options?.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'date':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"date\"\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n min={question.settings?.min?.toString()}\n max={question.settings?.max?.toString()}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'number':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"number\"\n value={(value as number) ?? ''}\n onChange={(e) => onChange(e.target.value ? Number(e.target.value) : '')}\n min={question.settings?.min}\n max={question.settings?.max}\n placeholder={question.settings?.placeholder}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'check':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n <div className=\"flex items-start gap-2\">\n <input\n id={inputId}\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n className={classNames?.checkbox ?? defaultCheckbox}\n {...ariaProps}\n />\n <label htmlFor={inputId} className={checkboxLabelClasses}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n </div>\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n default:\n return null;\n }\n}\n\n/**\n * BookingForm - A dynamic form component for booking questions\n *\n * @example\n * ```tsx\n * const questions: Question[] = [\n * { id: 1, name: 'Personal Details', detail_type: 'heading' },\n * { id: 2, name: 'Full Name', detail_type: 'text_field', required: true },\n * { id: 3, name: 'Email', detail_type: 'text_field', required: true },\n * ];\n *\n * <BookingForm\n * questions={questions}\n * onSubmit={(values) => console.log(values)}\n * />\n * ```\n */\nexport function BookingForm({\n questions,\n onSubmit,\n submitLabel = 'Submit',\n className = '',\n labelClassName,\n classNames: classNamesProp,\n}: BookingFormProps) {\n // Merge deprecated labelClassName into classNames for backwards compatibility\n const classNames: BookingFormClassNames = {\n ...classNamesProp,\n label: classNamesProp?.label ?? labelClassName,\n };\n const [values, setValues] = useState<FormValues>({});\n const [errors, setErrors] = useState<FormErrors>({});\n const [touched, setTouched] = useState<Record<number, boolean>>({});\n\n\n // Check if a question should be visible based on conditional settings\n const isQuestionVisible = useCallback(\n (question: Question): boolean => {\n const { settings } = question;\n if (!settings?.conditional_answers) {\n return true;\n }\n\n // Check all conditions in conditional_answers\n // Each entry is { questionId: expectedAnswerValue }\n const conditionEntries = Object.entries(settings.conditional_answers as Record<string, unknown>);\n if (conditionEntries.length === 0) {\n return true;\n }\n\n // Question is visible if ANY condition is met\n return conditionEntries.some(([questionIdStr, expectedAnswer]) => {\n const questionId = Number(questionIdStr);\n const currentValue = (values as Record<string, unknown>)[String(questionId)];\n\n if (currentValue === undefined || currentValue === '' || currentValue === null) {\n return false;\n }\n\n // Selects typically store the option id (as string), but allow `{ id, name }` objects too\n const normalizedCurrent =\n typeof currentValue === 'object' && currentValue !== null && 'id' in (currentValue as any)\n ? (currentValue as any)\n : currentValue;\n\n // Build a set of candidate strings for comparison.\n // For select questions we support matching by BOTH option id and option name.\n const candidates = new Set<string>();\n\n const addCandidate = (v: unknown) => {\n if (v === undefined || v === null) return;\n const s = String(v).trim();\n if (s) candidates.add(s);\n };\n\n const sourceQuestion = questions.find((q) => q.id === questionId);\n\n if (typeof normalizedCurrent === 'object' && normalizedCurrent !== null) {\n addCandidate((normalizedCurrent as any).id);\n addCandidate((normalizedCurrent as any).name);\n } else {\n addCandidate(normalizedCurrent);\n }\n\n if (sourceQuestion?.detail_type === 'select' && sourceQuestion.options?.length) {\n // Try to resolve the selected option via id or name.\n const currentStr = [...candidates][0] ?? '';\n const optionById = sourceQuestion.options.find((o) => String(o.id) === currentStr);\n const optionByName = sourceQuestion.options.find((o) => String(o.name).trim() === currentStr);\n const opt = optionById ?? optionByName;\n if (opt) {\n addCandidate(opt.id);\n addCandidate(opt.name);\n }\n }\n\n const matchesScalar = (expected: unknown) => {\n const expectedStr = String(expected).trim();\n return candidates.has(expectedStr);\n };\n\n // Support multiple expected formats:\n // - scalar: \"Consultation\" / \"1\" / 1 / true\n // - array: [\"Consultation\", \"Follow-up\"]\n // - map/object: { \"Consultation\": true }\n if (Array.isArray(expectedAnswer)) {\n return expectedAnswer.some((v) => matchesScalar(v));\n }\n\n if (expectedAnswer && typeof expectedAnswer === 'object') {\n const expectedMap = expectedAnswer as Record<string, unknown>;\n for (const c of candidates) {\n if (Object.prototype.hasOwnProperty.call(expectedMap, c)) {\n const flag = expectedMap[c];\n return flag === undefined ? true : !!flag;\n }\n }\n return false;\n }\n\n return matchesScalar(expectedAnswer);\n });\n },\n [values, questions]\n );\n\n // Get visible questions\n const visibleQuestions = questions.filter(isQuestionVisible);\n\n\n // Validate a single field\n const validateField = useCallback((question: Question, value: FormValues[number]): string | null => {\n if (question.detail_type === 'heading') return null;\n\n if (question.required) {\n if (value === undefined || value === '' || value === null) {\n return `${question.name} is required`;\n }\n if (question.detail_type === 'check' && !value) {\n return `${question.name} must be checked`;\n }\n }\n\n if (question.detail_type === 'number' && value !== '' && value !== undefined) {\n const numValue = Number(value);\n if (question.settings?.min !== undefined && numValue < question.settings.min) {\n return `Minimum value is ${question.settings.min}`;\n }\n if (question.settings?.max !== undefined && numValue > question.settings.max) {\n return `Maximum value is ${question.settings.max}`;\n }\n }\n\n return null;\n }, []);\n\n // Validate all visible fields\n const validateAll = useCallback((): boolean => {\n const newErrors: FormErrors = {};\n let isValid = true;\n\n visibleQuestions.forEach((question) => {\n const error = validateField(question, values[question.id]);\n if (error) {\n newErrors[question.id] = error;\n isValid = false;\n }\n });\n\n setErrors(newErrors);\n return isValid;\n }, [visibleQuestions, values, validateField]);\n\n // Clear errors for hidden questions\n useEffect(() => {\n const visibleIds = new Set(visibleQuestions.map((q) => q.id));\n\n setErrors((prev) => {\n let changed = false;\n const next = { ...prev };\n\n Object.keys(next).forEach((idStr) => {\n const id = Number(idStr);\n if (!visibleIds.has(id)) {\n delete next[id];\n changed = true;\n }\n });\n\n return changed ? next : prev;\n });\n }, [visibleQuestions]);\n\n const handleChange = (questionId: number, value: string | number | boolean) => {\n setValues((prev) => ({ ...prev, [questionId]: value }));\n setTouched((prev) => ({ ...prev, [questionId]: true }));\n\n // Clear error on change if touched\n if (touched[questionId]) {\n const question = questions.find((q) => q.id === questionId);\n if (question) {\n const error = validateField(question, value);\n setErrors((prev) => {\n if (error) {\n return { ...prev, [questionId]: error };\n }\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all fields as touched\n const allTouched: Record<number, boolean> = {};\n visibleQuestions.forEach((q) => {\n allTouched[q.id] = true;\n });\n setTouched(allTouched);\n\n if (validateAll()) {\n // Only include visible question values\n const visibleValues: FormValues = {};\n visibleQuestions.forEach((q) => {\n if (q.detail_type !== 'heading' && values[q.id] !== undefined) {\n visibleValues[q.id] = values[q.id];\n }\n });\n onSubmit(visibleValues);\n }\n };\n\n const defaultButton = 'w-full mt-4 px-4 py-2 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors';\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {visibleQuestions.map((question) => (\n <FormField\n key={question.id}\n question={question}\n value={values[question.id]}\n error={touched[question.id] ? errors[question.id] : undefined}\n onChange={(value) => handleChange(question.id, value)}\n classNames={classNames}\n />\n ))}\n <button\n type=\"submit\"\n className={classNames?.button ?? defaultButton}\n >\n {submitLabel}\n </button>\n </form>\n );\n}\n\nexport default BookingForm;\n","/**\n * Validation helper functions for form fields\n * Each validator returns an error message string if invalid, or null if valid\n */\n\n/**\n * Validates that a value is not empty\n */\nexport function required(value: string): string | null {\n if (!value || value.trim() === '') {\n return 'This field is required';\n }\n return null;\n}\n\n/**\n * Validates email format (RFC 5322 compliant)\n */\nexport function email(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n const emailRegex = /^[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 if (!emailRegex.test(value)) {\n return 'Please enter a valid email address';\n }\n return null;\n}\n\n/**\n * Validates phone number format (international)\n * Accepts formats like: +44 1234 567890, 01onal234 567890, +1-234-567-8900\n */\nexport function phone(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n // Remove all spaces, dashes, and parentheses for validation\n const cleaned = value.replace(/[\\s\\-\\(\\)]/g, '');\n \n // Check for valid phone format: optional + followed by 7-15 digits\n const phoneRegex = /^\\+?[0-9]{7,15}$/;\n \n if (!phoneRegex.test(cleaned)) {\n return 'Please enter a valid phone number';\n }\n return null;\n}\n\n/**\n * Validates UK postcode format\n * Accepts formats like: SW1A 1AA, SW1A1AA, M1 1AA, B33 8TH\n */\nexport function ukPostcode(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n // UK postcode regex - covers all valid formats\n const postcodeRegex = /^([A-Z]{1,2}[0-9][A-Z0-9]? ?[0-9][A-Z]{2})$/i;\n \n if (!postcodeRegex.test(value.trim())) {\n return 'Please enter a valid UK postcode';\n }\n return null;\n}\n\n/**\n * Creates a minimum length validator\n * @param min - Minimum number of characters required\n */\nexport function minLen(min: number): (value: string) => string | null {\n return (value: string) => {\n if (!value) return null; // Let required handle empty values\n \n if (value.trim().length < min) {\n return `Must be at least ${min} character${min === 1 ? '' : 's'}`;\n }\n return null;\n };\n}\n\n/**\n * Combines multiple validators into one\n * Returns the first error encountered, or null if all pass\n */\nexport function compose(\n ...validators: Array<(value: string) => string | null>\n): (value: string) => string | null {\n return (value: string) => {\n for (const validator of validators) {\n const error = validator(value);\n if (error) return error;\n }\n return null;\n };\n}\n","import React, {\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n useId,\n} from 'react';\nimport type {\n FieldConfig,\n RegistrationFormProps,\n RegistrationFormRef,\n RegistrationFormValues,\n RegistrationFormErrors,\n} from '../types/registration';\nimport { required, email, phone, ukPostcode, compose } from '../utils/validators';\n\n/**\n * Default field configuration for the registration form\n */\nconst DEFAULT_FIELDS: FieldConfig[] = [\n {\n name: 'firstName',\n label: 'First name',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'lastName',\n label: 'Last name',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'email',\n label: 'Email address',\n type: 'email',\n required: true,\n validate: compose(required, email),\n },\n {\n name: 'password',\n label: 'Password',\n type: 'password',\n required: false,\n },\n {\n name: 'phone',\n label: 'Contact number',\n type: 'tel',\n required: false,\n validate: phone,\n },\n {\n name: 'address1',\n label: 'Address 1',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'address2',\n label: 'Address 2',\n type: 'text',\n required: false,\n },\n {\n name: 'city',\n label: 'Town/City',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'postcode',\n label: 'Postcode',\n type: 'text',\n required: true,\n validate: compose(required, ukPostcode),\n },\n];\n\n/**\n * A reusable, accessible registration form component.\n * \n * Features:\n * - Customizable fields via props\n * - Built-in validation with blur and submit triggers\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Imperative handle for programmatic control (reset, setValues)\n * - Granular styling via classNames prop\n * \n * @example\n * ```tsx\n * const formRef = useRef<RegistrationFormRef>(null);\n * \n * <RegistrationForm\n * ref={formRef}\n * onSubmit={(values) => console.log(values)}\n * onChange={(values, isValid) => console.log(isValid)}\n * submitLabel=\"Register\"\n * />\n * \n * // Programmatic control\n * formRef.current?.reset();\n * formRef.current?.setValues({ email: 'test@example.com' });\n * ```\n */\nexport const RegistrationForm = forwardRef<RegistrationFormRef, RegistrationFormProps>(\n (\n {\n fields = DEFAULT_FIELDS,\n additionalFields,\n onSubmit,\n onChange,\n validateOnBlur = true,\n submitLabel = 'Submit',\n className = '',\n classNames = {},\n },\n ref\n ) => {\n const formId = useId();\n const [values, setValues] = useState<RegistrationFormValues>({});\n const [errors, setErrors] = useState<RegistrationFormErrors>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n // Merge fields with additional fields\n const allFields = additionalFields ? [...fields, ...additionalFields] : fields;\n\n /**\n * Validate a single field\n */\n const validateField = useCallback(\n (field: FieldConfig, value: string): string | null => {\n // Check required first\n if (field.required && (!value || value.trim() === '')) {\n return 'This field is required';\n }\n // Run custom validator if value is present\n if (field.validate && value) {\n return field.validate(value);\n }\n return null;\n },\n []\n );\n\n /**\n * Validate all fields and return whether form is valid\n */\n const validateAll = useCallback((): boolean => {\n const newErrors: RegistrationFormErrors = {};\n let isValid = true;\n\n for (const field of allFields) {\n const value = values[field.name] || '';\n const error = validateField(field, value);\n if (error) {\n newErrors[field.name] = error;\n isValid = false;\n }\n }\n\n setErrors(newErrors);\n return isValid;\n }, [allFields, values, validateField]);\n\n /**\n * Check if current form state is valid (without updating errors)\n */\n const checkIsValid = useCallback(\n (currentValues: RegistrationFormValues): boolean => {\n for (const field of allFields) {\n const value = currentValues[field.name] || '';\n const error = validateField(field, value);\n if (error) return false;\n }\n return true;\n },\n [allFields, validateField]\n );\n\n /**\n * Handle input change\n */\n const handleChange = useCallback(\n (fieldName: string, value: string) => {\n const newValues = { ...values, [fieldName]: value };\n setValues(newValues);\n\n // Clear error if field was touched and is now valid\n if (touched[fieldName]) {\n const field = allFields.find((f) => f.name === fieldName);\n if (field) {\n const error = validateField(field, value);\n if (!error) {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[fieldName];\n return next;\n });\n }\n }\n }\n\n // Call onChange callback\n if (onChange) {\n const isValid = checkIsValid(newValues);\n onChange(newValues, isValid);\n }\n },\n [values, touched, allFields, validateField, onChange, checkIsValid]\n );\n\n /**\n * Handle input blur\n */\n const handleBlur = useCallback(\n (fieldName: string) => {\n setTouched((prev) => ({ ...prev, [fieldName]: true }));\n\n if (validateOnBlur) {\n const field = allFields.find((f) => f.name === fieldName);\n if (field) {\n const value = values[fieldName] || '';\n const error = validateField(field, value);\n if (error) {\n setErrors((prev) => ({ ...prev, [fieldName]: error }));\n } else {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[fieldName];\n return next;\n });\n }\n }\n }\n },\n [validateOnBlur, allFields, values, validateField]\n );\n\n /**\n * Handle form submission\n */\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all fields as touched\n const allTouched: Record<string, boolean> = {};\n for (const field of allFields) {\n allTouched[field.name] = true;\n }\n setTouched(allTouched);\n\n // Validate all and submit if valid\n if (validateAll()) {\n onSubmit(values);\n }\n },\n [allFields, validateAll, onSubmit, values]\n );\n\n /**\n * Expose imperative methods via ref\n */\n useImperativeHandle(\n ref,\n () => ({\n reset: () => {\n setValues({});\n setErrors({});\n setTouched({});\n },\n setValues: (newValues: Partial<RegistrationFormValues>) => {\n setValues((prev) => {\n const merged = { ...prev };\n for (const [key, value] of Object.entries(newValues)) {\n if (value !== undefined) {\n merged[key] = value;\n }\n }\n return merged;\n });\n },\n }),\n []\n );\n\n // Default styles\n const styles = {\n fieldWrapper: classNames.fieldWrapper || 'mb-4',\n label: classNames.label || 'block text-sm font-medium mb-1',\n input: classNames.input || 'w-full px-3 py-2 border rounded-md',\n inputError: classNames.inputError || 'border-red-500',\n errorText: classNames.errorText || 'mt-1 text-xs text-red-600',\n button:\n classNames.button ||\n 'w-full mt-4 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50',\n };\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {allFields.map((field) => {\n const fieldId = `${formId}-${field.name}`;\n const errorId = `${fieldId}-error`;\n const value = values[field.name] || '';\n const error = errors[field.name];\n const isTouched = touched[field.name];\n const showError = isTouched && error;\n\n return (\n <div key={field.name} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {field.label}\n {field.required && (\n <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n {field.type === 'select' && field.options ? (\n <select\n id={fieldId}\n name={field.name}\n value={value}\n onChange={(e) => handleChange(field.name, e.target.value)}\n onBlur={() => handleBlur(field.name)}\n className={`${styles.input} ${showError ? styles.inputError : ''}`}\n aria-invalid={showError ? 'true' : 'false'}\n aria-describedby={showError ? errorId : undefined}\n aria-required={field.required ? 'true' : 'false'}\n >\n <option value=\"\">{field.placeholder || 'Select an option'}</option>\n {field.options.map((option) => (\n <option key={option.id} value={String(option.id)}>\n {option.name}\n {option.price !== undefined && option.price > 0 ? ` (+£${option.price})` : ''}\n </option>\n ))}\n </select>\n ) : (\n <input\n id={fieldId}\n name={field.name}\n type={field.type === 'select' ? 'text' : field.type}\n value={value}\n onChange={(e) => handleChange(field.name, e.target.value)}\n onBlur={() => handleBlur(field.name)}\n placeholder={field.placeholder}\n className={`${styles.input} ${showError ? styles.inputError : ''}`}\n aria-invalid={showError ? 'true' : 'false'}\n aria-describedby={showError ? errorId : undefined}\n aria-required={field.required ? 'true' : 'false'}\n />\n )}\n {showError && (\n <p id={errorId} className={styles.errorText} role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n })}\n <button type=\"submit\" className={styles.button}>\n {submitLabel}\n </button>\n </form>\n );\n }\n);\n\nRegistrationForm.displayName = 'RegistrationForm';\n","import React, {\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n useId,\n} from 'react';\nimport type { Question, QuestionOption, FormValues, FormErrors } from '../types';\nimport type {\n ContactDetailsFormProps,\n ContactDetailsFormRef,\n ContactDetailsValues,\n ContactDetailsFieldSettings,\n} from '../types/contact-details';\nimport { required, email as emailValidator, compose } from '../utils/validators';\n\n/** Merge base classes with optional custom classes */\nconst cx = (...classes: (string | undefined)[]) => classes.filter(Boolean).join(' ');\n\n/**\n * ContactDetailsForm — collects first name, last name, email and optional\n * dynamic questions. On submit it emits values with `q` and `answers` fields\n * matching the JRNI Update Client / Member API format.\n *\n * @example\n * ```tsx\n * <ContactDetailsForm\n * questions={[\n * { id: 2, name: 'Purpose', detail_type: 'select', required: true,\n * options: [{ id: 5, name: 'School Trip' }, { id: 6, name: 'Corporate' }] },\n * { id: 7, name: 'Group Size', detail_type: 'number', required: true },\n * ]}\n * onSubmit={(values) => console.log(values)}\n * />\n * ```\n */\nexport const ContactDetailsForm = forwardRef<ContactDetailsFormRef, ContactDetailsFormProps>(\n (\n {\n questions = [],\n onSubmit,\n onChange: _onChange,\n validateOnBlur = true,\n submitLabel = 'Submit',\n className = '',\n classNames = {},\n fieldSettings = {},\n },\n ref\n ) => {\n const formId = useId();\n\n // Contact detail fields\n const [firstName, setFirstName] = useState('');\n const [lastName, setLastName] = useState('');\n const [emailValue, setEmailValue] = useState('');\n\n // Contact detail errors\n const [contactErrors, setContactErrors] = useState<Record<string, string>>({});\n const [contactTouched, setContactTouched] = useState<Record<string, boolean>>({});\n\n // Question field values and errors (keyed by question id)\n const [questionValues, setQuestionValues] = useState<FormValues>({});\n const [questionErrors, setQuestionErrors] = useState<FormErrors>({});\n const [questionTouched, setQuestionTouched] = useState<Record<number, boolean>>({});\n\n // ── Resolve per-field settings (default: required=true, disabled=false) ──\n const getFieldRequired = (name: string) => {\n const s = fieldSettings[name as keyof ContactDetailsFieldSettings];\n return s?.required !== undefined ? s.required : true;\n };\n const getFieldDisabled = (name: string) => {\n const s = fieldSettings[name as keyof ContactDetailsFieldSettings];\n return !!s?.disabled;\n };\n\n const contactFields = [\n { name: 'firstName', label: 'First name', value: firstName, setter: setFirstName },\n { name: 'lastName', label: 'Last name', value: lastName, setter: setLastName },\n { name: 'email', label: 'Email', value: emailValue, setter: setEmailValue },\n ] as const;\n\n // ── Validation helpers ──\n\n const validateContactField = useCallback((name: string, value: string): string | null => {\n const isRequired = getFieldRequired(name);\n if (name === 'email') {\n const validators = isRequired ? compose(required, emailValidator) : emailValidator;\n return value ? validators(value) : (isRequired ? required(value) : null);\n }\n return isRequired ? required(value) : null;\n }, [fieldSettings]);\n\n const validateQuestionField = useCallback((question: Question, value: FormValues[number]): string | null => {\n if (question.detail_type === 'heading') return null;\n if (question.required) {\n if (value === undefined || value === '' || value === null) {\n return `${question.name} is required`;\n }\n if (question.detail_type === 'check' && !value) {\n return `${question.name} must be checked`;\n }\n }\n if (question.detail_type === 'number' && value !== '' && value !== undefined) {\n const numValue = Number(value);\n if (question.settings?.min !== undefined && numValue < question.settings.min) {\n return `Minimum value is ${question.settings.min}`;\n }\n if (question.settings?.max !== undefined && numValue > question.settings.max) {\n return `Maximum value is ${question.settings.max}`;\n }\n }\n return null;\n }, []);\n\n const validateAllContacts = useCallback((): boolean => {\n const errs: Record<string, string> = {};\n let valid = true;\n for (const f of contactFields) {\n if (getFieldDisabled(f.name)) continue;\n const err = validateContactField(f.name, f.value);\n if (err) { errs[f.name] = err; valid = false; }\n }\n setContactErrors(errs);\n return valid;\n }, [firstName, lastName, emailValue, validateContactField, fieldSettings]);\n\n const validateAllQuestions = useCallback((): boolean => {\n const errs: FormErrors = {};\n let valid = true;\n for (const q of questions) {\n const err = validateQuestionField(q, questionValues[q.id]);\n if (err) { errs[q.id] = err; valid = false; }\n }\n setQuestionErrors(errs);\n return valid;\n }, [questions, questionValues, validateQuestionField]);\n\n // ── Build output ──\n\n const buildOutput = useCallback((): ContactDetailsValues => {\n const q: ContactDetailsValues['q'] = {};\n const answers: ContactDetailsValues['answers'] = [];\n\n for (const question of questions) {\n if (question.detail_type === 'heading') continue;\n const rawValue = questionValues[question.id];\n if (rawValue === undefined || rawValue === '') continue;\n\n let answer = String(rawValue);\n let answerId = 0;\n\n // For selects, resolve the option\n if (question.detail_type === 'select' && question.options?.length) {\n const option = question.options.find(\n (o: QuestionOption) => String(o.id) === String(rawValue)\n );\n if (option) {\n answer = option.name;\n answerId = typeof option.id === 'number' ? option.id : parseInt(String(option.id), 10) || 0;\n }\n }\n\n const idStr = String(question.id);\n q[idStr] = { answer, answer_id: answerId, name: question.name };\n answers.push({ question_id: question.id, name: question.name, answer, answer_id: answerId });\n }\n\n return { firstName, lastName, email: emailValue, q, answers };\n }, [firstName, lastName, emailValue, questions, questionValues]);\n\n // ── Handlers ──\n\n const handleContactChange = useCallback((name: string, value: string) => {\n const setter = name === 'firstName' ? setFirstName : name === 'lastName' ? setLastName : setEmailValue;\n setter(value);\n\n if (contactTouched[name]) {\n const err = validateContactField(name, value);\n setContactErrors(prev => {\n if (err) return { ...prev, [name]: err };\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n }\n }, [contactTouched, validateContactField]);\n\n const handleContactBlur = useCallback((name: string, value: string) => {\n setContactTouched(prev => ({ ...prev, [name]: true }));\n if (validateOnBlur) {\n const err = validateContactField(name, value);\n setContactErrors(prev => {\n if (err) return { ...prev, [name]: err };\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n }\n }, [validateOnBlur, validateContactField]);\n\n const handleQuestionChange = useCallback((questionId: number, value: string | number | boolean) => {\n setQuestionValues(prev => ({ ...prev, [questionId]: value }));\n setQuestionTouched(prev => ({ ...prev, [questionId]: true }));\n\n if (questionTouched[questionId]) {\n const question = questions.find(q => q.id === questionId);\n if (question) {\n const err = validateQuestionField(question, value);\n setQuestionErrors(prev => {\n if (err) return { ...prev, [questionId]: err };\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n }, [questionTouched, questions, validateQuestionField]);\n\n const handleQuestionBlur = useCallback((questionId: number) => {\n setQuestionTouched(prev => ({ ...prev, [questionId]: true }));\n if (validateOnBlur) {\n const question = questions.find(q => q.id === questionId);\n if (question) {\n const err = validateQuestionField(question, questionValues[questionId]);\n setQuestionErrors(prev => {\n if (err) return { ...prev, [questionId]: err };\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n }, [validateOnBlur, questions, questionValues, validateQuestionField]);\n\n const handleSubmit = useCallback((e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all touched\n const allContactTouched: Record<string, boolean> = {};\n for (const f of contactFields) allContactTouched[f.name] = true;\n setContactTouched(allContactTouched);\n\n const allQTouched: Record<number, boolean> = {};\n for (const q of questions) allQTouched[q.id] = true;\n setQuestionTouched(allQTouched);\n\n const contactValid = validateAllContacts();\n const questionsValid = validateAllQuestions();\n\n if (contactValid && questionsValid) {\n onSubmit(buildOutput());\n }\n }, [contactFields, questions, validateAllContacts, validateAllQuestions, onSubmit, buildOutput]);\n\n // ── Imperative handle ──\n\n useImperativeHandle(ref, () => ({\n reset: () => {\n setFirstName('');\n setLastName('');\n setEmailValue('');\n setContactErrors({});\n setContactTouched({});\n setQuestionValues({});\n setQuestionErrors({});\n setQuestionTouched({});\n },\n setValues: (vals) => {\n if (vals.firstName !== undefined) setFirstName(vals.firstName);\n if (vals.lastName !== undefined) setLastName(vals.lastName);\n if (vals.email !== undefined) setEmailValue(vals.email);\n },\n }), []);\n\n // ── Styles ──\n\n const styles = {\n fieldWrapper: classNames.fieldWrapper || 'mb-4',\n label: classNames.label || 'block text-sm font-medium mb-1',\n heading: classNames.heading || 'text-lg font-semibold mt-4 mb-2 first:mt-0',\n input: classNames.input || 'w-full px-3 py-2 border rounded-md text-sm',\n inputError: classNames.inputError || 'border-red-500',\n checkbox: classNames.checkbox || 'mt-1 h-4 w-4 rounded border-gray-300',\n helpText: classNames.helpText || 'mt-1 text-xs text-gray-500',\n errorText: classNames.errorText || 'mt-1 text-xs text-red-600',\n button: classNames.button || 'w-full mt-4 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50',\n };\n\n const inputClasses = (hasError: boolean) =>\n hasError ? cx(styles.input, styles.inputError) : styles.input;\n\n // ── Render contact field ──\n\n const renderContactField = (name: string, label: string, value: string, type = 'text') => {\n const fieldId = `${formId}-${name}`;\n const errorId = `${fieldId}-error`;\n const isDisabled = getFieldDisabled(name);\n const isRequired = getFieldRequired(name);\n const error = contactTouched[name] ? contactErrors[name] : undefined;\n const hasError = !!error;\n\n return (\n <div key={name} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {label}\n {isRequired && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n name={name}\n type={type}\n value={value}\n disabled={isDisabled}\n onChange={(e) => handleContactChange(name, e.target.value)}\n onBlur={() => handleContactBlur(name, name === 'firstName' ? firstName : name === 'lastName' ? lastName : emailValue)}\n className={cx(inputClasses(hasError), isDisabled ? 'opacity-50 cursor-not-allowed' : '')}\n aria-invalid={hasError ? 'true' : 'false'}\n aria-describedby={hasError ? errorId : undefined}\n aria-required={isRequired ? 'true' : undefined}\n />\n {hasError && (\n <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>\n )}\n </div>\n );\n };\n\n // ── Render question field ──\n\n const renderQuestionField = (question: Question) => {\n const fieldId = `${formId}-q-${question.id}`;\n const errorId = `${fieldId}-error`;\n const value = questionValues[question.id];\n const error = questionTouched[question.id] ? questionErrors[question.id] : undefined;\n const hasError = !!error;\n\n const ariaProps = {\n 'aria-invalid': hasError ? true as const : undefined,\n 'aria-describedby': hasError ? errorId : undefined,\n 'aria-required': question.required || undefined,\n };\n\n switch (question.detail_type) {\n case 'heading':\n return (\n <h3 key={question.id} className={styles.heading}>\n {question.name}\n </h3>\n );\n\n case 'text_field':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n placeholder={question.settings?.placeholder}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'text_area':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <textarea\n id={fieldId}\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n placeholder={question.settings?.placeholder}\n rows={4}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'select':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <select\n id={fieldId}\n value={(value as string | number) ?? ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={inputClasses(hasError)}\n {...ariaProps}\n >\n <option value=\"\">Select an option</option>\n {question.options?.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'number':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"number\"\n value={(value as number) ?? ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value ? Number(e.target.value) : '')}\n onBlur={() => handleQuestionBlur(question.id)}\n min={question.settings?.min}\n max={question.settings?.max}\n placeholder={question.settings?.placeholder}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'date':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"date\"\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'check':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <div className=\"flex items-start gap-2\">\n <input\n id={fieldId}\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => handleQuestionChange(question.id, e.target.checked)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={styles.checkbox}\n {...ariaProps}\n />\n <label htmlFor={fieldId} className=\"text-sm\">\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n </div>\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {renderContactField('firstName', 'First name', firstName)}\n {renderContactField('lastName', 'Last name', lastName)}\n {renderContactField('email', 'Email', emailValue, 'email')}\n {questions.map(renderQuestionField)}\n <button type=\"submit\" className={styles.button}>\n {submitLabel}\n </button>\n </form>\n );\n }\n);\n\nContactDetailsForm.displayName = 'ContactDetailsForm';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/BookingForm.tsx","../src/utils/validators.ts","../src/components/RegistrationForm.tsx","../src/components/ContactDetailsForm.tsx"],"names":["useState","useCallback","jsxs","jsx","cx","forwardRef","useId","useImperativeHandle"],"mappings":"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","file":"index.mjs","sourcesContent":["import React, { useState, useEffect, useCallback } from 'react';\nimport type { Question, FormValues, FormErrors, BookingFormProps, BookingFormClassNames } from '../types';\n\n/** Merge base classes with optional custom classes */\nconst cx = (...classes: (string | undefined)[]) => classes.filter(Boolean).join(' ');\n\n/**\n * Renders a single form field based on question type\n */\nfunction FormField({\n question,\n value,\n error,\n onChange,\n classNames,\n}: {\n question: Question;\n value: string | number | boolean | undefined;\n error?: string;\n onChange: (value: string | number | boolean) => void;\n classNames?: BookingFormClassNames;\n}) {\n const inputId = `question-${question.id}`;\n const errorId = `${inputId}-error`;\n const hasError = !!error;\n\n // Default classes (can be overridden via classNames prop)\n const defaultFieldWrapper = 'mb-4';\n const defaultLabel = 'block text-sm font-medium mb-1 text-gray-700';\n const defaultHeading = 'text-lg font-semibold text-gray-900 mt-4 mb-2 first:mt-0';\n const defaultInput = 'w-full px-3 py-2 border rounded-md text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-offset-1 border-gray-300 focus:ring-blue-500 focus:border-blue-500';\n const defaultInputError = 'border-red-500 focus:ring-red-500';\n const defaultCheckbox = 'mt-1 h-4 w-4 rounded border-gray-300 text-blue-600 focus:ring-blue-500';\n const defaultHelpText = 'mt-1 text-xs text-gray-500';\n const defaultErrorText = 'mt-1 text-xs text-red-600';\n\n const inputClasses = hasError\n ? cx(classNames?.input ?? defaultInput, classNames?.inputError ?? defaultInputError)\n : cx(classNames?.input ?? defaultInput);\n\n const labelClasses = classNames?.label ?? defaultLabel;\n const checkboxLabelClasses = cx('text-sm', classNames?.label ?? 'text-gray-700');\n\n const renderLabel = () => {\n if (question.detail_type === 'heading') return null;\n return (\n <label htmlFor={inputId} className={labelClasses}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n );\n };\n\n const renderHelpText = () => {\n if (!question.help_text) return null;\n return <p className={classNames?.helpText ?? defaultHelpText}>{question.help_text}</p>;\n };\n\n const renderError = () => {\n if (!error) return null;\n return (\n <p id={errorId} className={classNames?.errorText ?? defaultErrorText} role=\"alert\">\n {error}\n </p>\n );\n };\n\n const ariaProps = {\n 'aria-invalid': hasError ? true : undefined,\n 'aria-describedby': hasError ? errorId : undefined,\n 'aria-required': question.required || undefined,\n };\n\n switch (question.detail_type) {\n case 'heading':\n return (\n <h3 className={classNames?.heading ?? defaultHeading}>\n {question.name}\n </h3>\n );\n\n case 'text_field':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={question.settings?.placeholder}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'text_area':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <textarea\n id={inputId}\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={question.settings?.placeholder}\n rows={4}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'select':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <select\n id={inputId}\n value={(value as string | number) ?? ''}\n onChange={(e) => onChange(e.target.value)}\n className={inputClasses}\n {...ariaProps}\n >\n <option value=\"\">Select an option</option>\n {question.options?.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'date':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"date\"\n value={(value as string) || ''}\n onChange={(e) => onChange(e.target.value)}\n min={question.settings?.min?.toString()}\n max={question.settings?.max?.toString()}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'number':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n {renderLabel()}\n <input\n id={inputId}\n type=\"number\"\n value={(value as number) ?? ''}\n onChange={(e) => onChange(e.target.value ? Number(e.target.value) : '')}\n min={question.settings?.min}\n max={question.settings?.max}\n placeholder={question.settings?.placeholder}\n className={inputClasses}\n {...ariaProps}\n />\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n case 'check':\n return (\n <div className={classNames?.fieldWrapper ?? defaultFieldWrapper}>\n <div className=\"flex items-start gap-2\">\n <input\n id={inputId}\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => onChange(e.target.checked)}\n className={classNames?.checkbox ?? defaultCheckbox}\n {...ariaProps}\n />\n <label htmlFor={inputId} className={checkboxLabelClasses}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n </div>\n {renderHelpText()}\n {renderError()}\n </div>\n );\n\n default:\n return null;\n }\n}\n\n/**\n * BookingForm - A dynamic form component for booking questions\n *\n * @example\n * ```tsx\n * const questions: Question[] = [\n * { id: 1, name: 'Personal Details', detail_type: 'heading' },\n * { id: 2, name: 'Full Name', detail_type: 'text_field', required: true },\n * { id: 3, name: 'Email', detail_type: 'text_field', required: true },\n * ];\n *\n * <BookingForm\n * questions={questions}\n * onSubmit={(values) => console.log(values)}\n * />\n * ```\n */\nexport function BookingForm({\n questions,\n onSubmit,\n submitLabel = 'Submit',\n className = '',\n labelClassName,\n classNames: classNamesProp,\n}: BookingFormProps) {\n // Merge deprecated labelClassName into classNames for backwards compatibility\n const classNames: BookingFormClassNames = {\n ...classNamesProp,\n label: classNamesProp?.label ?? labelClassName,\n };\n const [values, setValues] = useState<FormValues>({});\n const [errors, setErrors] = useState<FormErrors>({});\n const [touched, setTouched] = useState<Record<number, boolean>>({});\n\n\n // Check if a question should be visible based on conditional settings\n const isQuestionVisible = useCallback(\n (question: Question): boolean => {\n const { settings } = question;\n if (!settings?.conditional_answers) {\n return true;\n }\n\n // Check all conditions in conditional_answers\n // Each entry is { questionId: expectedAnswerValue }\n const conditionEntries = Object.entries(settings.conditional_answers as Record<string, unknown>);\n if (conditionEntries.length === 0) {\n return true;\n }\n\n // Question is visible if ANY condition is met\n return conditionEntries.some(([questionIdStr, expectedAnswer]) => {\n const questionId = Number(questionIdStr);\n const currentValue = (values as Record<string, unknown>)[String(questionId)];\n\n if (currentValue === undefined || currentValue === '' || currentValue === null) {\n return false;\n }\n\n // Selects typically store the option id (as string), but allow `{ id, name }` objects too\n const normalizedCurrent =\n typeof currentValue === 'object' && currentValue !== null && 'id' in (currentValue as any)\n ? (currentValue as any)\n : currentValue;\n\n // Build a set of candidate strings for comparison.\n // For select questions we support matching by BOTH option id and option name.\n const candidates = new Set<string>();\n\n const addCandidate = (v: unknown) => {\n if (v === undefined || v === null) return;\n const s = String(v).trim();\n if (s) candidates.add(s);\n };\n\n const sourceQuestion = questions.find((q) => q.id === questionId);\n\n if (typeof normalizedCurrent === 'object' && normalizedCurrent !== null) {\n addCandidate((normalizedCurrent as any).id);\n addCandidate((normalizedCurrent as any).name);\n } else {\n addCandidate(normalizedCurrent);\n }\n\n if (sourceQuestion?.detail_type === 'select' && sourceQuestion.options?.length) {\n // Try to resolve the selected option via id or name.\n const currentStr = [...candidates][0] ?? '';\n const optionById = sourceQuestion.options.find((o) => String(o.id) === currentStr);\n const optionByName = sourceQuestion.options.find((o) => String(o.name).trim() === currentStr);\n const opt = optionById ?? optionByName;\n if (opt) {\n addCandidate(opt.id);\n addCandidate(opt.name);\n }\n }\n\n const matchesScalar = (expected: unknown) => {\n const expectedStr = String(expected).trim();\n return candidates.has(expectedStr);\n };\n\n // Support multiple expected formats:\n // - scalar: \"Consultation\" / \"1\" / 1 / true\n // - array: [\"Consultation\", \"Follow-up\"]\n // - map/object: { \"Consultation\": true }\n if (Array.isArray(expectedAnswer)) {\n return expectedAnswer.some((v) => matchesScalar(v));\n }\n\n if (expectedAnswer && typeof expectedAnswer === 'object') {\n const expectedMap = expectedAnswer as Record<string, unknown>;\n for (const c of candidates) {\n if (Object.prototype.hasOwnProperty.call(expectedMap, c)) {\n const flag = expectedMap[c];\n return flag === undefined ? true : !!flag;\n }\n }\n return false;\n }\n\n return matchesScalar(expectedAnswer);\n });\n },\n [values, questions]\n );\n\n // Get visible questions\n const visibleQuestions = questions.filter(isQuestionVisible);\n\n\n // Validate a single field\n const validateField = useCallback((question: Question, value: FormValues[number]): string | null => {\n if (question.detail_type === 'heading') return null;\n\n if (question.required) {\n if (value === undefined || value === '' || value === null) {\n return `${question.name} is required`;\n }\n if (question.detail_type === 'check' && !value) {\n return `${question.name} must be checked`;\n }\n }\n\n if (question.detail_type === 'number' && value !== '' && value !== undefined) {\n const numValue = Number(value);\n if (question.settings?.min !== undefined && numValue < question.settings.min) {\n return `Minimum value is ${question.settings.min}`;\n }\n if (question.settings?.max !== undefined && numValue > question.settings.max) {\n return `Maximum value is ${question.settings.max}`;\n }\n }\n\n return null;\n }, []);\n\n // Validate all visible fields\n const validateAll = useCallback((): boolean => {\n const newErrors: FormErrors = {};\n let isValid = true;\n\n visibleQuestions.forEach((question) => {\n const error = validateField(question, values[question.id]);\n if (error) {\n newErrors[question.id] = error;\n isValid = false;\n }\n });\n\n setErrors(newErrors);\n return isValid;\n }, [visibleQuestions, values, validateField]);\n\n // Clear errors for hidden questions\n useEffect(() => {\n const visibleIds = new Set(visibleQuestions.map((q) => q.id));\n\n setErrors((prev) => {\n let changed = false;\n const next = { ...prev };\n\n Object.keys(next).forEach((idStr) => {\n const id = Number(idStr);\n if (!visibleIds.has(id)) {\n delete next[id];\n changed = true;\n }\n });\n\n return changed ? next : prev;\n });\n }, [visibleQuestions]);\n\n const handleChange = (questionId: number, value: string | number | boolean) => {\n setValues((prev) => ({ ...prev, [questionId]: value }));\n setTouched((prev) => ({ ...prev, [questionId]: true }));\n\n // Clear error on change if touched\n if (touched[questionId]) {\n const question = questions.find((q) => q.id === questionId);\n if (question) {\n const error = validateField(question, value);\n setErrors((prev) => {\n if (error) {\n return { ...prev, [questionId]: error };\n }\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all fields as touched\n const allTouched: Record<number, boolean> = {};\n visibleQuestions.forEach((q) => {\n allTouched[q.id] = true;\n });\n setTouched(allTouched);\n\n if (validateAll()) {\n // Only include visible question values\n const visibleValues: FormValues = {};\n visibleQuestions.forEach((q) => {\n if (q.detail_type !== 'heading' && values[q.id] !== undefined) {\n visibleValues[q.id] = values[q.id];\n }\n });\n onSubmit(visibleValues);\n }\n };\n\n const defaultButton = 'w-full mt-4 px-4 py-2 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 transition-colors';\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {visibleQuestions.map((question) => (\n <FormField\n key={question.id}\n question={question}\n value={values[question.id]}\n error={touched[question.id] ? errors[question.id] : undefined}\n onChange={(value) => handleChange(question.id, value)}\n classNames={classNames}\n />\n ))}\n <button\n type=\"submit\"\n className={classNames?.button ?? defaultButton}\n >\n {submitLabel}\n </button>\n </form>\n );\n}\n\nexport default BookingForm;\n","/**\n * Validation helper functions for form fields\n * Each validator returns an error message string if invalid, or null if valid\n */\n\n/**\n * Validates that a value is not empty\n */\nexport function required(value: string): string | null {\n if (!value || value.trim() === '') {\n return 'This field is required';\n }\n return null;\n}\n\n/**\n * Validates email format (RFC 5322 compliant)\n */\nexport function email(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n const emailRegex = /^[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 if (!emailRegex.test(value)) {\n return 'Please enter a valid email address';\n }\n return null;\n}\n\n/**\n * Validates phone number format (international)\n * Accepts formats like: +44 1234 567890, 01onal234 567890, +1-234-567-8900\n */\nexport function phone(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n // Remove all spaces, dashes, and parentheses for validation\n const cleaned = value.replace(/[\\s\\-\\(\\)]/g, '');\n \n // Check for valid phone format: optional + followed by 7-15 digits\n const phoneRegex = /^\\+?[0-9]{7,15}$/;\n \n if (!phoneRegex.test(cleaned)) {\n return 'Please enter a valid phone number';\n }\n return null;\n}\n\n/**\n * Validates UK postcode format\n * Accepts formats like: SW1A 1AA, SW1A1AA, M1 1AA, B33 8TH\n */\nexport function ukPostcode(value: string): string | null {\n if (!value) return null; // Let required handle empty values\n \n // UK postcode regex - covers all valid formats\n const postcodeRegex = /^([A-Z]{1,2}[0-9][A-Z0-9]? ?[0-9][A-Z]{2})$/i;\n \n if (!postcodeRegex.test(value.trim())) {\n return 'Please enter a valid UK postcode';\n }\n return null;\n}\n\n/**\n * Creates a minimum length validator\n * @param min - Minimum number of characters required\n */\nexport function minLen(min: number): (value: string) => string | null {\n return (value: string) => {\n if (!value) return null; // Let required handle empty values\n \n if (value.trim().length < min) {\n return `Must be at least ${min} character${min === 1 ? '' : 's'}`;\n }\n return null;\n };\n}\n\n/**\n * Combines multiple validators into one\n * Returns the first error encountered, or null if all pass\n */\nexport function compose(\n ...validators: Array<(value: string) => string | null>\n): (value: string) => string | null {\n return (value: string) => {\n for (const validator of validators) {\n const error = validator(value);\n if (error) return error;\n }\n return null;\n };\n}\n","import React, {\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n useId,\n} from 'react';\nimport type {\n FieldConfig,\n RegistrationFormProps,\n RegistrationFormRef,\n RegistrationFormValues,\n RegistrationFormErrors,\n} from '../types/registration';\nimport { required, email, phone, ukPostcode, compose } from '../utils/validators';\n\n/**\n * Default field configuration for the registration form\n */\nconst DEFAULT_FIELDS: FieldConfig[] = [\n {\n name: 'firstName',\n label: 'First name',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'lastName',\n label: 'Last name',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'email',\n label: 'Email address',\n type: 'email',\n required: true,\n validate: compose(required, email),\n },\n {\n name: 'password',\n label: 'Password',\n type: 'password',\n required: false,\n },\n {\n name: 'phone',\n label: 'Contact number',\n type: 'tel',\n required: false,\n validate: phone,\n },\n {\n name: 'address1',\n label: 'Address 1',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'address2',\n label: 'Address 2',\n type: 'text',\n required: false,\n },\n {\n name: 'city',\n label: 'Town/City',\n type: 'text',\n required: true,\n validate: required,\n },\n {\n name: 'postcode',\n label: 'Postcode',\n type: 'text',\n required: true,\n validate: compose(required, ukPostcode),\n },\n];\n\n/**\n * A reusable, accessible registration form component.\n * \n * Features:\n * - Customizable fields via props\n * - Built-in validation with blur and submit triggers\n * - Full accessibility support (ARIA attributes, keyboard navigation)\n * - Imperative handle for programmatic control (reset, setValues)\n * - Granular styling via classNames prop\n * \n * @example\n * ```tsx\n * const formRef = useRef<RegistrationFormRef>(null);\n * \n * <RegistrationForm\n * ref={formRef}\n * onSubmit={(values) => console.log(values)}\n * onChange={(values, isValid) => console.log(isValid)}\n * submitLabel=\"Register\"\n * />\n * \n * // Programmatic control\n * formRef.current?.reset();\n * formRef.current?.setValues({ email: 'test@example.com' });\n * ```\n */\nexport const RegistrationForm = forwardRef<RegistrationFormRef, RegistrationFormProps>(\n (\n {\n fields = DEFAULT_FIELDS,\n additionalFields,\n onSubmit,\n onChange,\n validateOnBlur = true,\n submitLabel = 'Submit',\n className = '',\n classNames = {},\n },\n ref\n ) => {\n const formId = useId();\n const [values, setValues] = useState<RegistrationFormValues>({});\n const [errors, setErrors] = useState<RegistrationFormErrors>({});\n const [touched, setTouched] = useState<Record<string, boolean>>({});\n\n // Merge fields with additional fields\n const allFields = additionalFields ? [...fields, ...additionalFields] : fields;\n\n /**\n * Validate a single field\n */\n const validateField = useCallback(\n (field: FieldConfig, value: string): string | null => {\n // Check required first\n if (field.required && (!value || value.trim() === '')) {\n return 'This field is required';\n }\n // Run custom validator if value is present\n if (field.validate && value) {\n return field.validate(value);\n }\n return null;\n },\n []\n );\n\n /**\n * Validate all fields and return whether form is valid\n */\n const validateAll = useCallback((): boolean => {\n const newErrors: RegistrationFormErrors = {};\n let isValid = true;\n\n for (const field of allFields) {\n const value = values[field.name] || '';\n const error = validateField(field, value);\n if (error) {\n newErrors[field.name] = error;\n isValid = false;\n }\n }\n\n setErrors(newErrors);\n return isValid;\n }, [allFields, values, validateField]);\n\n /**\n * Check if current form state is valid (without updating errors)\n */\n const checkIsValid = useCallback(\n (currentValues: RegistrationFormValues): boolean => {\n for (const field of allFields) {\n const value = currentValues[field.name] || '';\n const error = validateField(field, value);\n if (error) return false;\n }\n return true;\n },\n [allFields, validateField]\n );\n\n /**\n * Handle input change\n */\n const handleChange = useCallback(\n (fieldName: string, value: string) => {\n const newValues = { ...values, [fieldName]: value };\n setValues(newValues);\n\n // Clear error if field was touched and is now valid\n if (touched[fieldName]) {\n const field = allFields.find((f) => f.name === fieldName);\n if (field) {\n const error = validateField(field, value);\n if (!error) {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[fieldName];\n return next;\n });\n }\n }\n }\n\n // Call onChange callback\n if (onChange) {\n const isValid = checkIsValid(newValues);\n onChange(newValues, isValid);\n }\n },\n [values, touched, allFields, validateField, onChange, checkIsValid]\n );\n\n /**\n * Handle input blur\n */\n const handleBlur = useCallback(\n (fieldName: string) => {\n setTouched((prev) => ({ ...prev, [fieldName]: true }));\n\n if (validateOnBlur) {\n const field = allFields.find((f) => f.name === fieldName);\n if (field) {\n const value = values[fieldName] || '';\n const error = validateField(field, value);\n if (error) {\n setErrors((prev) => ({ ...prev, [fieldName]: error }));\n } else {\n setErrors((prev) => {\n const next = { ...prev };\n delete next[fieldName];\n return next;\n });\n }\n }\n }\n },\n [validateOnBlur, allFields, values, validateField]\n );\n\n /**\n * Handle form submission\n */\n const handleSubmit = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all fields as touched\n const allTouched: Record<string, boolean> = {};\n for (const field of allFields) {\n allTouched[field.name] = true;\n }\n setTouched(allTouched);\n\n // Validate all and submit if valid\n if (validateAll()) {\n onSubmit(values);\n }\n },\n [allFields, validateAll, onSubmit, values]\n );\n\n /**\n * Expose imperative methods via ref\n */\n useImperativeHandle(\n ref,\n () => ({\n reset: () => {\n setValues({});\n setErrors({});\n setTouched({});\n },\n setValues: (newValues: Partial<RegistrationFormValues>) => {\n setValues((prev) => {\n const merged = { ...prev };\n for (const [key, value] of Object.entries(newValues)) {\n if (value !== undefined) {\n merged[key] = value;\n }\n }\n return merged;\n });\n },\n }),\n []\n );\n\n // Default styles\n const styles = {\n fieldWrapper: classNames.fieldWrapper || 'mb-4',\n label: classNames.label || 'block text-sm font-medium mb-1',\n input: classNames.input || 'w-full px-3 py-2 border rounded-md',\n inputError: classNames.inputError || 'border-red-500',\n errorText: classNames.errorText || 'mt-1 text-xs text-red-600',\n button:\n classNames.button ||\n 'w-full mt-4 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50',\n };\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {allFields.map((field) => {\n const fieldId = `${formId}-${field.name}`;\n const errorId = `${fieldId}-error`;\n const value = values[field.name] || '';\n const error = errors[field.name];\n const isTouched = touched[field.name];\n const showError = isTouched && error;\n\n return (\n <div key={field.name} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {field.label}\n {field.required && (\n <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n {field.type === 'select' && field.options ? (\n <select\n id={fieldId}\n name={field.name}\n value={value}\n onChange={(e) => handleChange(field.name, e.target.value)}\n onBlur={() => handleBlur(field.name)}\n className={`${styles.input} ${showError ? styles.inputError : ''}`}\n aria-invalid={showError ? 'true' : 'false'}\n aria-describedby={showError ? errorId : undefined}\n aria-required={field.required ? 'true' : 'false'}\n >\n <option value=\"\">{field.placeholder || 'Select an option'}</option>\n {field.options.map((option) => (\n <option key={option.id} value={String(option.id)}>\n {option.name}\n {option.price !== undefined && option.price > 0 ? ` (+£${option.price})` : ''}\n </option>\n ))}\n </select>\n ) : (\n <input\n id={fieldId}\n name={field.name}\n type={field.type === 'select' ? 'text' : field.type}\n value={value}\n onChange={(e) => handleChange(field.name, e.target.value)}\n onBlur={() => handleBlur(field.name)}\n placeholder={field.placeholder}\n className={`${styles.input} ${showError ? styles.inputError : ''}`}\n aria-invalid={showError ? 'true' : 'false'}\n aria-describedby={showError ? errorId : undefined}\n aria-required={field.required ? 'true' : 'false'}\n />\n )}\n {showError && (\n <p id={errorId} className={styles.errorText} role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n })}\n <button type=\"submit\" className={styles.button}>\n {submitLabel}\n </button>\n </form>\n );\n }\n);\n\nRegistrationForm.displayName = 'RegistrationForm';\n","import React, {\n useState,\n useCallback,\n useImperativeHandle,\n forwardRef,\n useId,\n} from 'react';\nimport type { Question, QuestionOption, FormValues, FormErrors } from '../types';\nimport type {\n ContactDetailsFormProps,\n ContactDetailsFormRef,\n ContactDetailsValues,\n ContactDetailsFieldSettings,\n} from '../types/contact-details';\nimport { required, email as emailValidator, compose } from '../utils/validators';\n\n/** Merge base classes with optional custom classes */\nconst cx = (...classes: (string | undefined)[]) => classes.filter(Boolean).join(' ');\n\n/**\n * ContactDetailsForm — collects first name, last name, email and optional\n * dynamic questions. On submit it emits values with `q` and `answers` fields\n * matching the JRNI Update Client / Member API format.\n *\n * @example\n * ```tsx\n * <ContactDetailsForm\n * questions={[\n * { id: 2, name: 'Purpose', detail_type: 'select', required: true,\n * options: [{ id: 5, name: 'School Trip' }, { id: 6, name: 'Corporate' }] },\n * { id: 7, name: 'Group Size', detail_type: 'number', required: true },\n * ]}\n * onSubmit={(values) => console.log(values)}\n * />\n * ```\n */\nexport const ContactDetailsForm = forwardRef<ContactDetailsFormRef, ContactDetailsFormProps>(\n (\n {\n questions = [],\n onSubmit,\n onChange: _onChange,\n initialValues,\n validateOnBlur = true,\n submitLabel = 'Submit',\n className = '',\n classNames = {},\n fieldSettings = {},\n },\n ref\n ) => {\n const formId = useId();\n\n // Contact detail fields\n const [firstName, setFirstName] = useState(initialValues?.firstName || '');\n const [lastName, setLastName] = useState(initialValues?.lastName || '');\n const [emailValue, setEmailValue] = useState(initialValues?.email || '');\n\n // Contact detail errors\n const [contactErrors, setContactErrors] = useState<Record<string, string>>({});\n const [contactTouched, setContactTouched] = useState<Record<string, boolean>>({});\n\n // Question field values and errors (keyed by question id)\n const [questionValues, setQuestionValues] = useState<FormValues>(() => {\n if (!initialValues?.questions) return {};\n const init: FormValues = {};\n for (const [key, val] of Object.entries(initialValues.questions)) {\n init[Number(key)] = val;\n }\n return init;\n });\n const [questionErrors, setQuestionErrors] = useState<FormErrors>({});\n const [questionTouched, setQuestionTouched] = useState<Record<number, boolean>>({});\n\n // ── Resolve per-field settings (default: required=true, disabled=false) ──\n const getFieldRequired = (name: string) => {\n const s = fieldSettings[name as keyof ContactDetailsFieldSettings];\n return s?.required !== undefined ? s.required : true;\n };\n const getFieldDisabled = (name: string) => {\n const s = fieldSettings[name as keyof ContactDetailsFieldSettings];\n return !!s?.disabled;\n };\n\n const contactFields = [\n { name: 'firstName', label: 'First name', value: firstName, setter: setFirstName },\n { name: 'lastName', label: 'Last name', value: lastName, setter: setLastName },\n { name: 'email', label: 'Email', value: emailValue, setter: setEmailValue },\n ] as const;\n\n // ── Validation helpers ──\n\n const validateContactField = useCallback((name: string, value: string): string | null => {\n const isRequired = getFieldRequired(name);\n if (name === 'email') {\n const validators = isRequired ? compose(required, emailValidator) : emailValidator;\n return value ? validators(value) : (isRequired ? required(value) : null);\n }\n return isRequired ? required(value) : null;\n }, [fieldSettings]);\n\n const validateQuestionField = useCallback((question: Question, value: FormValues[number]): string | null => {\n if (question.detail_type === 'heading') return null;\n if (question.required) {\n if (value === undefined || value === '' || value === null) {\n return `${question.name} is required`;\n }\n if (question.detail_type === 'check' && !value) {\n return `${question.name} must be checked`;\n }\n }\n if (question.detail_type === 'number' && value !== '' && value !== undefined) {\n const numValue = Number(value);\n if (question.settings?.min !== undefined && numValue < question.settings.min) {\n return `Minimum value is ${question.settings.min}`;\n }\n if (question.settings?.max !== undefined && numValue > question.settings.max) {\n return `Maximum value is ${question.settings.max}`;\n }\n }\n return null;\n }, []);\n\n const validateAllContacts = useCallback((): boolean => {\n const errs: Record<string, string> = {};\n let valid = true;\n for (const f of contactFields) {\n if (getFieldDisabled(f.name)) continue;\n const err = validateContactField(f.name, f.value);\n if (err) { errs[f.name] = err; valid = false; }\n }\n setContactErrors(errs);\n return valid;\n }, [firstName, lastName, emailValue, validateContactField, fieldSettings]);\n\n const validateAllQuestions = useCallback((): boolean => {\n const errs: FormErrors = {};\n let valid = true;\n for (const q of questions) {\n const err = validateQuestionField(q, questionValues[q.id]);\n if (err) { errs[q.id] = err; valid = false; }\n }\n setQuestionErrors(errs);\n return valid;\n }, [questions, questionValues, validateQuestionField]);\n\n // ── Build output ──\n\n const buildOutput = useCallback((): ContactDetailsValues => {\n const q: ContactDetailsValues['q'] = {};\n const answers: ContactDetailsValues['answers'] = [];\n\n for (const question of questions) {\n if (question.detail_type === 'heading') continue;\n const rawValue = questionValues[question.id];\n if (rawValue === undefined || rawValue === '') continue;\n\n let answer = String(rawValue);\n let answerId = 0;\n\n // For selects, resolve the option\n if (question.detail_type === 'select' && question.options?.length) {\n const option = question.options.find(\n (o: QuestionOption) => String(o.id) === String(rawValue)\n );\n if (option) {\n answer = option.name;\n answerId = typeof option.id === 'number' ? option.id : parseInt(String(option.id), 10) || 0;\n }\n }\n\n const idStr = String(question.id);\n q[idStr] = { answer, answer_id: answerId, name: question.name };\n answers.push({ question_id: question.id, name: question.name, answer, answer_id: answerId });\n }\n\n return { firstName, lastName, email: emailValue, q, answers };\n }, [firstName, lastName, emailValue, questions, questionValues]);\n\n // ── Handlers ──\n\n const handleContactChange = useCallback((name: string, value: string) => {\n const setter = name === 'firstName' ? setFirstName : name === 'lastName' ? setLastName : setEmailValue;\n setter(value);\n\n if (contactTouched[name]) {\n const err = validateContactField(name, value);\n setContactErrors(prev => {\n if (err) return { ...prev, [name]: err };\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n }\n }, [contactTouched, validateContactField]);\n\n const handleContactBlur = useCallback((name: string, value: string) => {\n setContactTouched(prev => ({ ...prev, [name]: true }));\n if (validateOnBlur) {\n const err = validateContactField(name, value);\n setContactErrors(prev => {\n if (err) return { ...prev, [name]: err };\n const { [name]: _, ...rest } = prev;\n return rest;\n });\n }\n }, [validateOnBlur, validateContactField]);\n\n const handleQuestionChange = useCallback((questionId: number, value: string | number | boolean) => {\n setQuestionValues(prev => ({ ...prev, [questionId]: value }));\n setQuestionTouched(prev => ({ ...prev, [questionId]: true }));\n\n if (questionTouched[questionId]) {\n const question = questions.find(q => q.id === questionId);\n if (question) {\n const err = validateQuestionField(question, value);\n setQuestionErrors(prev => {\n if (err) return { ...prev, [questionId]: err };\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n }, [questionTouched, questions, validateQuestionField]);\n\n const handleQuestionBlur = useCallback((questionId: number) => {\n setQuestionTouched(prev => ({ ...prev, [questionId]: true }));\n if (validateOnBlur) {\n const question = questions.find(q => q.id === questionId);\n if (question) {\n const err = validateQuestionField(question, questionValues[questionId]);\n setQuestionErrors(prev => {\n if (err) return { ...prev, [questionId]: err };\n const { [questionId]: _, ...rest } = prev;\n return rest;\n });\n }\n }\n }, [validateOnBlur, questions, questionValues, validateQuestionField]);\n\n const handleSubmit = useCallback((e: React.FormEvent) => {\n e.preventDefault();\n\n // Mark all touched\n const allContactTouched: Record<string, boolean> = {};\n for (const f of contactFields) allContactTouched[f.name] = true;\n setContactTouched(allContactTouched);\n\n const allQTouched: Record<number, boolean> = {};\n for (const q of questions) allQTouched[q.id] = true;\n setQuestionTouched(allQTouched);\n\n const contactValid = validateAllContacts();\n const questionsValid = validateAllQuestions();\n\n if (contactValid && questionsValid) {\n onSubmit(buildOutput());\n }\n }, [contactFields, questions, validateAllContacts, validateAllQuestions, onSubmit, buildOutput]);\n\n // ── Imperative handle ──\n\n useImperativeHandle(ref, () => ({\n reset: () => {\n setFirstName(initialValues?.firstName || '');\n setLastName(initialValues?.lastName || '');\n setEmailValue(initialValues?.email || '');\n setContactErrors({});\n setContactTouched({});\n if (initialValues?.questions) {\n const init: FormValues = {};\n for (const [key, val] of Object.entries(initialValues.questions)) {\n init[Number(key)] = val;\n }\n setQuestionValues(init);\n } else {\n setQuestionValues({});\n }\n setQuestionErrors({});\n setQuestionTouched({});\n },\n setValues: (vals) => {\n if (vals.firstName !== undefined) setFirstName(vals.firstName);\n if (vals.lastName !== undefined) setLastName(vals.lastName);\n if (vals.email !== undefined) setEmailValue(vals.email);\n },\n }), [initialValues]);\n\n // ── Styles ──\n\n const styles = {\n fieldWrapper: classNames.fieldWrapper || 'mb-4',\n label: classNames.label || 'block text-sm font-medium mb-1',\n heading: classNames.heading || 'text-lg font-semibold mt-4 mb-2 first:mt-0',\n input: classNames.input || 'w-full px-3 py-2 border rounded-md text-sm',\n inputError: classNames.inputError || 'border-red-500',\n checkbox: classNames.checkbox || 'mt-1 h-4 w-4 rounded border-gray-300',\n helpText: classNames.helpText || 'mt-1 text-xs text-gray-500',\n errorText: classNames.errorText || 'mt-1 text-xs text-red-600',\n button: classNames.button || 'w-full mt-4 px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 disabled:opacity-50',\n };\n\n const inputClasses = (hasError: boolean) =>\n hasError ? cx(styles.input, styles.inputError) : styles.input;\n\n // ── Render contact field ──\n\n const renderContactField = (name: string, label: string, value: string, type = 'text') => {\n const fieldId = `${formId}-${name}`;\n const errorId = `${fieldId}-error`;\n const isDisabled = getFieldDisabled(name);\n const isRequired = getFieldRequired(name);\n const error = contactTouched[name] ? contactErrors[name] : undefined;\n const hasError = !!error;\n\n return (\n <div key={name} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {label}\n {isRequired && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n name={name}\n type={type}\n value={value}\n disabled={isDisabled}\n onChange={(e) => handleContactChange(name, e.target.value)}\n onBlur={() => handleContactBlur(name, name === 'firstName' ? firstName : name === 'lastName' ? lastName : emailValue)}\n className={cx(inputClasses(hasError), isDisabled ? 'opacity-50 cursor-not-allowed' : '')}\n aria-invalid={hasError ? 'true' : 'false'}\n aria-describedby={hasError ? errorId : undefined}\n aria-required={isRequired ? 'true' : undefined}\n />\n {hasError && (\n <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>\n )}\n </div>\n );\n };\n\n // ── Render question field ──\n\n const renderQuestionField = (question: Question) => {\n const fieldId = `${formId}-q-${question.id}`;\n const errorId = `${fieldId}-error`;\n const value = questionValues[question.id];\n const error = questionTouched[question.id] ? questionErrors[question.id] : undefined;\n const hasError = !!error;\n\n const ariaProps = {\n 'aria-invalid': hasError ? true as const : undefined,\n 'aria-describedby': hasError ? errorId : undefined,\n 'aria-required': question.required || undefined,\n };\n\n switch (question.detail_type) {\n case 'heading':\n return (\n <h3 key={question.id} className={styles.heading}>\n {question.name}\n </h3>\n );\n\n case 'text_field':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"text\"\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n placeholder={question.settings?.placeholder}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'text_area':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <textarea\n id={fieldId}\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n placeholder={question.settings?.placeholder}\n rows={4}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'select':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <select\n id={fieldId}\n value={(value as string | number) ?? ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={inputClasses(hasError)}\n {...ariaProps}\n >\n <option value=\"\">Select an option</option>\n {question.options?.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'number':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"number\"\n value={(value as number) ?? ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value ? Number(e.target.value) : '')}\n onBlur={() => handleQuestionBlur(question.id)}\n min={question.settings?.min}\n max={question.settings?.max}\n placeholder={question.settings?.placeholder}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'date':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <label htmlFor={fieldId} className={styles.label}>\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n <input\n id={fieldId}\n type=\"date\"\n value={(value as string) || ''}\n onChange={(e) => handleQuestionChange(question.id, e.target.value)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={inputClasses(hasError)}\n {...ariaProps}\n />\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n case 'check':\n return (\n <div key={question.id} className={styles.fieldWrapper}>\n <div className=\"flex items-start gap-2\">\n <input\n id={fieldId}\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => handleQuestionChange(question.id, e.target.checked)}\n onBlur={() => handleQuestionBlur(question.id)}\n className={styles.checkbox}\n {...ariaProps}\n />\n <label htmlFor={fieldId} className=\"text-sm\">\n {question.name}\n {question.required && <span className=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>}\n </label>\n </div>\n {question.help_text && <p className={styles.helpText}>{question.help_text}</p>}\n {hasError && <p id={errorId} className={styles.errorText} role=\"alert\">{error}</p>}\n </div>\n );\n\n default:\n return null;\n }\n };\n\n return (\n <form onSubmit={handleSubmit} className={className} noValidate>\n {renderContactField('firstName', 'First name', firstName)}\n {renderContactField('lastName', 'Last name', lastName)}\n {renderContactField('email', 'Email', emailValue, 'email')}\n {questions.map(renderQuestionField)}\n <button type=\"submit\" className={styles.button}>\n {submitLabel}\n </button>\n </form>\n );\n }\n);\n\nContactDetailsForm.displayName = 'ContactDetailsForm';\n"]}
|