{"version":3,"file":"Rating.cjs","sources":["../../../src/components/Rating/Rating.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport { clamp, useId, useMergedRef, useUncontrolled } from '@raikou/hooks';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getSize,\n  getThemeColor,\n  RaikouColor,\n  RaikouSize,\n  StylesApiProps,\n  useDirection,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { RatingProvider } from './Rating.context';\nimport { RatingItem } from './RatingItem/RatingItem';\nimport {\n  RatingInputStyle,\n  RatingLabelStyle,\n  RatingRootStyle,\n  RatingStarSymbolStyle,\n  RatingSymbolBodyStyle,\n  RatingSymbolGroupStyle,\n} from './Rating.css';\n\nfunction roundValueTo(value: number, to: number) {\n  const rounded = Math.round(value / to) * to;\n  const precision = `${to}`.split('.')[1]?.length || 0;\n  return Number(rounded.toFixed(precision));\n}\n\nexport type RatingStylesNames =\n  | 'root'\n  | 'starSymbol'\n  | 'input'\n  | 'label'\n  | 'symbolBody'\n  | 'symbolGroup';\n\nexport type RatingCssVariables = {\n  root: '--rating-size' | '--rating-color';\n};\n\nexport interface RatingProps\n  extends BoxProps,\n    StylesApiProps<RatingFactory>,\n    ElementProps<'div', 'onChange'> {\n  /** Default value for uncontrolled component */\n  defaultValue?: number;\n\n  /** Value for controlled component */\n  value?: number;\n\n  /** Called when value changes */\n  onChange?: (value: number) => void;\n\n  /** Icon displayed when the symbol is empty */\n  emptySymbol?: React.ReactNode | ((value: number) => React.ReactNode);\n\n  /** Icon displayed when the symbol is full */\n  fullSymbol?: React.ReactNode | ((value: number) => React.ReactNode);\n\n  /** Number of fractions each item can be divided into, `1` by default */\n  fractions?: number;\n\n  /** Controls component size, `'sm'` by default */\n  size?: RaikouSize | number | (string & {});\n\n  /** Number of controls, `5` by default */\n  count?: number;\n\n  /** Called when one of the controls is hovered */\n  onHover?: (value: number) => void;\n\n  /** A function to assign `aria-label` of the the control at index given in the argument. If not specified, control index is used as `aria-label`. */\n  getSymbolLabel?: (index: number) => string;\n\n  /** `name` attribute passed down to all inputs. By default, `name` is generated randomly. */\n  name?: string;\n\n  /** If set, the user cannot interact with the component, `false` by default */\n  readOnly?: boolean;\n\n  /** If set, only the selected symbol changes to full symbol when selected, `false` by default */\n  highlightSelectedOnly?: boolean;\n\n  /** Key of `theme.colors` or any CSS color value, `'yellow'` by default */\n  color?: RaikouColor;\n}\n\nexport type RatingFactory = Factory<{\n  props: RatingProps;\n  ref: HTMLDivElement;\n  stylesNames: RatingStylesNames;\n  vars: RatingCssVariables;\n}>;\n\nconst defaultProps: Partial<RatingProps> = {\n  size: 'sm',\n  getSymbolLabel: (value) => `${value}`,\n  count: 5,\n  fractions: 1,\n  color: 'yellow',\n};\n\nconst varsResolver = createVarsResolver<RatingFactory>((theme, { size, color }) => ({\n  root: {\n    '--rating-size': getSize(size, 'rating-size'),\n    '--rating-color': getThemeColor(color, theme),\n  },\n}));\n\nexport const Rating = factory<RatingFactory>((_props, ref) => {\n  const props = useProps('Rating', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    name,\n    id,\n    value,\n    defaultValue,\n    onChange,\n    fractions,\n    count,\n    onMouseEnter,\n    readOnly,\n    onMouseMove,\n    onHover,\n    onMouseLeave,\n    onTouchStart,\n    onTouchEnd,\n    size,\n    variant,\n    getSymbolLabel,\n    color,\n    emptySymbol,\n    fullSymbol,\n    highlightSelectedOnly,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<RatingFactory>({\n    name: 'Rating',\n    classes: {\n      root: RatingRootStyle,\n      starSymbol: RatingStarSymbolStyle,\n      input: RatingInputStyle,\n      label: RatingLabelStyle,\n      symbolBody: RatingSymbolBodyStyle,\n      symbolGroup: RatingSymbolGroupStyle,\n    },\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n  });\n\n  const { dir } = useDirection();\n\n  const _name = useId(name);\n  const _id = useId(id);\n  const rootRef = useRef<HTMLDivElement>(null);\n\n  const [_value, setValue] = useUncontrolled({\n    value,\n    defaultValue,\n    finalValue: 0,\n    onChange,\n  });\n\n  const [hovered, setHovered] = useState(-1);\n  const [isOutside, setOutside] = useState(true);\n\n  const _fractions = Math.floor(fractions!);\n  const _count = Math.floor(count!);\n\n  const decimalUnit = 1 / _fractions;\n  const stableValueRounded = roundValueTo(_value, decimalUnit);\n  const finalValue = hovered !== -1 ? hovered : stableValueRounded;\n\n  const getRatingFromCoordinates = (x: number) => {\n    const { left, right, width } = rootRef.current!.getBoundingClientRect();\n    const symbolWidth = width / _count;\n\n    const hoverPosition = dir === 'rtl' ? right - x : x - left;\n    const hoverValue = hoverPosition / symbolWidth;\n\n    return clamp(roundValueTo(hoverValue + decimalUnit / 2, decimalUnit), decimalUnit, _count);\n  };\n\n  const handleMouseEnter = (event: React.MouseEvent<HTMLDivElement>) => {\n    onMouseEnter?.(event);\n    !readOnly && setOutside(false);\n  };\n\n  const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {\n    onMouseMove?.(event);\n\n    if (readOnly) {\n      return;\n    }\n\n    const rounded = getRatingFromCoordinates(event.clientX);\n\n    setHovered(rounded);\n    rounded !== hovered && onHover?.(rounded);\n  };\n\n  const handleMouseLeave = (event: React.MouseEvent<HTMLDivElement>) => {\n    onMouseLeave?.(event);\n\n    if (readOnly) {\n      return;\n    }\n\n    setHovered(-1);\n    setOutside(true);\n    hovered !== -1 && onHover?.(-1);\n  };\n\n  const handleTouchStart = (event: React.TouchEvent<HTMLDivElement>) => {\n    const { touches } = event;\n    if (touches.length !== 1) {\n      return;\n    }\n\n    if (!readOnly) {\n      const touch = touches[0];\n      setValue(getRatingFromCoordinates(touch.clientX));\n    }\n\n    onTouchStart?.(event);\n  };\n\n  const handleTouchEnd = (event: React.TouchEvent<HTMLDivElement>) => {\n    event.preventDefault();\n\n    onTouchEnd?.(event);\n  };\n\n  const handleItemBlur = () => isOutside && setHovered(-1);\n\n  const handleInputChange = (event: React.ChangeEvent<HTMLInputElement> | number) => {\n    if (!readOnly) {\n      if (typeof event === 'number') {\n        setHovered(event);\n      } else {\n        setHovered(parseFloat(event.target.value));\n      }\n    }\n  };\n\n  const handleChange = (event: React.ChangeEvent<HTMLInputElement> | number) => {\n    if (!readOnly) {\n      if (typeof event === 'number') {\n        setValue(event);\n      } else {\n        setValue(parseFloat(event.target.value));\n      }\n    }\n  };\n\n  const items = Array(_count)\n    .fill(0)\n    .map((_, index) => {\n      const integerValue = index + 1;\n      const fractionItems = Array.from(new Array(index === 0 ? _fractions + 1 : _fractions));\n      const isGroupActive = !readOnly && Math.ceil(hovered) === integerValue;\n\n      return (\n        <div\n          key={integerValue}\n          data-active={isGroupActive || undefined}\n          {...getStyles('symbolGroup')}\n        >\n          {fractionItems.map((__, fractionIndex) => {\n            const fractionValue = decimalUnit * (index === 0 ? fractionIndex : fractionIndex + 1);\n            const symbolValue = roundValueTo(integerValue - 1 + fractionValue, decimalUnit);\n\n            return (\n              <RatingItem\n                key={`${integerValue}-${symbolValue}`}\n                getSymbolLabel={getSymbolLabel}\n                emptyIcon={emptySymbol}\n                fullIcon={fullSymbol}\n                full={\n                  highlightSelectedOnly ? symbolValue === finalValue : symbolValue <= finalValue\n                }\n                active={symbolValue === finalValue}\n                checked={symbolValue === stableValueRounded}\n                readOnly={readOnly}\n                fractionValue={fractionValue}\n                value={symbolValue}\n                name={_name}\n                onChange={handleChange}\n                onBlur={handleItemBlur}\n                onInputChange={handleInputChange}\n                id={`${_id}-${index}-${fractionIndex}`}\n              />\n            );\n          })}\n        </div>\n      );\n    });\n\n  return (\n    <RatingProvider value={{ getStyles }}>\n      <Box\n        ref={useMergedRef(rootRef, ref)}\n        {...getStyles('root')}\n        onMouseMove={handleMouseMove}\n        onMouseEnter={handleMouseEnter}\n        onMouseLeave={handleMouseLeave}\n        onTouchStart={handleTouchStart}\n        onTouchEnd={handleTouchEnd}\n        variant={variant}\n        size={size}\n        id={_id}\n        {...others}\n      >\n        {items}\n      </Box>\n    </RatingProvider>\n  );\n});\n\nRating.displayName = '@raikou/core/Rating';\n"],"names":["createVarsResolver","getSize","getThemeColor","factory","useProps","useStyles","RatingRootStyle","RatingStarSymbolStyle","RatingInputStyle","RatingLabelStyle","RatingSymbolBodyStyle","RatingSymbolGroupStyle","useDirection","useId","useRef","useUncontrolled","useState","clamp","jsx","RatingItem","RatingProvider","Box","useMergedRef"],"mappings":"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"}