@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 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
- ### Dynamic Questions
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
- setQuestionValues({});
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":";;;;;;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,uBACEA,eAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,WAAW,YAAA,EACjC,QAAA,EAAA;AAAA,MAAA,QAAA,CAAS,IAAA;AAAA,MACT,QAAA,CAAS,4BAAYC,cAAA,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,sCAAQ,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,uBACEA,cAAA,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,sCACG,IAAA,EAAA,EAAG,SAAA,EAAW,YAAY,OAAA,IAAW,cAAA,EACnC,mBAAS,IAAA,EACZ,CAAA;AAAA,IAGJ,KAAK,YAAA;AACH,MAAA,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EACzC,QAAA,EAAA;AAAA,QAAA,WAAA,EAAY;AAAA,wBACbC,cAAA;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,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EACzC,QAAA,EAAA;AAAA,QAAA,WAAA,EAAY;AAAA,wBACbC,cAAA;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,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EACzC,QAAA,EAAA;AAAA,QAAA,WAAA,EAAY;AAAA,wBACbA,eAAA;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,8BAAAC,cAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,cAChC,QAAA,CAAS,OAAA,EAAS,GAAA,CAAI,CAAC,2BACtBA,cAAA,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,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EACzC,QAAA,EAAA;AAAA,QAAA,WAAA,EAAY;AAAA,wBACbC,cAAA;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,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EACzC,QAAA,EAAA;AAAA,QAAA,WAAA,EAAY;AAAA,wBACbC,cAAA;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,uBACED,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,UAAA,EAAY,gBAAgB,mBAAA,EAC1C,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAA;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,0BACAD,eAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,WAAW,oBAAA,EACjC,QAAA,EAAA;AAAA,YAAA,QAAA,CAAS,IAAA;AAAA,YACT,QAAA,CAAS,4BAAYC,cAAA,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,GAAIC,cAAA,CAAqB,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAA,CAAqB,EAAE,CAAA;AACnD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAA,CAAkC,EAAE,CAAA;AAIlE,EAAA,MAAM,iBAAA,GAAoBC,iBAAA;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,GAAgBA,iBAAA,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,GAAcA,kBAAY,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,EAAAC,eAAA,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,uCACG,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,SAAA,EAAsB,YAAU,IAAA,EAC3D,QAAA,EAAA;AAAA,IAAA,gBAAA,CAAiB,GAAA,CAAI,CAAC,QAAA,qBACrBH,cAAA;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,oBACDA,cAAA;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,GAAmBI,gBAAA;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,SAASC,WAAA,EAAM;AACrB,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIJ,cAAAA,CAAiC,EAAE,CAAA;AAC/D,IAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAAA,CAAiC,EAAE,CAAA;AAC/D,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAAA,CAAkC,EAAE,CAAA;AAGlE,IAAA,MAAM,YAAY,gBAAA,GAAmB,CAAC,GAAG,MAAA,EAAQ,GAAG,gBAAgB,CAAA,GAAI,MAAA;AAKxE,IAAA,MAAM,aAAA,GAAgBC,iBAAAA;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,kBAAY,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,iBAAAA;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,iBAAAA;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,iBAAAA;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,iBAAAA;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,IAAAI,yBAAA;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,uBACEP,eAAAA,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,eAAAA,CAAC,KAAA,EAAA,EAAqB,SAAA,EAAW,OAAO,YAAA,EACtC,QAAA,EAAA;AAAA,0BAAAA,gBAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,KAAA;AAAA,YACN,KAAA,CAAM,4BACLC,cAAAA,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,eAAAA;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,eAAC,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,eAAAA,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,cAAAA;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,cAAAA,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,eAAC,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,IAAMO,GAAAA,GAAK,IAAI,OAAA,KAAoC,OAAA,CAAQ,OAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAmB5E,IAAM,kBAAA,GAAqBH,gBAAAA;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,WAAAA,EAAM;AAGrB,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIJ,eAAS,EAAE,CAAA;AAC7C,IAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC3C,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,EAAE,CAAA;AAG/C,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,cAAAA,CAAiC,EAAE,CAAA;AAC7E,IAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,cAAAA,CAAkC,EAAE,CAAA;AAGhF,IAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,cAAAA,CAAqB,EAAE,CAAA;AACnE,IAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,cAAAA,CAAqB,EAAE,CAAA;AACnE,IAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,cAAAA,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,iBAAAA,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,iBAAAA,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,kBAAY,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,kBAAY,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,kBAAY,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,iBAAAA,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,iBAAAA,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,iBAAAA,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,iBAAAA,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,iBAAAA,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,IAAAI,yBAAAA,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,GAAWC,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,uBACER,eAAAA,CAAC,KAAA,EAAA,EAAe,SAAA,EAAW,OAAO,YAAA,EAChC,QAAA,EAAA;AAAA,wBAAAA,gBAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UACA,UAAA,oBAAcC,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mBAAA,EAAoB,aAAA,EAAY,QAAO,QAAA,EAAA,GAAA,EAAC;AAAA,SAAA,EACzE,CAAA;AAAA,wBACAA,cAAAA;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,WAAWO,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,oBACCP,cAAAA,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,eAAC,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,eAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,gBAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,IAAA;AAAA,cACT,QAAA,CAAS,4BAAYC,cAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC;AAAA,aAAA,EAChF,CAAA;AAAA,4BACAA,cAAAA;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,cAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,cAAAA,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,eAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,gBAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,IAAA;AAAA,cACT,QAAA,CAAS,4BAAYC,cAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC;AAAA,aAAA,EAChF,CAAA;AAAA,4BACAA,cAAAA;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,cAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,cAAAA,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,eAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,gBAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,IAAA;AAAA,cACT,QAAA,CAAS,4BAAYC,cAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC;AAAA,aAAA,EAChF,CAAA;AAAA,4BACAD,eAAAA;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,cAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,EAAA,EAAG,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,kBAChC,QAAA,CAAS,OAAA,EAAS,GAAA,CAAI,CAAC,2BACtBA,cAAAA,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,cAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,cAAAA,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,eAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,gBAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,IAAA;AAAA,cACT,QAAA,CAAS,4BAAYC,cAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC;AAAA,aAAA,EAChF,CAAA;AAAA,4BACAA,cAAAA;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,cAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,cAAAA,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,eAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,gBAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,OAAO,KAAA,EACxC,QAAA,EAAA;AAAA,cAAA,QAAA,CAAS,IAAA;AAAA,cACT,QAAA,CAAS,4BAAYC,cAAAA,CAAC,UAAK,SAAA,EAAU,mBAAA,EAAoB,aAAA,EAAY,MAAA,EAAO,QAAA,EAAA,GAAA,EAAC;AAAA,aAAA,EAChF,CAAA;AAAA,4BACAA,cAAAA;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,cAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,cAAAA,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,eAAAA,CAAC,KAAA,EAAA,EAAsB,SAAA,EAAW,OAAO,YAAA,EACvC,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,8BAAAC,cAAAA;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,eAAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAS,OAAA,EAAS,WAAU,SAAA,EAChC,QAAA,EAAA;AAAA,gBAAA,QAAA,CAAS,IAAA;AAAA,gBACT,QAAA,CAAS,4BAAYC,cAAAA,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,cAAAA,CAAC,OAAE,SAAA,EAAW,MAAA,CAAO,QAAA,EAAW,QAAA,EAAA,QAAA,CAAS,SAAA,EAAU,CAAA;AAAA,YACzE,QAAA,oBAAYA,cAAAA,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,eAAAA,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,eAAC,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.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
- setQuestionValues({});
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",
@@ -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":"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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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bookinglab/booking-ui-react",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "type": "module",
5
5
  "description": "React UI components for BookingLab booking journeys",
6
6
  "main": "./dist/index.js",