{"version":3,"sources":["../src/Radio/Radio.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clsx } from 'clsx';\n\nexport interface RadioProps {\n  /**\n   * The label for the radio button\n   */\n  label?: string;\n  /**\n   * Whether the radio is selected\n   */\n  checked?: boolean;\n  /**\n   * Callback when selection changes\n   */\n  onChange?: (checked: boolean) => void;\n  /**\n   * Whether the radio is disabled\n   */\n  disabled?: boolean;\n  /**\n   * Custom className\n   */\n  className?: string;\n  /**\n   * Custom style\n   */\n  style?: React.CSSProperties;\n  /**\n   * Test ID for testing\n   */\n  'data-testid'?: string;\n  /**\n   * Name attribute for form submission (groups radios together)\n   */\n  name?: string;\n  /**\n   * Value attribute for form submission\n   */\n  value?: string;\n}\n\nconst radioStyles: React.CSSProperties = {\n  width: '16px',\n  height: '16px',\n  border: '1px solid #7e7e7e', // grey-500\n  borderRadius: '50%',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  cursor: 'pointer',\n  transition: 'all 0.2s ease-in-out',\n  flexShrink: 0,\n  backgroundColor: '#ffffff',\n};\n\nconst checkedStyles: React.CSSProperties = {\n  border: '1px solid #0e8a0e', // brand-600\n};\n\nconst checkedHoverStyles: React.CSSProperties = {\n  border: '1px solid #005700', // brand-800\n};\n\nconst uncheckedHoverStyles: React.CSSProperties = {\n  border: '1px solid #2f2f2f', // grey-900\n};\n\nconst innerDotStyles: React.CSSProperties = {\n  width: '10px',\n  height: '10px',\n  borderRadius: '50%',\n  backgroundColor: '#0e8a0e', // brand-600\n  transition: 'all 0.2s ease-in-out',\n};\n\nconst innerDotHoverStyles: React.CSSProperties = {\n  backgroundColor: '#005700', // brand-800\n};\n\nconst labelStyles: React.CSSProperties = {\n  fontSize: '13px',\n  color: '#2f2f2f',\n  cursor: 'pointer',\n  userSelect: 'none' as const,\n  fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst wrapperStyles: React.CSSProperties = {\n  display: 'flex',\n  alignItems: 'center',\n  gap: '8px',\n};\n\n/**\n * Radio component - Arbor Design System\n *\n * A radio button input with label support.\n */\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n  (\n    {\n      label,\n      checked = false,\n      onChange,\n      disabled = false,\n      className,\n      style,\n      'data-testid': dataTestId,\n      name,\n      value,\n    },\n    ref\n  ) => {\n    const [isFocused, setIsFocused] = React.useState(false);\n    const [isHovered, setIsHovered] = React.useState(false);\n    const radioId = React.useId();\n\n    const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n      if (!disabled) {\n        onChange?.(e.target.checked);\n      }\n    };\n\n    const circleStyle: React.CSSProperties = {\n      ...radioStyles,\n      ...(checked && !disabled && checkedStyles),\n      ...(isHovered && !disabled && !checked && uncheckedHoverStyles),\n      ...(isHovered && !disabled && checked && checkedHoverStyles),\n      ...(disabled && !checked && { backgroundColor: '#efefef', border: '1px solid #7e7e7e' }),\n      ...(disabled && checked && { backgroundColor: '#efefef', border: '1px solid #7e7e7e' }),\n      ...(isFocused && !disabled && {\n        boxShadow: '0px 0px 0px 3px #3cad51',\n      }),\n    };\n\n    const dotStyle: React.CSSProperties = {\n      ...innerDotStyles,\n      ...(isHovered && !disabled && innerDotHoverStyles),\n      ...(disabled && { backgroundColor: '#7e7e7e' }),\n    };\n\n    return (\n      <div\n        className={clsx('arbor-radio-wrapper', className)}\n        style={{ ...wrapperStyles, ...style }}\n        data-testid={dataTestId}\n      >\n        <input\n          ref={ref}\n          id={radioId}\n          type=\"radio\"\n          checked={checked}\n          onChange={handleChange}\n          onFocus={() => setIsFocused(true)}\n          onBlur={() => setIsFocused(false)}\n          disabled={disabled}\n          name={name}\n          value={value}\n          style={{\n            position: 'absolute',\n            opacity: 0,\n            width: 0,\n            height: 0,\n          }}\n          aria-checked={checked}\n        />\n        <label\n          htmlFor={radioId}\n          onMouseEnter={() => !disabled && setIsHovered(true)}\n          onMouseLeave={() => !disabled && setIsHovered(false)}\n          style={{\n            display: 'flex',\n            alignItems: 'center',\n            gap: '8px',\n            cursor: disabled ? 'not-allowed' : 'pointer',\n          }}\n        >\n          <div style={circleStyle}>\n            {checked && <div style={dotStyle} />}\n          </div>\n          {label && (\n            <span\n              style={{\n                ...labelStyles,\n                color: disabled ? '#7e7e7e' : '#2f2f2f',\n                cursor: disabled ? 'not-allowed' : 'pointer',\n              }}\n            >\n              {label}\n            </span>\n          )}\n        </label>\n      </div>\n    );\n  }\n);\n\nRadio.displayName = 'Radio';\n"],"mappings":"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","names":[]}