{"version":3,"file":"index.cjs","names":["React","events","React","events","React"],"sources":["../../../../../../@mongez/react-form/src/active-form.ts","../../../../../../@mongez/react-form/src/configurations.ts","../../../../../../@mongez/react-form/src/components/BaseForm.ts","../../../../../../@mongez/react-form/src/contexts/FormContext.ts","../../../../../../@mongez/react-form/src/components/Form.tsx","../../../../../../@mongez/react-form/src/hooks/form-hooks.ts","../../../../../../@mongez/react-form/src/hooks/useForm.ts","../../../../../../@mongez/react-form/src/hooks/useFormControl.ts","../../../../../../@mongez/react-form/src/hooks/useInputValue.ts","../../../../../../@mongez/react-form/src/hooks/useRadioInput.tsx","../../../../../../@mongez/react-form/src/hooks/useSubmitButton.tsx","../../../../../../@mongez/react-form/src/components/HiddenInput.tsx","../../../../../../@mongez/react-form/src/components/NativeForm.tsx","../../../../../../@mongez/react-form/src/locales/index.ts","../../../../../../@mongez/react-form/src/rules/alphabet.ts","../../../../../../@mongez/react-form/src/rules/email.ts","../../../../../../@mongez/react-form/src/rules/float.ts","../../../../../../@mongez/react-form/src/rules/integer.ts","../../../../../../@mongez/react-form/src/rules/length.ts","../../../../../../@mongez/react-form/src/rules/match.ts","../../../../../../@mongez/react-form/src/rules/max.ts","../../../../../../@mongez/react-form/src/rules/maxLength.ts","../../../../../../@mongez/react-form/src/rules/min.ts","../../../../../../@mongez/react-form/src/rules/minLength.ts","../../../../../../@mongez/react-form/src/rules/number.ts","../../../../../../@mongez/react-form/src/rules/pattern.ts","../../../../../../@mongez/react-form/src/rules/required.ts","../../../../../../@mongez/react-form/src/rules/strong.ts","../../../../../../@mongez/react-form/src/rules/url.ts"],"sourcesContent":["import { ActiveForms, FormInterface } from \"./types\";\r\n\r\n// Current active form\r\nlet activeForm: FormInterface | null = null;\r\n\r\n// Active forms ids\r\nconst activeFormsIds: string[] = [];\r\n\r\n/**\r\n * List of all active forms\r\n */\r\nconst activeForms: ActiveForms = {};\r\n\r\n/**\r\n * Get the current active form\r\n */\r\nexport function getActiveForm(): FormInterface | null {\r\n  return activeForm;\r\n}\r\n\r\n/**\r\n * Set the current active form\r\n */\r\nexport function setActiveForm(form: FormInterface): void {\r\n  activeForm = form;\r\n  if (!activeFormsIds.includes(form.id)) {\r\n    activeFormsIds.push(form.id);\r\n  }\r\n}\r\n\r\n/**\r\n * Remove the given form from being active form\r\n */\r\nexport function removeActiveForm(form: FormInterface): void {\r\n  if (activeForm && form.id === activeForm.id) {\r\n    activeForm = null;\r\n\r\n    const index = activeFormsIds.indexOf(form.id);\r\n    if (index > -1) {\r\n      activeFormsIds.splice(index, 1);\r\n\r\n      if (activeFormsIds.length > 0) {\r\n        // get last active form and mark it as active form\r\n        const lastActiveFormId = activeFormsIds[activeFormsIds.length - 1];\r\n\r\n        const lastActiveForm = getForm(lastActiveFormId);\r\n\r\n        if (lastActiveForm) {\r\n          setActiveForm(lastActiveForm);\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Get form by the given id\r\n */\r\nexport function getForm(formId: string): FormInterface | null {\r\n  return activeForms[formId] || null;\r\n}\r\n\r\n/**\r\n * Add the given form to the active forms\r\n */\r\nexport function addToFormsList(form: FormInterface): void {\r\n  activeForms[form.id] = form;\r\n}\r\n\r\n/**\r\n * Remove the given form from the active forms\r\n */\r\nexport function removeFromFormsList(form: FormInterface): void {\r\n  delete activeForms[form.id];\r\n}\r\n","import { FormConfigurations } from \"./types\";\r\n\r\nexport let formConfigurations: FormConfigurations = {};\r\n\r\nexport function setFormConfigurations(newConfigurations: FormConfigurations) {\r\n  formConfigurations = { ...formConfigurations, ...newConfigurations };\r\n}\r\n\r\nexport function getFormConfig(\r\n  key: keyof FormConfigurations,\r\n  defaultValue?: any,\r\n) {\r\n  return formConfigurations[key] ?? defaultValue;\r\n}\r\n\r\nexport function getFormConfigurations(): FormConfigurations {\r\n  return formConfigurations;\r\n}\r\n","import events, { EventSubscription } from \"@mongez/events\";\nimport { debounce, toInputName } from \"@mongez/reinforcements\";\nimport { isPlainObject } from \"@mongez/supportive-is\";\nimport React from \"react\";\nimport {\n  addToFormsList,\n  removeActiveForm,\n  setActiveForm,\n} from \"../active-form\";\nimport { getFormConfig } from \"../configurations\";\nimport {\n  FormControl,\n  FormControlValues,\n  FormEventType,\n  FormInterface,\n  FormProps,\n} from \"./../types\";\n\n/**\n * Platform-agnostic form engine.\n *\n * Holds all form logic that does not depend on the DOM (or on a specific host\n * element). Concrete subclasses implement `submit()` and `render()` for their\n * platform (web `<form>` element, React Native view, etc.).\n */\nexport abstract class BaseForm<P extends FormProps = FormProps>\n  extends React.Component<P>\n  implements FormInterface\n{\n  /**\n   * Reference to the host element (HTMLFormElement on web, any on native).\n   */\n  public formElement: any;\n\n  /**\n   * Form id\n   */\n  protected formId = \"\";\n\n  /**\n   * Form event prefix\n   */\n  protected formEventPrefix = \"\";\n\n  /**\n   * Form Controls\n   */\n  protected formControls: FormControl[] = [];\n\n  /**\n   * Determine whether form validation is valid\n   */\n  protected isValidForm = true;\n\n  /**\n   * Determine form submission state\n   */\n  protected _isSubmitting = false;\n\n  /**\n   * Determine if form is disabled\n   */\n  protected _isDisabled = false;\n\n  /**\n   * List of invalid controls\n   */\n  protected invalidControls: FormControl[] = [];\n\n  /**\n   * List of valid controls\n   */\n  protected validControls: FormControl[] = [];\n\n  /**\n   * Dirty controls\n   */\n  public dirtyControls: FormControl[] = [];\n\n  /**\n   * Default value for the form\n   */\n  public defaultValue: FormProps[\"defaultValue\"];\n\n  /**\n   * Form control events\n   */\n  protected formControlEvents: Record<string, EventSubscription[]> = {};\n\n  /**\n   * Current form dirty state\n   */\n  public isDirty = false;\n\n  public constructor(props: P) {\n    super(props);\n\n    this.formId = props.id || \"frm-\" + Math.random().toString(36).substr(2, 9);\n\n    this.defaultValue = props.defaultValue;\n\n    this.formEventPrefix = `form.${this.formId}`;\n\n    setActiveForm(this as any);\n    addToFormsList(this as any);\n  }\n\n  public change(name: string, value: any) {\n    const formControl = this.control(name);\n\n    if (!formControl) return;\n\n    formControl.change(value);\n  }\n\n  public componentWillUnmount() {\n    removeActiveForm(this as any);\n  }\n\n  public invalidControl(formControl: FormControl) {\n    this.isValidForm = false;\n\n    this.validControls = this.validControls.filter(\n      (control) => control.id !== formControl.id\n    );\n\n    if (!this.invalidControls.includes(formControl)) {\n      this.invalidControls.push(formControl);\n    }\n\n    this.trigger(\"invalidControl\", formControl, this);\n  }\n\n  public validControl(formControl: FormControl) {\n    this.invalidControls = this.invalidControls.filter(\n      (control) => control.id !== formControl.id\n    );\n\n    if (!this.validControls.includes(formControl)) {\n      this.validControls.push(formControl);\n    }\n\n    this.isValidForm = this.invalidControls.length === 0;\n\n    this.trigger(\"validControl\", formControl, this);\n  }\n\n  public checkIfIsValid = this._checkIfIsValid();\n\n  protected _checkIfIsValid() {\n    return debounce(() => {\n      const isValidForm = this.invalidControls.length === 0;\n\n      this.isValidForm = isValidForm;\n\n      if (this.isValidForm) {\n        this.trigger(\"validControls\", this.validControls, this);\n      } else {\n        this.trigger(\"invalidControls\", this.invalidControls, this);\n      }\n    }, 0);\n  }\n\n  public submitting(submitting: boolean) {\n    this._isSubmitting = submitting;\n\n    this.trigger(\"submitting\", submitting, this);\n\n    if (submitting === false) {\n      this.trigger(\"submit\", submitting, this);\n    }\n  }\n\n  public disable(isDisabled = true) {\n    const controls = this.formControls;\n\n    this._isDisabled = isDisabled;\n\n    controls.forEach((control) => {\n      control.disable(isDisabled);\n    });\n\n    this.trigger(\"disable\", isDisabled, this);\n\n    return this;\n  }\n\n  public enable() {\n    return this.disable(false);\n  }\n\n  public isSubmitting() {\n    return this._isSubmitting;\n  }\n\n  public isValid() {\n    return this.isValidForm;\n  }\n\n  public get id() {\n    return this.formId;\n  }\n\n  public on(\n    event: FormEventType,\n    callback: (form: FormInterface) => void\n  ): EventSubscription {\n    return events.subscribe(`${this.formEventPrefix}.${event}`, callback);\n  }\n\n  public trigger(event: FormEventType, ...values: any[]) {\n    return events.trigger(`${this.formEventPrefix}.${event}`, ...values);\n  }\n\n  public triggerAll(event: FormEventType, ...values: any[]) {\n    return events.triggerAll(`${this.formEventPrefix}.${event}`, ...values);\n  }\n\n  /**\n   * Manually submit form. Platform-specific behavior is implemented in subclasses.\n   */\n  public abstract submit(): void;\n\n  public async validate(controls: FormControl[] = this.formControls) {\n    this.isValidForm = true;\n    this.validControls = [];\n    this.invalidControls = [];\n\n    const eventResponse = this.triggerAll(\"validating\", this);\n\n    const validatedInputs: FormControl[] = [];\n\n    if (eventResponse.results.includes(false)) {\n      this.isValidForm = false;\n      return validatedInputs;\n    }\n\n    for (const input of controls) {\n      validatedInputs.push(input);\n\n      await input.validate();\n\n      if (input.isValid === false) {\n        this.invalidControl(input);\n      } else {\n        this.validControl(input);\n      }\n    }\n\n    this.trigger(\"validation\", this.isValidForm, validatedInputs, this);\n\n    this.checkIfIsValid();\n\n    if (!this.isValidForm) {\n      if (this.props.onError) {\n        this.props.onError(this.invalidControls);\n      }\n    }\n\n    return validatedInputs;\n  }\n\n  public validateVisible() {\n    const controls = this.formControls.filter((control) => {\n      return control.isVisible();\n    });\n\n    return this.validate(controls);\n  }\n\n  public register(formControl: FormControl) {\n    if (this.control(formControl.id, \"id\")) return;\n\n    this.trigger(\"registering\", formControl, this);\n\n    this.formControls.push(formControl);\n\n    const event = formControl.onChange(() => {\n      if (formControl.isDirty && !this.dirtyControls.includes(formControl)) {\n        this.dirtyControls.push(formControl);\n      } else if (\n        !formControl.isDirty &&\n        this.dirtyControls.includes(formControl)\n      ) {\n        this.dirtyControls = this.dirtyControls.filter(\n          (control) => control.id !== formControl.id\n        );\n      }\n\n      this.setIsDirty(this.dirtyControls.length > 0);\n    });\n\n    this.formControlEvents[formControl.id || formControl.name] = [\n      ...(this.formControlEvents[formControl.id || formControl.name] || []),\n      event,\n    ];\n\n    this.trigger(\"register\", formControl, this);\n  }\n\n  public unregister(formControl: FormControl) {\n    formControl.unregister();\n\n    const formControlIndex = this.formControls.findIndex(\n      (input) => input.id === formControl.id\n    );\n\n    if (formControlIndex === -1) return;\n\n    this.formControls.splice(formControlIndex, 1);\n\n    this.invalidControls = this.invalidControls.filter(\n      (control) => control.id !== formControl.id\n    );\n\n    const formControlKey = formControl.id || formControl.name;\n\n    const controlEvents = this.formControlEvents[formControlKey];\n\n    if (controlEvents) {\n      controlEvents.forEach((event) => {\n        event.unsubscribe();\n      });\n\n      delete this.formControlEvents[formControlKey];\n\n      if (this.dirtyControls.includes(formControl)) {\n        this.dirtyControls = this.dirtyControls.filter(\n          (control) => control.id !== formControl.id\n        );\n\n        this.setIsDirty(this.dirtyControls.length > 0);\n      }\n    }\n\n    this.checkIfIsValid();\n\n    this.trigger(\"unregister\", formControl, this);\n  }\n\n  protected setIsDirty(isDirty: boolean) {\n    this.isDirty = isDirty;\n\n    this.trigger(\"dirty\", isDirty, this);\n  }\n\n  public control(\n    value: string,\n    getBy: \"name\" | \"id\" = \"name\"\n  ): FormControl | null {\n    return this.formControls.find((input) => input[getBy] === value) || null;\n  }\n\n  public reset() {\n    this.trigger(\"resetting\", this);\n    this.formControls.forEach((input) => {\n      input.reset();\n    });\n\n    this.isValidForm = true;\n    this._isSubmitting = false;\n    this._isDisabled = false;\n\n    this.trigger(\"reset\", this);\n\n    return this;\n  }\n\n  public resetErrors() {\n    this.formControls.forEach((formControl) => {\n      formControl.setError(null);\n    });\n\n    return this;\n  }\n\n  public value(FormControlName: string): any {\n    return this.control(FormControlName, \"name\")?.value;\n  }\n\n  public values(formControlNames: string[] = []) {\n    return createNestedObjectFromDotNotation(\n      this.collectValues(formControlNames)\n    );\n  }\n\n  public shouldIgnoreEmptyValues() {\n    return (\n      this.props.ignoreEmptyValues !== undefined\n        ? this.props.ignoreEmptyValues\n        : getFormConfig(\"ignoreEmptyValues\", false)\n    ) as boolean;\n  }\n\n  public collectValues(formControlNames: string[] = []) {\n    const formControls = this.controls(formControlNames);\n\n    const values: FormControlValues = {};\n\n    const ignoreEmptyValues = this.shouldIgnoreEmptyValues();\n\n    for (const formControl of formControls) {\n      const name = formControl.name;\n      if (!name || !formControl.isCollectable()) continue;\n\n      const value = formControl.collectValue();\n\n      if (\n        ignoreEmptyValues &&\n        ([null, undefined, \"\"].includes(value) ||\n          (Array.isArray(value) && value.length === 0))\n      )\n        continue;\n\n      if (\n        (values[name] || formControl.multiple) &&\n        !Array.isArray(values[name]) &&\n        !Array.isArray(value)\n      ) {\n        values[name] = values[name] ? [values[name]] : [];\n      }\n\n      if (Array.isArray(values[name])) {\n        values[name].push(value);\n      } else {\n        values[name] = value;\n      }\n    }\n\n    return values;\n  }\n\n  public formData(): FormData {\n    const formData: FormData = new FormData();\n\n    const values = this.collectValues();\n\n    for (const name in values) {\n      const value = values[name];\n      const formControlName = toInputName(name);\n\n      if (Array.isArray(value)) {\n        for (const item of value) {\n          formData.append(`${formControlName}[]`, item);\n        }\n        continue;\n      } else if (isPlainObject(value)) {\n        for (const key in value) {\n          formData.append(`${formControlName}[${key}]`, value[key]);\n        }\n        continue;\n      }\n\n      formData.append(formControlName, value);\n    }\n\n    return formData;\n  }\n\n  public controls(formControls: string[] = []): FormControl[] {\n    if (formControls?.length === 0) return this.formControls;\n\n    return this.formControls.filter((formControl) =>\n      formControls.includes(formControl.name)\n    );\n  }\n\n  /**\n   * Shared submit pipeline. Web overrides `triggerSubmit` to also call\n   * `preventDefault`/`stopPropagation` on the DOM event before delegating here.\n   */\n  protected async handleSubmit(event?: React.FormEvent) {\n    await this.validate();\n\n    if (this.isValidForm === false) return;\n\n    if (this.isSubmitting()) return;\n\n    if (this.props.onSubmit) {\n      this.submitting(true);\n\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      const form = this;\n      this.props.onSubmit({\n        form: this,\n        event,\n        get values() {\n          return form.values();\n        },\n        get formData() {\n          return form.formData();\n        },\n      });\n    }\n\n    this.trigger(\"submit\", this);\n  }\n}\n\n// create a function that receives an object\n// each key is a dot notation syntax\n// return an object with nested objects\n// if the key is a dot notation syntax, then create a nested object\n// if a segment of the key is a number, then create an array\n// if the key is a number, then create an array\n// i.e name.0.text => { name: [{ text: 'value' }] }\n// name.firstName => { name: { firstName: 'value' } }\n// name.addresses.0.city => { name: { addresses: [{ city: 'value' }] } }\nfunction createNestedObjectFromDotNotation(object: any) {\n  const result: any = {};\n\n  for (const key in object) {\n    const value = object[key];\n\n    if (key.includes(\".\")) {\n      const nestedName = key.split(\".\");\n      const nestedNameLength = nestedName.length;\n\n      let nestedObject = result;\n\n      for (let i = 0; i < nestedNameLength; i++) {\n        const nestedNamePart = nestedName[i];\n        const isLastSegment = i === nestedNameLength - 1;\n        const nextSegment = nestedName[i + 1];\n\n        if (!nestedObject[nestedNamePart]) {\n          if (isLastSegment) {\n            nestedObject[nestedNamePart] = value;\n            continue;\n          }\n\n          if (nextSegment && !isNaN(Number(nextSegment))) {\n            nestedObject[nestedNamePart] = [];\n          } else {\n            nestedObject[nestedNamePart] = {};\n          }\n        }\n\n        nestedObject = nestedObject[nestedNamePart];\n      }\n    } else {\n      result[key] = value;\n    }\n  }\n\n  return result;\n}\n","import React from \"react\";\r\nimport type { FormContextDefinition } from \"../types\";\r\n\r\nexport const FormContext = React.createContext<FormContextDefinition>(null);\r\n","import React from \"react\";\nimport { getFormConfig } from \"../configurations\";\nimport { FormContext } from \"../contexts/FormContext\";\nimport { FormInterface, FormProps } from \"./../types\";\nimport { BaseForm } from \"./BaseForm\";\n\n/**\n * Web form. Renders an HTML `<form>` element by default and handles the DOM\n * submit event (including the `requestSubmit` polyfill).\n */\nexport class Form extends BaseForm implements FormInterface {\n  public formElement!: HTMLFormElement;\n\n  public submit() {\n    if (!this.formElement) return;\n\n    if (this.isSubmitting()) return;\n\n    if (this.formElement.requestSubmit) {\n      this.formElement.requestSubmit();\n    } else {\n      // polyfill for Edge and bloody safari\n      const submitter = document.createElement(\"input\");\n      submitter.type = \"submit\";\n      submitter.style.display = \"none\";\n      this.formElement.appendChild(submitter);\n      submitter.click();\n      this.formElement.removeChild(submitter);\n    }\n  }\n\n  /**\n   * onSubmit handler bound to the rendered `<form>` element. Cancels the\n   * browser-default submit before delegating to the shared pipeline.\n   */\n  protected async triggerSubmit(e: React.FormEvent) {\n    e.preventDefault();\n    e.stopPropagation();\n\n    await this.handleSubmit(e);\n  }\n\n  public render() {\n    const {\n      id = \"form-\" + this.formId,\n      onError: _e,\n      onSubmit: _s,\n      component: Component = getFormConfig(\"formComponent\", \"form\"),\n      children,\n      ignoreEmptyValues: _ignoreEmptyValues,\n      ...otherProps\n    } = this.props as FormProps;\n\n    return (\n      <FormContext.Provider value={this}>\n        <Component\n          ref={(form: any) => {\n            this.formElement = form ? form.root || form : form;\n          }}\n          id={id}\n          noValidate\n          onSubmit={this.triggerSubmit.bind(this) as any}\n          {...otherProps}\n        >\n          {children}\n        </Component>\n      </FormContext.Provider>\n    );\n  }\n}\n","import React, { useMemo, useState } from \"react\";\r\nimport { FormControlOptions, FormControlProps } from \"../types\";\r\n\r\nexport function useId(data: { id?: string; name: string }) {\r\n  return useMemo(() => {\r\n    if (data.id) return data.id;\r\n\r\n    const name = data.name\r\n      // replace all . to -\r\n      .replace(/\\./g, \"-\")\r\n      // remove any non-alphanumeric characters\r\n      .replace(/[^a-zA-Z0-9-]/g, \"\")\r\n      // reduce any dashes to a single dash\r\n      .replace(/-+/g, \"-\")\r\n      // remove any leading or trailing dashes\r\n      .replace(/^-+|-+$/g, \"\");\r\n\r\n    if (data.name) return `input-${name}`;\r\n\r\n    return \"input-\" + Math.random().toString(36).substring(2, 9);\r\n  }, [data.id, data.name]);\r\n}\r\n\r\nexport function useValue<T>(\r\n  props: FormControlProps,\r\n  options: FormControlOptions\r\n): [T, React.Dispatch<React.SetStateAction<T>>] {\r\n  const [value, setValue] = useState<T>(() => {\r\n    if (![undefined, null].includes(props.value)) {\r\n      return options.transformValue?.(props.value);\r\n    }\r\n\r\n    if (![undefined, null].includes(props.defaultValue)) {\r\n      return options.transformValue?.(props.defaultValue);\r\n    }\r\n\r\n    return props.multiple ? [] : \"\";\r\n  });\r\n\r\n  return [value, setValue];\r\n}\r\n\r\nexport function useError(): [\r\n  React.ReactNode,\r\n  (error: React.ReactNode) => void\r\n] {\r\n  const [error, errorUpdater] = useState<React.ReactNode>(null);\r\n\r\n  return [\r\n    error,\r\n    (error: React.ReactNode): void => {\r\n      errorUpdater(error);\r\n    },\r\n  ];\r\n}\r\n\r\nexport function useChecked(props: any) {\r\n  const [isChecked, setChecked] = useState(() => {\r\n    if (props.checked !== undefined) {\r\n      return Boolean(props.checked);\r\n    }\r\n\r\n    if (props.defaultChecked !== undefined) {\r\n      return Boolean(props.defaultChecked);\r\n    }\r\n\r\n    return false;\r\n  });\r\n\r\n  return [isChecked, setChecked] as const;\r\n}\r\n","import { useContext } from \"react\";\r\nimport { FormContext } from \"../contexts/FormContext\";\r\nimport { FormContextData } from \"../types\";\r\n\r\nexport function useForm(): FormContextData {\r\n  return useContext<FormContextData>(FormContext);\r\n}\r\n","import events, { EventSubscription } from \"@mongez/events\";\r\nimport { get } from \"@mongez/reinforcements\";\r\nimport { ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport {\r\n  FormContextData,\r\n  FormControl,\r\n  FormControlChangeOptions,\r\n  FormControlHook,\r\n  FormControlOptions,\r\n  FormControlProps,\r\n  InputRuleOptions,\r\n} from \"../types\";\r\nimport { useId } from \"./form-hooks\";\r\nimport { useForm } from \"./useForm\";\r\n\r\nexport const defaultFormControlOptions = {\r\n  collectUnchecked: true,\r\n  uncheckedValue: false,\r\n  transformValue: (value, formControl) => {\r\n    if (formControl?.multiple && !Array.isArray(value)) {\r\n      return [value];\r\n    }\r\n\r\n    return value;\r\n  },\r\n};\r\n\r\nconst isDomAvailable = () =>\r\n  typeof document !== \"undefined\" && typeof window !== \"undefined\";\r\n\r\nconst isElementOrAncestorHidden = (element: HTMLElement) => {\r\n  if (!element) {\r\n    return false;\r\n  }\r\n\r\n  if (element.hidden) {\r\n    return true;\r\n  }\r\n\r\n  if (!element.parentElement) {\r\n    return false;\r\n  }\r\n\r\n  return isElementOrAncestorHidden(element.parentElement);\r\n};\r\n\r\nconst initializeValue = (\r\n  props: FormControlProps,\r\n  options: FormControlOptions,\r\n  form: FormContextData\r\n) => {\r\n  if (![undefined, null].includes(props.value)) {\r\n    return options.transformValue?.(props.value);\r\n  }\r\n\r\n  if (![undefined, null].includes(props.defaultValue)) {\r\n    return options.transformValue?.(props.defaultValue);\r\n  }\r\n\r\n  if (form && props.name) {\r\n    const value = getFormDefaultValue(form, props.name);\r\n\r\n    if (value !== undefined) return value;\r\n  }\r\n\r\n  return props.multiple ? [] : \"\";\r\n};\r\n\r\nfunction getFormDefaultValue(form: FormContextData, name: string) {\r\n  if (!form || !name) return;\r\n\r\n  const value = get(form.defaultValue, name);\r\n\r\n  if (value !== undefined) return value;\r\n\r\n  return;\r\n}\r\n\r\nexport function useFormControl<T extends FormControlProps>(\r\n  baseProps: T,\r\n  incomingFormControlOptions: FormControlOptions = {}\r\n) {\r\n  const {\r\n    id: incomingId,\r\n    name: incomingName,\r\n    onChange,\r\n    rules = [],\r\n    errors = {},\r\n    type = \"text\",\r\n    errorKeys = {},\r\n    onError,\r\n    disabled: incomingDisabled,\r\n    validate: incomingValidate,\r\n    value: incomingValue,\r\n    defaultValue: _dv,\r\n    checked: _checked,\r\n    defaultChecked: _defaultChecked,\r\n    ...props\r\n  } = baseProps;\r\n\r\n  const name = useMemo(\r\n    () =>\r\n      String(incomingName)\r\n        .replace(\"][\", \".\")\r\n        .replace(\"[\", \".\")\r\n        .replace(\"]\", \"\"),\r\n    [incomingName]\r\n  );\r\n\r\n  const id = useId({\r\n    id: incomingId,\r\n    name,\r\n  });\r\n\r\n  const formControlOptions = {\r\n    ...defaultFormControlOptions,\r\n    ...incomingFormControlOptions,\r\n  };\r\n\r\n  const [disabled, setDisabled] = useState(Boolean(incomingDisabled));\r\n\r\n  const inputRef = useRef<any>();\r\n  const visibleElementRef = useRef<any>();\r\n  const form = useForm();\r\n\r\n  const [state, setState] = useState<{\r\n    error: ReactNode;\r\n    value: any;\r\n    checked: boolean;\r\n  }>(() => {\r\n    return {\r\n      error: null,\r\n      value: initializeValue(baseProps, formControlOptions, form),\r\n      checked:\r\n        _checked ??\r\n        (_defaultChecked !== undefined\r\n          ? _defaultChecked\r\n          : getFormDefaultValue(form, name) ??\r\n            (type === \"checkbox\" ? false : undefined)),\r\n    };\r\n  });\r\n\r\n  const { value, checked, error } = state;\r\n\r\n  const updateError = (error: ReactNode) => {\r\n    setState((state) => ({\r\n      ...state,\r\n      error,\r\n    }));\r\n  };\r\n\r\n  const setError = (error: ReactNode) => {\r\n    updateError(error);\r\n    onError?.(error);\r\n  };\r\n\r\n  const setValue = (value = formControl.value) => {\r\n    setState((state) => ({\r\n      ...state,\r\n      value,\r\n    }));\r\n  };\r\n\r\n  const validateFormControl = () => {\r\n    const error = validate();\r\n\r\n    setError(error);\r\n\r\n    updateFormControlValidityState(error);\r\n\r\n    return error;\r\n  };\r\n\r\n  const updateFormControlValidityState = (error: any) => {\r\n    formControl.error = error;\r\n    formControl.isValid = !error;\r\n\r\n    if (error) {\r\n      form?.invalidControl(formControl);\r\n    } else {\r\n      form?.validControl(formControl);\r\n    }\r\n\r\n    form?.checkIfIsValid();\r\n  };\r\n\r\n  const validateAndSetValue = () => {\r\n    const error = validate();\r\n\r\n    if (error) {\r\n      onError?.(error);\r\n\r\n      setState((state) => ({\r\n        ...state,\r\n        value: formControl.value,\r\n        error,\r\n      }));\r\n    } else {\r\n      setState((state) => ({\r\n        ...state,\r\n        value: formControl.value,\r\n        error: null,\r\n      }));\r\n    }\r\n\r\n    updateFormControlValidityState(error);\r\n  };\r\n\r\n  const validateAndSetChecked = () => {\r\n    const error = validate();\r\n\r\n    if (error) {\r\n      onError?.(error);\r\n\r\n      setState((state) => ({\r\n        ...state,\r\n        checked: formControl.checked,\r\n        error,\r\n      }));\r\n    } else {\r\n      setState((state) => ({\r\n        ...state,\r\n        checked: formControl.checked,\r\n        error: null,\r\n      }));\r\n    }\r\n\r\n    updateFormControlValidityState(error);\r\n  };\r\n\r\n  const validate = () => {\r\n    if (!errorKeys.name) {\r\n      errorKeys.name = String(baseProps.label || baseProps.placeholder || name);\r\n    }\r\n\r\n    const validationData: InputRuleOptions = {\r\n      ...baseProps,\r\n      value: formControl.value,\r\n      name,\r\n      checked: formControl.checked,\r\n      formControl,\r\n      errorKeys,\r\n      form,\r\n    };\r\n\r\n    let validationError: ReactNode | Promise<ReactNode> | null;\r\n\r\n    const validatingRules = [...rules];\r\n\r\n    formControl.errorsList = {};\r\n\r\n    if (incomingValidate) {\r\n      validatingRules.unshift({\r\n        validate: incomingValidate,\r\n        name: \"custom\",\r\n        requiresValue: true,\r\n      });\r\n    }\r\n\r\n    for (const rule of validatingRules) {\r\n      if (rule.requiresType && rule.requiresType !== formControl.type) continue;\r\n\r\n      const requiresValue =\r\n        rule.requiresValue === undefined || rule.requiresValue;\r\n\r\n      if (requiresValue && [undefined, null, \"\"].includes(formControl.value)) {\r\n        continue;\r\n      }\r\n\r\n      validationError = rule.validate(validationData);\r\n\r\n      if (validationError) {\r\n        if (validationError instanceof Promise) {\r\n          validationError.then((error: ReactNode) => {\r\n            formControl.errorsList[rule.name || \"custom\"] = error;\r\n            setError(error);\r\n          });\r\n        } else {\r\n          const ruleName = rule.name || \"custom\";\r\n          const errorMessage = errors[ruleName] || validationError;\r\n\r\n          formControl.errorsList[ruleName] = errorMessage;\r\n\r\n          if (!incomingFormControlOptions.validateAll) {\r\n            return errorMessage;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    if (\r\n      Object.keys(formControl.errorsList).length > 0 &&\r\n      !incomingFormControlOptions.validateAll\r\n    ) {\r\n      return Object.keys(formControl.errorsList).map(\r\n        (key) => formControl.errorsList[key]\r\n      );\r\n    }\r\n\r\n    return null;\r\n  };\r\n\r\n  const formControl: FormControl = useMemo(() => {\r\n    const formControlData: FormControl = {\r\n      initialValue: value,\r\n      initialChecked: checked,\r\n      collectUnchecked: formControlOptions.collectUnchecked,\r\n      uncheckedValue: formControlOptions.uncheckedValue,\r\n      value,\r\n      isDirty: false,\r\n      errorsList: {},\r\n      isTouched: false,\r\n      isControlled:\r\n        baseProps.value !== undefined || baseProps.checked !== undefined,\r\n      id,\r\n      name,\r\n      checked,\r\n      defaultValue: _dv,\r\n      disabled,\r\n      isValid: null, // null means not validated yet\r\n      disable(isDisabled) {\r\n        isDisabled = Boolean(isDisabled);\r\n        setDisabled(isDisabled);\r\n        formControl.disabled = isDisabled;\r\n      },\r\n      type,\r\n      inputRef,\r\n      rendered: false,\r\n      visibleElementRef,\r\n      error,\r\n      setError,\r\n      props: baseProps,\r\n      setChecked: (checked: boolean) => {\r\n        formControl.checked = checked;\r\n        formControl.isDirty = true;\r\n\r\n        // if (formControl.isControlled) {\r\n        //   onChange?.(checked);\r\n        //   return;\r\n        // }\r\n\r\n        validateAndSetChecked();\r\n\r\n        onChange?.(checked, {\r\n          formControl,\r\n        });\r\n\r\n        events.trigger(`form.control.${id}.change`, formControl);\r\n      },\r\n      isVisible: () => {\r\n        // On non-DOM platforms (e.g. React Native) we cannot inspect the\r\n        // rendered tree for visibility, so treat every control as visible.\r\n        if (!isDomAvailable()) return true;\r\n        return isElementOrAncestorHidden(visibleElementRef.current) === false;\r\n      },\r\n      focus: () => {\r\n        inputRef.current?.focus();\r\n      },\r\n      blur: () => {\r\n        inputRef.current?.blur();\r\n      },\r\n      clear: () => {\r\n        formControl.change(formControl.multiple ? [] : \"\", {\r\n          updateState: true,\r\n          validate: false,\r\n          checked: false,\r\n        });\r\n\r\n        formControl.setError(null);\r\n        formControl.isValid = null;\r\n        formControl.isDirty = false;\r\n        formControl.isTouched = false;\r\n\r\n        events.trigger(`form.control.${id}.clear`, formControl);\r\n      },\r\n      reset: () => {\r\n        // Clear the dirty flag BEFORE firing change() so the form-level\r\n        // listener registered in BaseForm.register sees `isDirty === false`\r\n        // and removes this control from `dirtyControls`. We pass\r\n        // `dirty: false` so change() does not clobber the flag back to true.\r\n        formControl.isDirty = false;\r\n\r\n        formControl.change(formControl.initialValue, {\r\n          checked: formControl.initialChecked,\r\n          updateState: true,\r\n          validate: false,\r\n          dirty: false,\r\n        });\r\n\r\n        formControl.setError(null);\r\n        formControl.isValid = null;\r\n        formControl.isDirty = false;\r\n        formControl.isTouched = false;\r\n\r\n        events.trigger(`form.control.${id}.reset`, formControl);\r\n      },\r\n      multiple: formControlOptions.multiple,\r\n      validate: validateFormControl,\r\n      change(\r\n        value,\r\n        {\r\n          updateState = true,\r\n          validate = true,\r\n          dirty = true,\r\n          ...other\r\n        }: FormControlChangeOptions = {}\r\n      ) {\r\n        if (value !== undefined) {\r\n          value = formControlOptions.transformValue?.(value, formControl);\r\n          formControl.value = value;\r\n        }\r\n\r\n        if (typeof other.checked !== \"undefined\") {\r\n          formControl.checked = other.checked;\r\n        }\r\n\r\n        formControl.isDirty = dirty;\r\n\r\n        events.trigger(`form.control.${id}.change`, {\r\n          value: formControl.value,\r\n          checked: formControl.checked,\r\n          ...other,\r\n          formControl,\r\n        });\r\n\r\n        if (updateState) {\r\n          if (validate) {\r\n            validateAndSetValue();\r\n          } else {\r\n            setValue(value);\r\n          }\r\n        }\r\n      },\r\n      onChange: (callback: any) => {\r\n        return events.subscribe(`form.control.${id}.change`, callback);\r\n      },\r\n      onDestroy: (callback: any) => {\r\n        return events.subscribe(`form.control.${id}.destroy`, callback);\r\n      },\r\n      onReset: (callback: any) => {\r\n        return events.subscribe(`form.control.${id}.reset`, callback);\r\n      },\r\n      unregister() {\r\n        events.trigger(`form.control.${id}.destroy`, formControl);\r\n      },\r\n      isCollectable() {\r\n        if (formControlOptions.isCollectable) {\r\n          return formControlOptions.isCollectable(formControl);\r\n        }\r\n\r\n        if (formControl.disabled) return false;\r\n\r\n        if (\r\n          [\"checkbox\", \"radio\"].includes(formControl.type) &&\r\n          !formControl.checked\r\n        ) {\r\n          return Boolean(formControlOptions.collectUnchecked);\r\n        }\r\n\r\n        return formControl.value !== undefined && formControl.value !== null;\r\n      },\r\n      collectValue() {\r\n        if (formControlOptions.collectValue) {\r\n          return formControlOptions.collectValue(formControl);\r\n        }\r\n\r\n        if ([\"checkbox\", \"radio\"].includes(formControl.type)) {\r\n          if (\r\n            !formControl.checked &&\r\n            formControlOptions.uncheckedValue !== undefined\r\n          ) {\r\n            return formControlOptions.uncheckedValue;\r\n          } else if (formControl.checked) {\r\n            return formControl.value || true;\r\n          }\r\n\r\n          return false;\r\n        }\r\n\r\n        if (formControl.multiple && !Array.isArray(value)) {\r\n          return [value];\r\n        }\r\n\r\n        return formControl.value;\r\n      },\r\n    };\r\n\r\n    return formControlData;\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  // Hold a stable reference to the latest rest props so the `onInit` effect\r\n  // below does not need `props` (a fresh object every render) as a dep.\r\n  const latestPropsRef = useRef(props);\r\n  latestPropsRef.current = props;\r\n\r\n  // Build a stable identity for `rules` so consumers passing a fresh\r\n  // array literal each render do not retrigger the `onInit` subscription\r\n  // loop below. Two arrays with the same rule names (in the same order)\r\n  // are treated as equal.\r\n  const rulesKey = useMemo(\r\n    () => rules.map((rule, index) => rule.name ?? `__anonymous_${index}`).join(\"|\"),\r\n    [rules]\r\n  );\r\n\r\n  useEffect(() => {\r\n    // now find all rules that have onInit method and call it\r\n    const subscriptions: EventSubscription[] = [];\r\n    for (const rule of rules) {\r\n      if ((rule as any).onInit) {\r\n        const output = (rule as any).onInit({\r\n          formControl,\r\n          form,\r\n          ...latestPropsRef.current,\r\n        });\r\n\r\n        if (output) {\r\n          subscriptions.push(output);\r\n        }\r\n      }\r\n    }\r\n\r\n    return () => {\r\n      subscriptions.forEach((subscription) => subscription?.unsubscribe());\r\n    };\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [form, formControl, rulesKey]);\r\n\r\n  const changeValue = (value: any, options: any) => {\r\n    formControl.change(value, {\r\n      ...options,\r\n      updateState: !formControl.isControlled,\r\n    });\r\n\r\n    onChange?.(value, {\r\n      ...options,\r\n      formControl,\r\n    });\r\n  };\r\n\r\n  useEffect(() => {\r\n    if (!formControl.isControlled || formControl.rendered === false) return;\r\n\r\n    formControl.change(incomingValue);\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [incomingValue]);\r\n\r\n  useEffect(() => {\r\n    if (!formControl.isControlled || formControl.rendered === false) {\r\n      return;\r\n    }\r\n\r\n    formControl.checked = _checked;\r\n    formControl.isDirty = true;\r\n\r\n    validateAndSetChecked();\r\n\r\n    // onChange?.(checked);\r\n\r\n    events.trigger(`form.control.${id}.change`, formControl);\r\n\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [_checked]);\r\n\r\n  useEffect(() => {\r\n    formControl.disable(Boolean(incomingDisabled));\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, [incomingDisabled]);\r\n\r\n  useEffect(() => {\r\n    // Check if the form control is touched.\r\n    // This hook auto-binds a `focus` listener on the DOM input to mark the\r\n    // control as touched. On React Native there is no DOM, so we skip it —\r\n    // native inputs should set `formControl.isTouched = true` from their\r\n    // own `onFocus` handler if touched-state tracking is needed.\r\n    if (formControl.isTouched) return;\r\n    if (!isDomAvailable()) return;\r\n\r\n    const input: HTMLInputElement | undefined =\r\n      formControl.inputRef?.current || document.getElementById(formControl.id);\r\n\r\n    if (!input || typeof (input as any).addEventListener !== \"function\") return;\r\n\r\n    const updateTouchState = () => (formControl.isTouched = true);\r\n\r\n    input.addEventListener(\"focus\", updateTouchState);\r\n\r\n    return () => {\r\n      input.removeEventListener(\"focus\", updateTouchState);\r\n    };\r\n  }, [formControl]);\r\n\r\n  useEffect(() => {\r\n    setTimeout(() => {\r\n      formControl.rendered = true;\r\n    }, 0);\r\n\r\n    let resetEvent: EventSubscription | undefined;\r\n    if (form) {\r\n      form.register(formControl);\r\n      resetEvent = form.on(\"reset\", formControl.reset);\r\n    }\r\n\r\n    return () => {\r\n      if (form) {\r\n        form.unregister(formControl);\r\n      } else {\r\n        formControl.unregister();\r\n      }\r\n\r\n      resetEvent?.unsubscribe();\r\n    };\r\n  }, [form, formControl, name]);\r\n\r\n  const outputProps = useMemo(() => {\r\n    let finalProps = { ...props };\r\n\r\n    const except = (props: any, keys: string[]) => {\r\n      const newProps = { ...props };\r\n      for (const key of keys) {\r\n        delete newProps[key];\r\n      }\r\n      return newProps;\r\n    };\r\n\r\n    for (const rule of rules) {\r\n      if (rule.preservedProps) {\r\n        finalProps = except(finalProps, rule.preservedProps);\r\n      }\r\n    }\r\n\r\n    return finalProps;\r\n  }, [rules, props]);\r\n\r\n  const output: FormControlHook = {\r\n    id,\r\n    name,\r\n    value,\r\n    type,\r\n    error,\r\n    setError,\r\n    inputRef,\r\n    visibleElementRef,\r\n    formControl,\r\n    validate,\r\n    changeValue,\r\n    checked,\r\n    disabled,\r\n    errorsList: formControl.errorsList,\r\n    disable: formControl.disable.bind(formControl, true),\r\n    enable: formControl.disable.bind(formControl, false),\r\n    setChecked: formControl.setChecked.bind(formControl),\r\n    otherProps: outputProps,\r\n    get isInvalid() {\r\n      return formControl.isTouched && formControl.isValid === false;\r\n    },\r\n  };\r\n\r\n  return output;\r\n}\r\n","import React from \"react\";\r\n\r\nexport function useInputValue<T>(initialValue: T) {\r\n  const [value, setValue] = React.useState<T>(initialValue);\r\n\r\n  const valueDetector: (e: any) => void = (e: any): void => {\r\n    if (e === 0) {\r\n      setValue(e);\r\n    } else if (!e) {\r\n      setValue(\"\" as T);\r\n    } else if (e.target?.value !== undefined) {\r\n      setValue(e.target.value);\r\n    } else if (e.value !== undefined) {\r\n      setValue(e.value);\r\n    } else {\r\n      setValue(e);\r\n    }\r\n  };\r\n\r\n  const returnedState: [T, (e: any) => void] = [value, valueDetector];\r\n\r\n  return returnedState;\r\n}\r\n","import { createContext, useContext } from \"react\";\r\n\r\ntype Value = string | number | boolean;\r\n\r\nexport type RadioGroupContextOptions = {\r\n  value: Value;\r\n  changeValue: (value: Value) => void;\r\n};\r\n\r\nexport const RadioGroupContext = createContext<RadioGroupContextOptions>({\r\n  value: \"\",\r\n  changeValue: () => {},\r\n});\r\n\r\nexport type RadioInputHookOutput = {\r\n  isSelected: boolean;\r\n  changeValue: () => void;\r\n};\r\n\r\nexport function useRadioInput(value: Value): RadioInputHookOutput {\r\n  const context = useContext(RadioGroupContext);\r\n\r\n  if (!context) {\r\n    throw new Error(\"useRadioInput must be used within a RadioGroupContext\");\r\n  }\r\n\r\n  const { value: groupValue, changeValue } = context;\r\n\r\n  return {\r\n    isSelected: groupValue === value,\r\n    changeValue: () => changeValue(value),\r\n  };\r\n}\r\n","import { useEffect, useState } from \"react\";\r\nimport { useForm } from \"./useForm\";\r\n\r\nexport function useSubmitButton() {\r\n  const [isSubmitting, setSubmitState] = useState(false);\r\n  const [disabled, disable] = useState(false);\r\n  const form = useForm();\r\n  const [isDirty, setIsDirty] = useState(form?.isDirty ?? false);\r\n\r\n  useEffect(() => {\r\n    if (!form) return;\r\n\r\n    const onSubmit = form.on(\"submit\", () => {\r\n      setSubmitState(form.isSubmitting());\r\n      disable(form.isSubmitting());\r\n    });\r\n\r\n    const inValidControls = form.on(\"invalidControls\", () => {\r\n      disable(true);\r\n    });\r\n\r\n    const isDisabledEvent = form.on(\"disable\", disable as any);\r\n    const validControl = form.on(\"validControls\", () => disable(false));\r\n    const resetEvent = form.on(\"reset\", () => disable(false));\r\n    const dirtyEvent = form.on(\"dirty\", () => setIsDirty(form.isDirty));\r\n\r\n    return () => {\r\n      onSubmit.unsubscribe();\r\n      validControl.unsubscribe();\r\n      inValidControls.unsubscribe();\r\n      isDisabledEvent.unsubscribe();\r\n      resetEvent.unsubscribe();\r\n      dirtyEvent.unsubscribe();\r\n    };\r\n  }, [form]);\r\n\r\n  return {\r\n    isSubmitting,\r\n    disabled,\r\n    disable,\r\n    setSubmitState,\r\n    isDirty,\r\n  };\r\n}\r\n","import { useFormControl } from \"../hooks\";\r\nimport { HiddenInputProps } from \"../types\";\r\n\r\nexport function HiddenInput(props: HiddenInputProps) {\r\n  useFormControl(props);\r\n\r\n  return null;\r\n}\r\n","import React from \"react\";\nimport { FormContext } from \"../contexts/FormContext\";\nimport { FormInterface, FormProps } from \"./../types\";\nimport { BaseForm } from \"./BaseForm\";\n\n/**\n * React Native form. Renders no host element by default (just a Fragment)\n * so it does not depend on `react-native` being installed; pass a\n * `component` prop (e.g. `View`) to wrap children with a host view.\n *\n * Use the same `Form` API otherwise — registration, validation, values\n * collection, events, and the `FormContext` are all identical to the web\n * `Form`.\n */\nexport class NativeForm extends BaseForm implements FormInterface {\n  public formElement: any = null;\n\n  public submit() {\n    if (this.isSubmitting()) return;\n\n    this.handleSubmit();\n  }\n\n  public render() {\n    const {\n      onError: _e,\n      onSubmit: _s,\n      component: Component,\n      children,\n      ignoreEmptyValues: _ignoreEmptyValues,\n      defaultValue: _defaultValue,\n      id: _id,\n      ...otherProps\n    } = this.props as FormProps;\n\n    const content = Component ? (\n      <Component\n        ref={(node: any) => {\n          this.formElement = node;\n        }}\n        {...otherProps}\n      >\n        {children}\n      </Component>\n    ) : (\n      <>{children}</>\n    );\n\n    return (\n      <FormContext.Provider value={this}>{content}</FormContext.Provider>\n    );\n  }\n}\n","export const enValidationTranslation = {\r\n  required: \"This input is required\",\r\n  email: \"Invalid Email Address\",\r\n  url: \"Invalid URL\",\r\n  min: \"Value can not be lower than :min\",\r\n  max: \"Value can not be greater than :max\",\r\n  match: \"This input is not matching with :matchingInput\",\r\n  length: \"This input should have :length characters\",\r\n  minLength: \"This input can not be less than :length characters\",\r\n  maxLength: \"This input can not be greater than :length characters\",\r\n  pattern: \"This input is not matching with the :pattern\",\r\n  number: \"This input accepts only numbers\",\r\n  integer: \"This input accepts only integer digits\",\r\n  float: \"This input accepts only integer or float digits\",\r\n  alphabet: \"This input accepts only alphabets\",\r\n  strongMinLength: \"Password must be at least :length characters\",\r\n  strongUppercase: \"Password must contain an uppercase letter\",\r\n  strongLowercase: \"Password must contain a lowercase letter\",\r\n  strongDigit: \"Password must contain a number\",\r\n  strongSymbol: \"Password must contain a symbol\",\r\n};\r\n\r\nexport const arValidationTranslation = {\r\n  required: \"هذا الحقل مطلوب\",\r\n  email: \"بريد الكتروني خاطئ\",\r\n  url: \"رابط غير صحيح\",\r\n  min: \"القيمة يجب أن لا تقل عن :min\",\r\n  max: \"القيمة يجب أن لا تزيد عن :max\",\r\n  match: \"هذا الحقل غير متطابق مع :matchingInput\",\r\n  length: \"حروف الحقل يجب ان تساوي :length\",\r\n  minLength: \"هذا الحقل يجب ألا يقل عن :length حرف\",\r\n  maxLength: \"هذا الحقل يجب ألا يزيد عن :length حرف\",\r\n  pattern: \"هذا الحقل غير مطابق :pattern\",\r\n  number: \"هذا الحقل لا يقبل غير أرقام فقط\",\r\n  integer: \"هذا الحقل لا يقبل غير أرقام صحيحة\",\r\n  float: \"هذا الحقل لا يقبل غير أرقام صحيحة او عشرية\",\r\n  alphabet: \"هذا الحقل لا يقبل غير أحرف فقط\",\r\n  strongMinLength: \"يجب أن تتكون كلمة المرور من :length حروف على الأقل\",\r\n  strongUppercase: \"يجب أن تحتوي كلمة المرور على حرف كبير\",\r\n  strongLowercase: \"يجب أن تحتوي كلمة المرور على حرف صغير\",\r\n  strongDigit: \"يجب أن تحتوي كلمة المرور على رقم\",\r\n  strongSymbol: \"يجب أن تحتوي كلمة المرور على رمز\",\r\n};\r\n\r\nexport const frValidationTranslation = {\r\n  required: \"Ce champ est requis\",\r\n  email: \"Adresse e-mail invalide\",\r\n  url: \"URL invalide\",\r\n  min: \"La valeur ne peut pas être inférieure à :min\",\r\n  max: \"La valeur ne peut pas être supérieure à :max\",\r\n  match: \"Ce champ ne correspond pas à :matchingInput\",\r\n  length: \"Ce champ doit avoir :length caractères\",\r\n  minLength: \"Ce champ ne peut pas être inférieur à :length caractères\",\r\n  maxLength: \"Ce champ ne peut pas être supérieur à :length caractères\",\r\n  pattern: \"Ce champ ne correspond pas au :pattern\",\r\n  number: \"Ce champ ne peut contenir que des chiffres\",\r\n  integer: \"Ce champ ne peut contenir que des chiffres entiers\",\r\n  float: \"Ce champ ne peut contenir que des chiffres entiers ou décimaux\",\r\n  alphabet: \"Ce champ ne peut contenir que des lettres\",\r\n  strongMinLength: \"Le mot de passe doit contenir au moins :length caractères\",\r\n  strongUppercase: \"Le mot de passe doit contenir une lettre majuscule\",\r\n  strongLowercase: \"Le mot de passe doit contenir une lettre minuscule\",\r\n  strongDigit: \"Le mot de passe doit contenir un chiffre\",\r\n  strongSymbol: \"Le mot de passe doit contenir un symbole\",\r\n};\r\n\r\nexport const esValidationTranslation = {\r\n  required: \"Este campo es obligatorio\",\r\n  email: \"Dirección de correo electrónico no válida\",\r\n  url: \"URL no válida\",\r\n  min: \"El valor no puede ser inferior a :min\",\r\n  max: \"El valor no puede ser superior a :max\",\r\n  match: \"Este campo no coincide con :matchingInput\",\r\n  length: \"Este campo debe tener :length caracteres\",\r\n  minLength: \"Este campo no puede ser inferior a :length caracteres\",\r\n  maxLength: \"Este campo no puede ser superior a :length caracteres\",\r\n  pattern: \"Este campo no coincide con el :pattern\",\r\n  number: \"Este campo solo acepta números\",\r\n  integer: \"Este campo solo acepta dígitos enteros\",\r\n  float: \"Este campo solo acepta dígitos enteros o decimales\",\r\n  alphabet: \"Este campo solo acepta letras\",\r\n  strongMinLength: \"La contraseña debe tener al menos :length caracteres\",\r\n  strongUppercase: \"La contraseña debe contener una letra mayúscula\",\r\n  strongLowercase: \"La contraseña debe contener una letra minúscula\",\r\n  strongDigit: \"La contraseña debe contener un número\",\r\n  strongSymbol: \"La contraseña debe contener un símbolo\",\r\n};\r\n\r\nexport const itValidationTranslation = {\r\n  required: \"Questo campo è obbligatorio\",\r\n  email: \"Indirizzo email non valido\",\r\n  url: \"URL non valido\",\r\n  min: \"Il valore non può essere inferiore a :min\",\r\n  max: \"Il valore non può essere superiore a :max\",\r\n  match: \"Questo campo non corrisponde a :matchingInput\",\r\n  length: \"Questo campo deve avere :length caratteri\",\r\n  minLength: \"Questo campo non può essere inferiore a :length caratteri\",\r\n  maxLength: \"Questo campo non può essere superiore a :length caratteri\",\r\n  pattern: \"Questo campo non corrisponde al :pattern\",\r\n  number: \"Questo campo accetta solo numeri\",\r\n  integer: \"Questo campo accetta solo cifre intere\",\r\n  float: \"Questo campo accetta solo cifre intere o decimali\",\r\n  alphabet: \"Questo campo accetta solo lettere\",\r\n  strongMinLength: \"La password deve contenere almeno :length caratteri\",\r\n  strongUppercase: \"La password deve contenere una lettera maiuscola\",\r\n  strongLowercase: \"La password deve contenere una lettera minuscola\",\r\n  strongDigit: \"La password deve contenere un numero\",\r\n  strongSymbol: \"La password deve contenere un simbolo\",\r\n};\r\n\r\nexport const deValidationTranslation = {\r\n  required: \"Dieses Feld ist erforderlich\",\r\n  email: \"Ungültige E-Mail-Adresse\",\r\n  url: \"Ungültige URL\",\r\n  min: \"Der Wert darf nicht kleiner sein als :min\",\r\n  max: \"Der Wert darf nicht größer sein als :max\",\r\n  match: \"Dieses Feld stimmt nicht mit :matchingInput überein\",\r\n  length: \"Dieses Feld sollte :length Zeichen haben\",\r\n  minLength: \"Dieses Feld darf nicht weniger als :length Zeichen haben\",\r\n  maxLength: \"Dieses Feld darf nicht mehr als :length Zeichen haben\",\r\n  pattern: \"Dieses Feld stimmt nicht mit dem :pattern überein\",\r\n  number: \"Dieses Feld akzeptiert nur Zahlen\",\r\n  integer: \"Dieses Feld akzeptiert nur ganze Zahlen\",\r\n  float: \"Dieses Feld akzeptiert nur ganze oder Dezimalzahlen\",\r\n  alphabet: \"Dieses Feld akzeptiert nur Buchstaben\",\r\n  strongMinLength: \"Das Passwort muss mindestens :length Zeichen lang sein\",\r\n  strongUppercase: \"Das Passwort muss einen Großbuchstaben enthalten\",\r\n  strongLowercase: \"Das Passwort muss einen Kleinbuchstaben enthalten\",\r\n  strongDigit: \"Das Passwort muss eine Zahl enthalten\",\r\n  strongSymbol: \"Das Passwort muss ein Symbol enthalten\",\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nexport const alphabetRule: InputRule = {\r\n  name: \"alphabet\",\r\n  requiresType: \"alphabet\",\r\n  validate: ({ value, errorKeys }) => {\r\n    if (!/^[a-zA-Z]+$/.test(value)) {\r\n      return trans(\"validation.alphabet\", { input: errorKeys.name });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nconst emailRegex =\r\n  /^(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\r\n\r\nexport const emailRule: InputRule = {\r\n  name: \"email\",\r\n  requiresType: \"email\",\r\n  validate: ({ value, errorKeys }) => {\r\n    if (!emailRegex.test(value)) {\r\n      return trans(\"validation.email\", { input: errorKeys.name });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nexport const floatRule: InputRule = {\r\n  name: \"float\",\r\n  requiresType: \"float\",\r\n  validate: ({ value, errorKeys }) => {\r\n    if (isNaN(Number(value)) && !Number.isInteger(Number(value))) {\r\n      return trans(\"validation.float\", { input: errorKeys.name });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nexport const integerRule: InputRule = {\r\n  name: \"integer\",\r\n  requiresType: \"integer\",\r\n  validate: ({ value, errorKeys }) => {\r\n    if (isNaN(Number(value)) || !Number.isInteger(Number(value))) {\r\n      return trans(\"validation.integer\", { input: errorKeys.name });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nexport const lengthRule: InputRule = {\r\n  name: \"length\",\r\n  preservedProps: [\"length\"],\r\n  validate: ({ value, length, errorKeys }) => {\r\n    if (!length || value?.length === undefined) return;\r\n\r\n    if (value.length !== length) {\r\n      return trans(\"validation.length\", { input: errorKeys.name, length });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nexport const matchRule: InputRule = {\r\n  name: \"match\",\r\n  preservedProps: [\"match\"],\r\n  onInit: ({ formControl, form, match }) => {\r\n    if (!match || !form) return;\r\n\r\n    const matchingElement = form.control(match);\r\n\r\n    if (!matchingElement) return;\r\n\r\n    return matchingElement.onChange(() => {\r\n      if (!formControl.isDirty) return;\r\n\r\n      formControl.validate();\r\n    });\r\n  },\r\n  validate: ({ value, match, form, errorKeys }) => {\r\n    if (!form) return;\r\n\r\n    const matchingElement = form.control(match);\r\n\r\n    if (!matchingElement) return;\r\n\r\n    if (matchingElement.value !== value) {\r\n      const matchingName = errorKeys.matchingElement || matchingElement.name;\r\n\r\n      return trans(\"validation.match\", {\r\n        input: errorKeys.name,\r\n        matchingInput: matchingName,\r\n      });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nexport const maxRule: InputRule = {\r\n  name: \"max\",\r\n  preservedProps: [\"max\"],\r\n  validate: ({ value, max, errorKeys }) => {\r\n    if (isNaN(max)) return;\r\n    if (value === null || value === undefined || value === \"\") return;\r\n\r\n    if (Number(value) > Number(max)) {\r\n      return trans(\"validation.max\", { input: errorKeys.name, max: max });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nexport const maxLengthRule: InputRule = {\r\n  name: \"maxLength\",\r\n  preservedProps: [\"maxLength\"],\r\n  validate: ({ value, maxLength, errorKeys }) => {\r\n    if (!maxLength || value?.length === undefined) return;\r\n\r\n    if (value.length > maxLength) {\r\n      return trans(\"validation.maxLength\", {\r\n        input: errorKeys.name,\r\n        length: maxLength,\r\n      });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nexport const minRule: InputRule = {\r\n  name: \"min\",\r\n  preservedProps: [\"min\"],\r\n  validate: ({ value, min, errorKeys }) => {\r\n    if (min === undefined) return;\r\n\r\n    if (Number(value) < Number(min)) {\r\n      return trans(\"validation.min\", { input: errorKeys.name, min: min });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nexport const minLengthRule: InputRule = {\r\n  name: \"minLength\",\r\n  preservedProps: [\"minLength\"],\r\n  validate: ({ value, minLength, errorKeys, errors }) => {\r\n    if (!minLength || value?.length === undefined) return;\r\n\r\n    if (value.length < minLength) {\r\n      return trans(errors?.minLength ?? \"validation.minLength\", {\r\n        input: errorKeys.name,\r\n        length: minLength,\r\n      });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nexport const numberRule: InputRule = {\r\n  name: \"number\",\r\n  requiresType: \"number\",\r\n  validate: ({ value, errorKeys }) => {\r\n    if (isNaN(Number(value))) {\r\n      return trans(\"validation.number\", { input: errorKeys.name });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { InputRule } from \"../types\";\r\n\r\nexport const patternRule: InputRule = {\r\n  name: \"pattern\",\r\n  preservedProps: [\"pattern\"],\r\n  validate: ({ value, pattern, errorKeys }) => {\r\n    if (!pattern) return;\r\n\r\n    const regex = new RegExp(pattern);\r\n\r\n    if (!regex.test(value)) {\r\n      return trans(\"validation.pattern\", {\r\n        input: errorKeys.name,\r\n        pattern: errorKeys.pattern || \"pattern\",\r\n      });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\r\nimport { type InputRule } from \"../types\";\r\n\r\nconst isEmpty = (value) => {\r\n  return (\r\n    value === undefined ||\r\n    value === null ||\r\n    value === \"\" ||\r\n    (Array.isArray(value) && value.length === 0)\r\n  );\r\n};\r\n\r\nexport const requiredRule: InputRule = {\r\n  name: \"required\",\r\n  preservedProps: [\"required\"],\r\n  requiresValue: false,\r\n  validate: ({ type, value, errorKeys, required, checked }) => {\r\n    if (!required) return;\r\n\r\n    if (type === \"checkbox\") {\r\n      if (!checked) {\r\n        return trans(\"validation.required\", { input: errorKeys.name });\r\n      }\r\n\r\n      return;\r\n    }\r\n\r\n    if (isEmpty(value)) {\r\n      return trans(\"validation.required\", { input: errorKeys.name });\r\n    }\r\n  },\r\n};\r\n","import { trans } from \"@mongez/localization\";\nimport { ReactNode } from \"react\";\nimport { type InputRule } from \"../types\";\n\n/**\n * Configurable strong-password criteria.\n *\n * Pass as the value of the `strong` prop on a form control:\n *\n * - `<TextInput strong />`                  — apply all defaults\n * - `<TextInput strong={{ symbol: false }}` — selectively disable a criterion\n * - `<TextInput strong={{ minLength: 10 }}` — override a numeric criterion\n */\nexport type StrongPasswordCriteria = {\n  /**\n   * Minimum password length. Set to 0 (or falsy) to disable the length check.\n   * @default 8\n   */\n  minLength?: number;\n  /**\n   * Require at least one uppercase letter (A-Z).\n   * @default true\n   */\n  uppercase?: boolean;\n  /**\n   * Require at least one lowercase letter (a-z).\n   * @default true\n   */\n  lowercase?: boolean;\n  /**\n   * Require at least one digit (0-9).\n   * @default true\n   */\n  digit?: boolean;\n  /**\n   * Require at least one non-alphanumeric character.\n   * @default true\n   */\n  symbol?: boolean;\n};\n\nconst defaultCriteria: Required<StrongPasswordCriteria> = {\n  minLength: 8,\n  uppercase: true,\n  lowercase: true,\n  digit: true,\n  symbol: true,\n};\n\n/**\n * Validates a strong password against five composable criteria:\n *\n *   - `strong.minLength` — minimum length (default 8)\n *   - `strong.uppercase` — at least one uppercase letter\n *   - `strong.lowercase` — at least one lowercase letter\n *   - `strong.digit`     — at least one digit\n *   - `strong.symbol`    — at least one non-alphanumeric character\n *\n * Each failing criterion is also written individually into\n * `formControl.errorsList` under the namespaced key (e.g. `strong.uppercase`)\n * so consumers can render per-criterion password-strength checklists.\n *\n * The rule's primary `error` (consumed by the hook into `errorsList.strong`) is\n * the first failing message — same convention as every other rule.\n *\n * Requires `type=\"password\"`. Activated by passing the `strong` prop:\n *\n * ```tsx\n * <TextInput type=\"password\" name=\"password\" strong required minLength={8} />\n * <TextInput type=\"password\" name=\"password\" strong={{ symbol: false }} />\n * ```\n */\nexport const strongRule: InputRule = {\n  name: \"strong\",\n  preservedProps: [\"strong\"],\n  requiresType: \"password\",\n  validate: ({ value, strong, formControl, errorKeys }) => {\n    if (!strong) return;\n\n    const criteria: Required<StrongPasswordCriteria> =\n      strong === true ? defaultCriteria : { ...defaultCriteria, ...strong };\n\n    const stringValue = typeof value === \"string\" ? value : \"\";\n    const failures: ReactNode[] = [];\n\n    const fail = (key: string, message: ReactNode) => {\n      formControl.errorsList[`strong.${key}`] = message;\n      failures.push(message);\n    };\n\n    if (criteria.minLength && stringValue.length < criteria.minLength) {\n      fail(\n        \"minLength\",\n        trans(\"validation.strongMinLength\", {\n          input: errorKeys.name,\n          length: criteria.minLength,\n        })\n      );\n    }\n\n    if (criteria.uppercase && !/[A-Z]/.test(stringValue)) {\n      fail(\n        \"uppercase\",\n        trans(\"validation.strongUppercase\", { input: errorKeys.name })\n      );\n    }\n\n    if (criteria.lowercase && !/[a-z]/.test(stringValue)) {\n      fail(\n        \"lowercase\",\n        trans(\"validation.strongLowercase\", { input: errorKeys.name })\n      );\n    }\n\n    if (criteria.digit && !/\\d/.test(stringValue)) {\n      fail(\n        \"digit\",\n        trans(\"validation.strongDigit\", { input: errorKeys.name })\n      );\n    }\n\n    if (criteria.symbol && !/[^A-Za-z0-9]/.test(stringValue)) {\n      fail(\n        \"symbol\",\n        trans(\"validation.strongSymbol\", { input: errorKeys.name })\n      );\n    }\n\n    if (failures.length > 0) {\n      return failures[0];\n    }\n  },\n};\n","import { trans } from \"@mongez/localization\";\nimport { isUrl } from \"@mongez/supportive-is\";\nimport { type InputRule } from \"../types\";\n\nexport const urlRule: InputRule = {\n  name: \"url\",\n  requiresType: \"url\",\n  validate: ({ value }) => {\n    if (!isUrl(value)) {\n      return trans(\"validation.url\");\n    }\n  },\n};\n"],"mappings":"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"}