{"version":3,"sources":["../src/use-radio.ts"],"sourcesContent":["import type { PropGetter } from \"@yamada-ui/core\"\nimport type { FormControlOptions } from \"@yamada-ui/form-control\"\nimport type { Dict } from \"@yamada-ui/utils\"\nimport type {\n  ChangeEvent,\n  ChangeEventHandler,\n  KeyboardEvent,\n  SyntheticEvent,\n} from \"react\"\nimport {\n  formControlProperties,\n  useFormControlProps,\n} from \"@yamada-ui/form-control\"\nimport { trackFocusVisible } from \"@yamada-ui/use-focus-visible\"\nimport {\n  dataAttr,\n  handlerAll,\n  splitObject,\n  useCallbackRef,\n} from \"@yamada-ui/utils\"\nimport { useCallback, useEffect, useId, useState } from \"react\"\n\nexport interface UseRadioProps<Y extends number | string = string>\n  extends FormControlOptions {\n  /**\n   * id assigned to input.\n   */\n  id?: string\n  /**\n   * The name of the input field in a radio.\n   */\n  name?: string\n  /**\n   * If `true`, the radio will be checked.\n   *\n   * @default false\n   */\n  checked?: boolean\n  /**\n   * If `true`, the radio will be initially checked.\n   *\n   * @default false\n   */\n  defaultChecked?: boolean\n  /**\n   * If `true`, the radio will be initially checked.\n   *\n   * @default false\n   *\n   * @deprecated Use `defaultChecked` instead.\n   */\n  defaultIsChecked?: boolean\n  /**\n   * If `true`, the radio will be checked.\n   *\n   * @default false\n   *\n   * @deprecated Use `checked` instead.\n   */\n  isChecked?: boolean\n  /**\n   * The value to be used in the radio button.\n   */\n  value?: Y\n  /**\n   * The callback invoked when the checked state changes.\n   */\n  onChange?: ChangeEventHandler<HTMLInputElement>\n}\n\nexport const useRadio = <\n  Y extends number | string = string,\n  M extends Dict = Dict,\n>({\n  id,\n  ...props\n}: M & UseRadioProps<Y>) => {\n  const uuid = useId()\n\n  id ??= uuid\n\n  const {\n    id: _id,\n    name,\n    isChecked,\n    checked: checkedProp = isChecked,\n    defaultIsChecked,\n    defaultChecked = defaultIsChecked,\n    value,\n    onChange: onChangeProp,\n    ...computedProps\n  } = useFormControlProps({ id, ...props })\n  const [\n    {\n      \"aria-readonly\": _ariaReadonly,\n      disabled,\n      readOnly,\n      required,\n      onBlur: onBlurProp,\n      onFocus: onFocusProp,\n      ...formControlProps\n    },\n    rest,\n  ] = splitObject(computedProps, formControlProperties)\n  const [focusVisible, setFocusVisible] = useState<boolean>(false)\n  const [focused, setFocused] = useState<boolean>(false)\n  const [hovered, setHovered] = useState<boolean>(false)\n  const [active, setActive] = useState<boolean>(false)\n  const [checked, setChecked] = useState<boolean>(!!defaultChecked)\n  const controlled = checkedProp !== undefined\n  const resolvedChecked = controlled ? (checkedProp as boolean) : checked\n\n  useEffect(() => {\n    return trackFocusVisible(setFocusVisible)\n  }, [])\n\n  const onChange = useCallbackRef(\n    (ev: ChangeEvent<HTMLInputElement>) => {\n      if (readOnly || disabled) {\n        ev.preventDefault()\n\n        return\n      }\n\n      if (!controlled) setChecked(ev.target.checked)\n\n      onChangeProp?.(ev)\n    },\n    [readOnly, disabled, controlled],\n  )\n  const onFocus = useCallbackRef(onFocusProp)\n  const onBlur = useCallbackRef(onBlurProp)\n\n  const onKeyDown = useCallback(\n    ({ key }: KeyboardEvent) => {\n      if (key === \" \") setActive(true)\n    },\n    [setActive],\n  )\n\n  const onKeyUp = useCallback(\n    ({ key }: KeyboardEvent) => {\n      if (key === \" \") setActive(false)\n    },\n    [setActive],\n  )\n\n  const getContainerProps: PropGetter<\"label\"> = useCallback(\n    (props = {}, ref = null) => ({\n      ...formControlProps,\n      ...props,\n      ref,\n      \"data-checked\": dataAttr(resolvedChecked),\n      \"data-focus\": dataAttr(focused),\n      \"data-focus-visible\": dataAttr(focused && focusVisible),\n    }),\n    [resolvedChecked, formControlProps, focused, focusVisible],\n  )\n\n  const getIconProps: PropGetter = useCallback(\n    (props = {}, ref = null) => ({\n      ...formControlProps,\n      ...props,\n      ref,\n      \"aria-hidden\": true,\n      \"data-active\": dataAttr(active),\n      \"data-checked\": dataAttr(resolvedChecked),\n      \"data-focus\": dataAttr(focused),\n      \"data-focus-visible\": dataAttr(focused && focusVisible),\n      \"data-hover\": dataAttr(hovered),\n      onMouseDown: handlerAll(props.onMouseDown, () => setActive(true)),\n      onMouseEnter: handlerAll(props.onMouseEnter, () => setHovered(true)),\n      onMouseLeave: handlerAll(props.onMouseLeave, () => setHovered(false)),\n      onMouseUp: handlerAll(props.onMouseUp, () => setActive(false)),\n    }),\n    [resolvedChecked, active, focused, focusVisible, hovered, formControlProps],\n  )\n\n  const getInputProps: PropGetter<\"input\"> = useCallback(\n    (props = {}, ref = null) => ({\n      ...formControlProps,\n      ...props,\n      id,\n      ref,\n      type: \"radio\",\n      name,\n      style: {\n        border: \"0px\",\n        clip: \"rect(0px, 0px, 0px, 0px)\",\n        height: \"1px\",\n        margin: \"-1px\",\n        overflow: \"hidden\",\n        padding: \"0px\",\n        position: \"absolute\",\n        whiteSpace: \"nowrap\",\n        width: \"1px\",\n      },\n      \"aria-checked\": resolvedChecked,\n      checked: resolvedChecked,\n      disabled,\n      readOnly,\n      required,\n      value,\n      onBlur: handlerAll(props.onBlur, onBlur, () => setFocused(false)),\n      onChange: handlerAll(props.onChange, onChange),\n      onFocus: handlerAll(props.onFocus, onFocus, () => setFocused(true)),\n      onKeyDown: handlerAll(props.onKeyDown, onKeyDown),\n      onKeyUp: handlerAll(props.onKeyUp, onKeyUp),\n    }),\n    [\n      formControlProps,\n      id,\n      name,\n      value,\n      required,\n      disabled,\n      readOnly,\n      resolvedChecked,\n      onChange,\n      onBlur,\n      onFocus,\n      onKeyDown,\n      onKeyUp,\n    ],\n  )\n\n  const getLabelProps: PropGetter<\"span\"> = useCallback(\n    (props = {}, ref = null) => ({\n      ...formControlProps,\n      ...props,\n      ref,\n      \"data-checked\": dataAttr(resolvedChecked),\n      onMouseDown: handlerAll(props.onMouseDown, (ev: SyntheticEvent) => {\n        ev.preventDefault()\n        ev.stopPropagation()\n      }),\n      onTouchStart: handlerAll(props.onTouchStart, (ev: SyntheticEvent) => {\n        ev.preventDefault()\n        ev.stopPropagation()\n      }),\n    }),\n    [resolvedChecked, formControlProps],\n  )\n\n  return {\n    active,\n    checked: resolvedChecked,\n    focused,\n    focusVisible,\n    hovered,\n    /**\n     * @deprecated Use `active` instead.\n     */\n    isActive: active,\n    /**\n     * @deprecated Use `checked` instead.\n     */\n    isChecked: resolvedChecked,\n    /**\n     * @deprecated Use `focused` instead.\n     */\n    isFocused: focused,\n    /**\n     * @deprecated Use `focusVisible` instead.\n     */\n    isFocusVisible: focusVisible,\n    /**\n     * @deprecated Use `hovered` instead.\n     */\n    isHovered: hovered,\n    props: rest,\n    getContainerProps,\n    getIconProps,\n    getInputProps,\n    getLabelProps,\n  }\n}\n\nexport type UseRadioReturn = ReturnType<typeof useRadio>\n"],"mappings":"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","names":["props"]}