{"version":3,"file":"RadioGroup.cjs","sources":["../src/RadioGroup/RadioGroup.tsx"],"sourcesContent":["import clsx from 'clsx';\nimport React, { createContext, forwardRef, useContext } from 'react';\n\nimport type {\n  ComponentProps,\n  SlotComponentPropsWithoutOverride,\n} from '../components.ts';\nimport { useFieldContext } from '../Form/useFieldContext.ts';\nimport { assocDefaultStyle } from '../utils/assign-default-style.ts';\nimport { mergeRootSlotPropsToComponentProps } from '../utils/merge-root-slot-props-to-component-prop.ts';\n\nexport type RadioGroupProps = React.PropsWithChildren<{\n  name?: string;\n  onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n  value?: string;\n}>;\n\nconst RadioGroupContext = createContext<{\n  name?: string;\n  onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;\n  onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\n  onFocus?: (event: React.FocusEvent<HTMLInputElement>) => void;\n  required?: boolean;\n  value?: string;\n}>({});\n\nexport const RadioGroup = function RadioGroup({\n  children,\n  name,\n  onChange,\n  value,\n}: RadioGroupProps) {\n  const fieldContext = useFieldContext({\n    onChange: onChange,\n    value: value,\n  });\n  const { formControlContext } = fieldContext;\n  const {\n    onBlur,\n    onFocus,\n    required,\n    value: currentValue,\n  } = formControlContext!;\n  return (\n    <RadioGroupContext.Provider\n      value={{\n        name: fieldContext?.name || name,\n        onBlur,\n        onChange: formControlContext?.onChange,\n        onFocus,\n        required,\n        value: currentValue as string,\n      }}\n    >\n      {children}\n    </RadioGroupContext.Provider>\n  );\n};\n\ninterface RadioSlotProps {\n  input?: SlotComponentPropsWithoutOverride<'input'>;\n  label?: SlotComponentPropsWithoutOverride<'label'>;\n  root?: SlotComponentPropsWithoutOverride<'div'>;\n}\n\nexport type RadioProps = ComponentProps<\n  RadioSlotProps,\n  {\n    id: string;\n    value: string;\n  }\n>;\nexport const Radio = forwardRef<HTMLInputElement, RadioProps>(function Radio(\n  {\n    children,\n    'data-testid': testId,\n    disableDefaultClasses,\n    id,\n    slotProps: givenSlotProps,\n    value,\n    ...rest\n  }: RadioProps,\n  ref,\n) {\n  const testIdPrefix = testId ?? 'busybox-radio';\n  const radioGroupContext = useContext(RadioGroupContext);\n  if (!radioGroupContext) {\n    return null;\n  }\n  const {\n    name,\n    onBlur,\n    onChange,\n    onFocus,\n    required,\n    value: currentValue,\n  } = radioGroupContext;\n  const isChecked = currentValue === value;\n  let slotProps = givenSlotProps;\n  if (!disableDefaultClasses) {\n    slotProps = assocDefaultStyle<RadioSlotProps>({\n      slotWithDefaultClasses: {\n        input: clsx(\n          'tw-form-radio tw-h-px tw-w-px tw-border-0 focus:tw-ring-primary',\n        ),\n        label: isChecked\n          ? clsx(\n              'tw-cursor-pointer tw-bg-primary tw-font-bold hover:tw-bg-primary-user-action hover:tw-text-primary-user-action',\n            )\n          : clsx(\n              'tw-cursor-pointer hover:tw-bg-primary-user-action hover:tw-text-primary-user-action',\n            ),\n        root: clsx('tw-grid tw-grid-cols-[0px_1fr]'),\n      },\n    })(givenSlotProps);\n  }\n  const rootProps = mergeRootSlotPropsToComponentProps()(slotProps, rest);\n  return (\n    <div {...rootProps}>\n      <input\n        {...slotProps?.input}\n        checked={currentValue === value}\n        data-testid={`${testIdPrefix}-input`}\n        id={id}\n        name={name}\n        onBlur={onBlur}\n        onChange={onChange}\n        onFocus={onFocus}\n        ref={ref}\n        required={required}\n        type=\"radio\"\n        value={value}\n      />\n      <label htmlFor={id} {...slotProps?.label} data-testid={testIdPrefix}>\n        {children}\n      </label>\n    </div>\n  );\n});\n"],"names":["RadioGroupContext","createContext","RadioGroup","children","name","onChange","value","fieldContext","useFieldContext","formControlContext","onBlur","onFocus","required","currentValue","jsx","Radio","forwardRef","testId","disableDefaultClasses","id","givenSlotProps","rest","ref","testIdPrefix","radioGroupContext","useContext","isChecked","slotProps","assocDefaultStyle","clsx","rootProps","mergeRootSlotPropsToComponentProps","jsxs"],"mappings":"yoBAiBA,MAAMA,EAAoBC,EAAAA,cAOvB,CAAA,CAAE,EAEQC,EAAa,SAAoB,CAC5C,SAAAC,EACA,KAAAC,EACA,SAAAC,EACA,MAAAC,CACF,EAAoB,CAClB,MAAMC,EAAeC,EAAAA,gBAAgB,CACnC,SAAAH,EACA,MAAAC,CAAA,CACD,EACK,CAAE,mBAAAG,CAAuB,EAAAF,EACzB,CACJ,OAAAG,EACA,QAAAC,EACA,SAAAC,EACA,MAAOC,CACL,EAAAJ,EAEF,OAAAK,EAAA,kBAAA,IAACd,EAAkB,SAAlB,CACC,MAAO,CACL,MAAMO,GAAA,YAAAA,EAAc,OAAQH,EAC5B,OAAAM,EACA,SAAUD,GAAA,YAAAA,EAAoB,SAC9B,QAAAE,EACA,SAAAC,EACA,MAAOC,CACT,EAEC,SAAAV,CAAA,CAAA,CAGP,EAeaY,EAAQC,EAAAA,WAAyC,SAC5D,CACE,SAAAb,EACA,cAAec,EACf,sBAAAC,EACA,GAAAC,EACA,UAAWC,EACX,MAAAd,EACA,GAAGe,CACL,EACAC,EACA,CACA,MAAMC,EAAeN,GAAU,gBACzBO,EAAoBC,aAAWzB,CAAiB,EACtD,GAAI,CAACwB,EACI,OAAA,KAEH,KAAA,CACJ,KAAApB,EACA,OAAAM,EACA,SAAAL,EACA,QAAAM,EACA,SAAAC,EACA,MAAOC,CACL,EAAAW,EACEE,EAAYb,IAAiBP,EACnC,IAAIqB,EAAYP,EACXF,IACHS,EAAYC,EAAAA,kBAAkC,CAC5C,uBAAwB,CACtB,MAAOC,EAAA,KACL,iEACF,EACA,MAAOH,EACHG,EAAA,KACE,gHAAA,EAEFA,EAAA,KACE,qFACF,EACJ,KAAMA,OAAK,gCAAgC,CAC7C,CAAA,CACD,EAAET,CAAc,GAEnB,MAAMU,EAAYC,EAAA,mCAAA,EAAqCJ,EAAWN,CAAI,EAEpE,OAAAW,EAAA,kBAAA,KAAC,MAAK,CAAA,GAAGF,EACP,SAAA,CAAAhB,EAAA,kBAAA,IAAC,QAAA,CACE,GAAGa,GAAA,YAAAA,EAAW,MACf,QAASd,IAAiBP,EAC1B,cAAa,GAAGiB,CAAY,SAC5B,GAAAJ,EACA,KAAAf,EACA,OAAAM,EACA,SAAAL,EACA,QAAAM,EACA,IAAAW,EACA,SAAAV,EACA,KAAK,QACL,MAAAN,CAAA,CACF,EACAQ,EAAAA,kBAAAA,IAAC,SAAM,QAASK,EAAK,GAAGQ,GAAA,YAAAA,EAAW,MAAO,cAAaJ,EACpD,SAAApB,EACH,CACF,CAAA,CAAA,CAEJ,CAAC"}