{"version":3,"file":"RadioCard.cjs","sources":["../../../../src/components/Radio/RadioCard/RadioCard.tsx"],"sourcesContent":["import {\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getRadius,\n  RaikouRadius,\n  StylesApiProps,\n  useDirection,\n  useProps,\n  useStyles,\n} from '../../../core';\nimport { UnstyledButton } from '../../UnstyledButton';\nimport { useRadioGroupContext } from '../RadioGroup.context';\nimport { RadioCardProvider } from './RadioCard.context';\nimport { RadioCardStyle } from './RadioCard.css';\n\nexport type RadioCardStylesNames = 'card';\nexport type RadioCardCssVariables = {\n  card: '--card-radius';\n};\n\nexport interface RadioCardProps\n  extends BoxProps,\n    StylesApiProps<RadioCardFactory>,\n    ElementProps<'button', 'onChange'> {\n  /** Checked state */\n  checked?: boolean;\n\n  /** Determines whether the card should have border, `true` by default */\n  withBorder?: boolean;\n\n  /** Key of `theme.radius` or any valid CSS value to set `border-radius`, numbers are converted to rem, `theme.defaultRadius` by default */\n  radius?: RaikouRadius;\n\n  /** Value of the checkbox, used with `Radio.Group` */\n  value?: string;\n\n  /** Value used to associate all related radio cards, required for accessibility if used outside of `Radio.Group` */\n  name?: string;\n}\n\nexport type RadioCardFactory = Factory<{\n  props: RadioCardProps;\n  ref: HTMLButtonElement;\n  stylesNames: RadioCardStylesNames;\n  vars: RadioCardCssVariables;\n}>;\n\nconst defaultProps: Partial<RadioCardProps> = {\n  withBorder: true,\n};\n\nconst varsResolver = createVarsResolver<RadioCardFactory>((_, { radius }) => ({\n  card: {\n    '--card-radius': getRadius(radius),\n  },\n}));\n\nexport const RadioCard = factory<RadioCardFactory>((_props, ref) => {\n  const props = useProps('RadioCard', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    checked,\n    mod,\n    withBorder,\n    value,\n    onClick,\n    name,\n    onKeyDown,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<RadioCardFactory>({\n    name: 'RadioCard',\n    classes: {\n      card: RadioCardStyle,\n    },\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    varsResolver,\n    rootSelector: 'card',\n  });\n\n  const { dir } = useDirection();\n  const ctx = useRadioGroupContext();\n  const _checked = typeof checked === 'boolean' ? checked : ctx?.value === value || false;\n  const _name = name || ctx?.name;\n\n  const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n    onKeyDown?.(event);\n\n    if (['ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight'].includes(event.nativeEvent.code)) {\n      event.preventDefault();\n\n      const siblings = Array.from(\n        document.querySelectorAll<HTMLButtonElement>(\n          `[role=\"radio\"][name=\"${_name || '__raikou'}\"]`\n        )\n      );\n\n      const currentIndex = siblings.findIndex((element) => element === event.target);\n      const nextIndex = currentIndex + 1 >= siblings.length ? 0 : currentIndex + 1;\n      const prevIndex = currentIndex - 1 < 0 ? siblings.length - 1 : currentIndex - 1;\n\n      if (event.nativeEvent.code === 'ArrowDown') {\n        siblings[nextIndex].focus();\n        siblings[nextIndex].click();\n      }\n\n      if (event.nativeEvent.code === 'ArrowUp') {\n        siblings[prevIndex].focus();\n        siblings[prevIndex].click();\n      }\n\n      if (event.nativeEvent.code === 'ArrowLeft') {\n        siblings[dir === 'ltr' ? prevIndex : nextIndex].focus();\n        siblings[dir === 'ltr' ? prevIndex : nextIndex].click();\n      }\n\n      if (event.nativeEvent.code === 'ArrowRight') {\n        siblings[dir === 'ltr' ? nextIndex : prevIndex].focus();\n        siblings[dir === 'ltr' ? nextIndex : prevIndex].click();\n      }\n    }\n  };\n\n  return (\n    <RadioCardProvider value={{ checked: _checked }}>\n      <UnstyledButton\n        ref={ref}\n        mod={[{ 'with-border': withBorder, checked: _checked }, mod]}\n        {...getStyles('card')}\n        {...others}\n        role=\"radio\"\n        aria-checked={_checked}\n        name={_name}\n        onClick={(event) => {\n          onClick?.(event);\n          ctx?.onChange(value || '');\n        }}\n        onKeyDown={handleKeyDown}\n      />\n    </RadioCardProvider>\n  );\n});\n\nRadioCard.displayName = '@raikou/core/RadioCard';\n"],"names":["createVarsResolver","getRadius","factory","useProps","useStyles","RadioCardStyle","useDirection","useRadioGroupContext","RadioCardProvider","jsx","UnstyledButton"],"mappings":"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"}