{"version":3,"file":"FormControl.mjs","sources":["../../../../src/components/FormControl/FormControl.tsx"],"sourcesContent":["'use client'\nimport { forwardRef, useCallback, useMemo, useState } from 'react'\nimport * as React from 'react'\n\nimport classNames from 'classnames'\n\nimport useId from '~/src/hooks/useId'\nimport {\n  type FormFieldProps,\n  type FormFieldSize,\n  type SizeProps,\n} from '~/src/types/props'\nimport { getFormFieldSizeClassName } from '~/src/types/props-helpers'\nimport { ariaAttr } from '~/src/utils/aria'\nimport { createContext } from '~/src/utils/react'\nimport { isNil } from '~/src/utils/type'\n\nimport { Stack } from '~/src/components/Stack'\n\nimport {\n  type ContainerProps,\n  type ErrorMessagePropsGetter,\n  type FieldPropsGetter,\n  type FormControlContextValue,\n  type FormControlProps,\n  type GroupPropsGetter,\n  type HelperTextPropsGetter,\n  type LabelPropsGetter,\n} from './FormControl.types'\n\nimport styles from './FormControl.module.scss'\n\nconst [FormControlContextProvider, useFormControlContext] = createContext<\n  FormControlContextValue | undefined\n>(undefined)\n\nexport { useFormControlContext }\n\nconst FORM_CONTROL_TEST_ID = 'bezier-form-control'\n\nconst Container = forwardRef<HTMLElement, ContainerProps>(function Container(\n  { labelPosition, children, className, ...rest },\n  forwardedRef\n) {\n  switch (labelPosition) {\n    case 'top':\n      return (\n        <Stack\n          className={className}\n          ref={forwardedRef}\n          direction=\"vertical\"\n          {...rest}\n        >\n          {children}\n        </Stack>\n      )\n\n    case 'left':\n    default:\n      return (\n        <div\n          ref={forwardedRef as React.ForwardedRef<HTMLDivElement>}\n          className={classNames(styles.Grid, className)}\n          {...rest}\n        >\n          {children}\n        </div>\n      )\n  }\n})\n\nexport const FormControl = forwardRef<HTMLElement, FormControlProps>(\n  function FormControl(\n    {\n      children,\n      id: idProp,\n      labelPosition = 'top',\n      size = 'm',\n      hasError,\n      required,\n      readOnly,\n      disabled,\n      ...rest\n    },\n    forwardedRef\n  ) {\n    const [groupNode, setGroupNode] = useState<HTMLElement | null>(null)\n    const [helperTextNode, setHelperTextNode] = useState<HTMLElement | null>(\n      null\n    )\n    const [errorMessageNode, setErrorMessageNode] =\n      useState<HTMLElement | null>(null)\n\n    const id = useId(idProp, 'field')\n    const groupId = `${id}-group`\n    const labelId = `${id}-label`\n    const helperTextId = `${id}-help-text`\n    const errorMessageId = `${id}-error-message`\n\n    const fieldId = groupNode ? undefined : id\n\n    const describerId = useMemo(() => {\n      if (errorMessageNode) {\n        return errorMessageId\n      }\n      if (helperTextNode) {\n        return helperTextId\n      }\n      return undefined\n    }, [errorMessageNode, helperTextNode, errorMessageId, helperTextId])\n\n    const getGroupProps = useCallback<GroupPropsGetter>(\n      (ownProps) => ({\n        id: groupId,\n        'aria-labelledby': labelId,\n        'aria-describedby': describerId,\n        ref: setGroupNode,\n        ...ownProps,\n      }),\n      [groupId, labelId, describerId]\n    )\n\n    const getLabelProps = useCallback<LabelPropsGetter>(\n      (ownProps) => ({\n        id: labelId,\n        htmlFor: fieldId,\n        className: classNames(\n          styles.FormLabelWrapper,\n          styles[`position-${labelPosition}`],\n          getFormFieldSizeClassName(size)\n        ),\n        typo: labelPosition === 'top' ? '13' : '14',\n        ...ownProps,\n      }),\n      [fieldId, labelId, labelPosition, size]\n    )\n\n    const getFieldProps = useCallback<FieldPropsGetter>(\n      (ownProps) => ({\n        id: fieldId,\n        size,\n        'aria-describedby': groupNode ? undefined : describerId,\n        hasError,\n        required,\n        readOnly,\n        disabled,\n        ...ownProps,\n      }),\n      [\n        fieldId,\n        describerId,\n        size,\n        hasError,\n        required,\n        readOnly,\n        disabled,\n        groupNode,\n      ]\n    )\n\n    const getHelperTextProps = useCallback<HelperTextPropsGetter>(\n      (ownProps) => ({\n        id: helperTextId,\n        visible: isNil(hasError) || !hasError,\n        ref: setHelperTextNode,\n        className: classNames(\n          styles.FormHelperTextWrapper,\n          labelPosition === 'left' && styles['position-left']\n        ),\n        ...ownProps,\n      }),\n      [helperTextId, labelPosition, hasError]\n    )\n\n    const getErrorMessageProps = useCallback<ErrorMessagePropsGetter>(\n      (ownProps) => ({\n        id: errorMessageId,\n        visible: isNil(hasError) || hasError,\n        ref: setErrorMessageNode,\n        className: classNames(\n          styles.FormHelperTextWrapper,\n          labelPosition === 'left' && styles['position-left']\n        ),\n        ...ownProps,\n      }),\n      [errorMessageId, labelPosition, hasError]\n    )\n\n    const contextValue = useMemo(\n      () => ({\n        id,\n        labelId,\n        helperTextId,\n        errorMessageId,\n        getGroupProps,\n        getLabelProps,\n        getFieldProps,\n        getHelperTextProps,\n        getErrorMessageProps,\n        hasError,\n        required,\n        readOnly,\n        disabled,\n      }),\n      [\n        id,\n        labelId,\n        helperTextId,\n        errorMessageId,\n        getGroupProps,\n        getLabelProps,\n        getFieldProps,\n        getHelperTextProps,\n        getErrorMessageProps,\n        hasError,\n        required,\n        readOnly,\n        disabled,\n      ]\n    )\n\n    if (!children) {\n      return null\n    }\n\n    return (\n      <FormControlContextProvider value={contextValue}>\n        <Container\n          {...rest}\n          ref={forwardedRef}\n          labelPosition={labelPosition}\n          data-testid={FORM_CONTROL_TEST_ID}\n        >\n          {children}\n        </Container>\n      </FormControlContextProvider>\n    )\n  }\n)\n\nexport function useFormFieldProps<\n  Props extends FormFieldProps & SizeProps<FormFieldSize>,\n>(props?: Props) {\n  const contextValue = useFormControlContext()\n\n  const formFieldProps = useMemo(() => {\n    const mergedProps = contextValue?.getFieldProps(props) ?? { ...props }\n\n    const {\n      disabled = false,\n      readOnly = false,\n      required = false,\n      hasError = false,\n      size = undefined,\n      ...rest\n    } = mergedProps\n\n    return {\n      ...rest,\n      'aria-disabled': ariaAttr(disabled),\n      'aria-invalid': ariaAttr(hasError),\n      'aria-required': ariaAttr(required),\n      'aria-readonly': ariaAttr(readOnly),\n      size,\n      disabled,\n      hasError,\n      required,\n      readOnly,\n    }\n  }, [props, contextValue])\n\n  return formFieldProps as typeof formFieldProps & Props\n}\n"],"names":["FormControlContextProvider","useFormControlContext","createContext","undefined","FORM_CONTROL_TEST_ID","Container","forwardRef","labelPosition","children","className","rest","forwardedRef","_jsx","Stack","ref","direction","classNames","styles","Grid","FormControl","id","idProp","size","hasError","required","readOnly","disabled","groupNode","setGroupNode","useState","helperTextNode","setHelperTextNode","errorMessageNode","setErrorMessageNode","useId","groupId","labelId","helperTextId","errorMessageId","fieldId","describerId","useMemo","getGroupProps","useCallback","ownProps","getLabelProps","htmlFor","FormLabelWrapper","getFormFieldSizeClassName","typo","getFieldProps","getHelperTextProps","visible","isNil","FormHelperTextWrapper","getErrorMessageProps","contextValue","value","useFormFieldProps","props","formFieldProps","_contextValue$getFiel","mergedProps","ariaAttr"],"mappings":";;;;;;;;;;;AAgCM,MAAA,CAACA,0BAA0B,EAAEC,qBAAqB,CAAC,GAAGC,aAAa,CAEvEC,SAAS;AAIX,MAAMC,oBAAoB,GAAG,qBAAqB;AAElD,MAAMC,SAAS,gBAAGC,UAAU,CAA8B,SAASD,SAASA,CAC1E;EAAEE,aAAa;EAAEC,QAAQ;EAAEC,SAAS;EAAE,GAAGC;AAAK,CAAC,EAC/CC,YAAY,EACZ;AACA,EAAA,QAAQJ,aAAa;AACnB,IAAA,KAAK,KAAK;MACR,oBACEK,GAAA,CAACC,KAAK,EAAA;AACJJ,QAAAA,SAAS,EAAEA,SAAU;AACrBK,QAAAA,GAAG,EAAEH,YAAa;AAClBI,QAAAA,SAAS,EAAC,UAAU;AAAA,QAAA,GAChBL,IAAI;AAAAF,QAAAA,QAAA,EAEPA;AAAQ,OACJ,CAAC;AAGZ,IAAA,KAAK,MAAM;AACX,IAAA;AACE,MAAA,oBACEI,GAAA,CAAA,KAAA,EAAA;AACEE,QAAAA,GAAG,EAAEH,YAAmD;QACxDF,SAAS,EAAEO,UAAU,CAACC,MAAM,CAACC,IAAI,EAAET,SAAS,CAAE;AAAA,QAAA,GAC1CC,IAAI;AAAAF,QAAAA,QAAA,EAEPA;AAAQ,OACN,CAAC;AAEZ;AACF,CAAC,CAAC;MAEWW,WAAW,gBAAGb,UAAU,CACnC,SAASa,WAAWA,CAClB;EACEX,QAAQ;AACRY,EAAAA,EAAE,EAAEC,MAAM;AACVd,EAAAA,aAAa,GAAG,KAAK;AACrBe,EAAAA,IAAI,GAAG,GAAG;EACVC,QAAQ;EACRC,QAAQ;EACRC,QAAQ;EACRC,QAAQ;EACR,GAAGhB;AACL,CAAC,EACDC,YAAY,EACZ;EACA,MAAM,CAACgB,SAAS,EAAEC,YAAY,CAAC,GAAGC,QAAQ,CAAqB,IAAI,CAAC;EACpE,MAAM,CAACC,cAAc,EAAEC,iBAAiB,CAAC,GAAGF,QAAQ,CAClD,IACF,CAAC;EACD,MAAM,CAACG,gBAAgB,EAAEC,mBAAmB,CAAC,GAC3CJ,QAAQ,CAAqB,IAAI,CAAC;AAEpC,EAAA,MAAMT,EAAE,GAAGc,KAAK,CAACb,MAAM,EAAE,OAAO,CAAC;AACjC,EAAA,MAAMc,OAAO,GAAG,CAAGf,EAAAA,EAAE,CAAQ,MAAA,CAAA;AAC7B,EAAA,MAAMgB,OAAO,GAAG,CAAGhB,EAAAA,EAAE,CAAQ,MAAA,CAAA;AAC7B,EAAA,MAAMiB,YAAY,GAAG,CAAGjB,EAAAA,EAAE,CAAY,UAAA,CAAA;AACtC,EAAA,MAAMkB,cAAc,GAAG,CAAGlB,EAAAA,EAAE,CAAgB,cAAA,CAAA;AAE5C,EAAA,MAAMmB,OAAO,GAAGZ,SAAS,GAAGxB,SAAS,GAAGiB,EAAE;AAE1C,EAAA,MAAMoB,WAAW,GAAGC,OAAO,CAAC,MAAM;AAChC,IAAA,IAAIT,gBAAgB,EAAE;AACpB,MAAA,OAAOM,cAAc;AACvB;AACA,IAAA,IAAIR,cAAc,EAAE;AAClB,MAAA,OAAOO,YAAY;AACrB;AACA,IAAA,OAAOlC,SAAS;GACjB,EAAE,CAAC6B,gBAAgB,EAAEF,cAAc,EAAEQ,cAAc,EAAED,YAAY,CAAC,CAAC;AAEpE,EAAA,MAAMK,aAAa,GAAGC,WAAW,CAC9BC,QAAQ,KAAM;AACbxB,IAAAA,EAAE,EAAEe,OAAO;AACX,IAAA,iBAAiB,EAAEC,OAAO;AAC1B,IAAA,kBAAkB,EAAEI,WAAW;AAC/B1B,IAAAA,GAAG,EAAEc,YAAY;IACjB,GAAGgB;GACJ,CAAC,EACF,CAACT,OAAO,EAAEC,OAAO,EAAEI,WAAW,CAChC,CAAC;AAED,EAAA,MAAMK,aAAa,GAAGF,WAAW,CAC9BC,QAAQ,KAAM;AACbxB,IAAAA,EAAE,EAAEgB,OAAO;AACXU,IAAAA,OAAO,EAAEP,OAAO;AAChB9B,IAAAA,SAAS,EAAEO,UAAU,CACnBC,MAAM,CAAC8B,gBAAgB,EACvB9B,MAAM,CAAC,CAAYV,SAAAA,EAAAA,aAAa,EAAE,CAAC,EACnCyC,yBAAyB,CAAC1B,IAAI,CAChC,CAAC;AACD2B,IAAAA,IAAI,EAAE1C,aAAa,KAAK,KAAK,GAAG,IAAI,GAAG,IAAI;IAC3C,GAAGqC;GACJ,CAAC,EACF,CAACL,OAAO,EAAEH,OAAO,EAAE7B,aAAa,EAAEe,IAAI,CACxC,CAAC;AAED,EAAA,MAAM4B,aAAa,GAAGP,WAAW,CAC9BC,QAAQ,KAAM;AACbxB,IAAAA,EAAE,EAAEmB,OAAO;IACXjB,IAAI;AACJ,IAAA,kBAAkB,EAAEK,SAAS,GAAGxB,SAAS,GAAGqC,WAAW;IACvDjB,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;IACR,GAAGkB;AACL,GAAC,CAAC,EACF,CACEL,OAAO,EACPC,WAAW,EACXlB,IAAI,EACJC,QAAQ,EACRC,QAAQ,EACRC,QAAQ,EACRC,QAAQ,EACRC,SAAS,CAEb,CAAC;AAED,EAAA,MAAMwB,kBAAkB,GAAGR,WAAW,CACnCC,QAAQ,KAAM;AACbxB,IAAAA,EAAE,EAAEiB,YAAY;AAChBe,IAAAA,OAAO,EAAEC,KAAK,CAAC9B,QAAQ,CAAC,IAAI,CAACA,QAAQ;AACrCT,IAAAA,GAAG,EAAEiB,iBAAiB;AACtBtB,IAAAA,SAAS,EAAEO,UAAU,CACnBC,MAAM,CAACqC,qBAAqB,EAC5B/C,aAAa,KAAK,MAAM,IAAIU,MAAM,CAAC,eAAe,CACpD,CAAC;IACD,GAAG2B;GACJ,CAAC,EACF,CAACP,YAAY,EAAE9B,aAAa,EAAEgB,QAAQ,CACxC,CAAC;AAED,EAAA,MAAMgC,oBAAoB,GAAGZ,WAAW,CACrCC,QAAQ,KAAM;AACbxB,IAAAA,EAAE,EAAEkB,cAAc;AAClBc,IAAAA,OAAO,EAAEC,KAAK,CAAC9B,QAAQ,CAAC,IAAIA,QAAQ;AACpCT,IAAAA,GAAG,EAAEmB,mBAAmB;AACxBxB,IAAAA,SAAS,EAAEO,UAAU,CACnBC,MAAM,CAACqC,qBAAqB,EAC5B/C,aAAa,KAAK,MAAM,IAAIU,MAAM,CAAC,eAAe,CACpD,CAAC;IACD,GAAG2B;GACJ,CAAC,EACF,CAACN,cAAc,EAAE/B,aAAa,EAAEgB,QAAQ,CAC1C,CAAC;AAED,EAAA,MAAMiC,YAAY,GAAGf,OAAO,CAC1B,OAAO;IACLrB,EAAE;IACFgB,OAAO;IACPC,YAAY;IACZC,cAAc;IACdI,aAAa;IACbG,aAAa;IACbK,aAAa;IACbC,kBAAkB;IAClBI,oBAAoB;IACpBhC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;AACRC,IAAAA;AACF,GAAC,CAAC,EACF,CACEN,EAAE,EACFgB,OAAO,EACPC,YAAY,EACZC,cAAc,EACdI,aAAa,EACbG,aAAa,EACbK,aAAa,EACbC,kBAAkB,EAClBI,oBAAoB,EACpBhC,QAAQ,EACRC,QAAQ,EACRC,QAAQ,EACRC,QAAQ,CAEZ,CAAC;EAED,IAAI,CAAClB,QAAQ,EAAE;AACb,IAAA,OAAO,IAAI;AACb;EAEA,oBACEI,GAAA,CAACZ,0BAA0B,EAAA;AAACyD,IAAAA,KAAK,EAAED,YAAa;IAAAhD,QAAA,eAC9CI,GAAA,CAACP,SAAS,EAAA;AAAA,MAAA,GACJK,IAAI;AACRI,MAAAA,GAAG,EAAEH,YAAa;AAClBJ,MAAAA,aAAa,EAAEA,aAAc;AAC7B,MAAA,aAAA,EAAaH,oBAAqB;AAAAI,MAAAA,QAAA,EAEjCA;KACQ;AAAC,GACc,CAAC;AAEjC,CACF;AAEO,SAASkD,iBAAiBA,CAE/BC,KAAa,EAAE;AACf,EAAA,MAAMH,YAAY,GAAGvD,qBAAqB,EAAE;AAE5C,EAAA,MAAM2D,cAAc,GAAGnB,OAAO,CAAC,MAAM;AAAA,IAAA,IAAAoB,qBAAA;AACnC,IAAA,MAAMC,WAAW,GAAAD,CAAAA,qBAAA,GAAGL,YAAY,KAAA,IAAA,IAAZA,YAAY,KAAZA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,YAAY,CAAEN,aAAa,CAACS,KAAK,CAAC,cAAAE,qBAAA,KAAA,KAAA,CAAA,GAAAA,qBAAA,GAAI;MAAE,GAAGF;KAAO;IAEtE,MAAM;AACJjC,MAAAA,QAAQ,GAAG,KAAK;AAChBD,MAAAA,QAAQ,GAAG,KAAK;AAChBD,MAAAA,QAAQ,GAAG,KAAK;AAChBD,MAAAA,QAAQ,GAAG,KAAK;AAChBD,MAAAA,IAAI,GAAGnB,SAAS;MAChB,GAAGO;AACL,KAAC,GAAGoD,WAAW;IAEf,OAAO;AACL,MAAA,GAAGpD,IAAI;AACP,MAAA,eAAe,EAAEqD,QAAQ,CAACrC,QAAQ,CAAC;AACnC,MAAA,cAAc,EAAEqC,QAAQ,CAACxC,QAAQ,CAAC;AAClC,MAAA,eAAe,EAAEwC,QAAQ,CAACvC,QAAQ,CAAC;AACnC,MAAA,eAAe,EAAEuC,QAAQ,CAACtC,QAAQ,CAAC;MACnCH,IAAI;MACJI,QAAQ;MACRH,QAAQ;MACRC,QAAQ;AACRC,MAAAA;KACD;AACH,GAAC,EAAE,CAACkC,KAAK,EAAEH,YAAY,CAAC,CAAC;AAEzB,EAAA,OAAOI,cAAc;AACvB;;;;"}