{"version":3,"sources":["../src/use-rating-item.ts"],"sourcesContent":["import type { PropGetter } from \"@yamada-ui/core\"\nimport type { ChangeEvent } from \"react\"\nimport { trackFocusVisible } from \"@yamada-ui/use-focus-visible\"\nimport { dataAttr, handlerAll } from \"@yamada-ui/utils\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useRatingContext } from \"./rating-context\"\n\nexport interface UseRatingItemProps {\n  fractionValue: number\n  groupValue: number\n  value: number\n}\n\nexport const useRatingItem = ({\n  fractionValue,\n  groupValue,\n  value,\n}: UseRatingItemProps) => {\n  const {\n    id,\n    name,\n    highlightSelectedOnly,\n    outside,\n    resolvedValue,\n    roundedValue,\n    setHoveredValue,\n    setValue,\n    formControlProps,\n  } = useRatingContext()\n  const {\n    \"aria-disabled\": ariaDisabled,\n    \"aria-readonly\": _ariaReadOnly,\n    disabled,\n    readOnly,\n    ...omittedFormControlProps\n  } = formControlProps\n  const [focused, setFocused] = useState<boolean>(false)\n  const [focusVisible, setFocusVisible] = useState<boolean>(false)\n  const active = value === resolvedValue\n  const checked = value === roundedValue\n  const filled = highlightSelectedOnly\n    ? value === resolvedValue\n    : value <= resolvedValue\n\n  const onBlur = useCallback(() => {\n    setFocused(false)\n\n    if (outside) setHoveredValue(-1)\n  }, [outside, setHoveredValue])\n\n  const onInputChange = useCallback(\n    (ev: ChangeEvent<HTMLInputElement>) => {\n      if (readOnly || disabled) return\n\n      const value = parseFloat(ev.target.value)\n\n      setHoveredValue(value)\n    },\n    [disabled, readOnly, setHoveredValue],\n  )\n\n  const onChange = useCallback(\n    (value: number) => {\n      if (readOnly || disabled) return\n\n      setValue(value)\n    },\n    [disabled, readOnly, setValue],\n  )\n\n  const onMouseDown = useCallback(() => {\n    if (readOnly || disabled) return\n\n    onChange(value)\n  }, [disabled, onChange, readOnly, value])\n\n  const onTouchStart = useCallback(() => {\n    if (readOnly || disabled) return\n\n    onChange(value)\n  }, [disabled, onChange, readOnly, value])\n\n  const getItemProps: PropGetter<\"label\"> = useCallback(\n    (props = {}, ref = null) => {\n      const zIndex = active ? 1 : -1\n\n      return {\n        ref,\n        htmlFor: `${id}-${groupValue}-${value}`,\n        ...omittedFormControlProps,\n        ...props,\n        \"data-active\": dataAttr(active),\n        \"data-disabled\": dataAttr(disabled),\n        \"data-filled\": dataAttr(filled),\n        \"data-focus\": dataAttr(focused),\n        \"data-focus-visible\": dataAttr(focused && focusVisible),\n        zIndex: fractionValue !== 1 ? zIndex : undefined,\n        onMouseDown: handlerAll(onMouseDown, props.onMouseDown),\n        onTouchStart: handlerAll(onTouchStart, props.onTouchStart),\n      }\n    },\n    [\n      disabled,\n      omittedFormControlProps,\n      fractionValue,\n      groupValue,\n      id,\n      active,\n      filled,\n      focusVisible,\n      focused,\n      onMouseDown,\n      onTouchStart,\n      value,\n    ],\n  )\n\n  const getInputProps: PropGetter<\"input\"> = useCallback(\n    (props = {}, ref = null) => {\n      return {\n        ref,\n        \"aria-disabled\": ariaDisabled,\n        \"aria-label\": `${value}`,\n        disabled,\n        readOnly,\n        ...omittedFormControlProps,\n        ...props,\n        id: `${id}-${groupValue}-${value}`,\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        \"data-active\": dataAttr(active),\n        \"data-checked\": dataAttr(checked),\n        checked,\n        value,\n        onBlur: handlerAll(onBlur, props.onBlur),\n        onChange: handlerAll(onInputChange, props.onChange),\n        onFocus: handlerAll(() => setFocused(true), props.onFocus),\n        onKeyDown: handlerAll(\n          (ev) => (ev.key === \" \" ? onChange(value) : void 0),\n          props.onKeyDown,\n        ),\n      }\n    },\n    [\n      ariaDisabled,\n      disabled,\n      readOnly,\n      value,\n      omittedFormControlProps,\n      id,\n      groupValue,\n      name,\n      checked,\n      onInputChange,\n      onBlur,\n      active,\n      onChange,\n    ],\n  )\n\n  useEffect(() => {\n    return trackFocusVisible(setFocusVisible)\n  }, [])\n\n  return {\n    active,\n    checked,\n    filled,\n    getInputProps,\n    getItemProps,\n  }\n}\n\nexport type UseRatingItemReturn = ReturnType<typeof useRatingItem>\n"],"mappings":"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","names":["value"]}