import type { ReactNode } from 'react'; import type { ValidationResult } from 'react-aria-components'; import { Radio as RACRadio, RadioGroup as RACRadioGroup, type RadioGroupProps as RACRadioGroupProps, type RadioProps, } from 'react-aria-components/RadioGroup'; import { tv } from 'tailwind-variants'; import { Description, FieldError, Label } from './Field'; import { composeTailwindRenderProps, focusRing } from './utils'; export interface RadioGroupProps extends Omit { label?: string; children?: ReactNode; description?: string; errorMessage?: string | ((validation: ValidationResult) => string); } export function RadioGroup(props: RadioGroupProps) { return (
{props.children}
{props.description && {props.description}} {props.errorMessage}
); } const styles = tv({ extend: focusRing, base: 'size-5 rounded-full border-2 bg-white transition-all dark:bg-zinc-900', variants: { isSelected: { false: 'group-pressed:[--color:var(--color-secondary-600)] dark:group-pressed:[--color:var(--color-secondary-600)] border-(--color) [--color:var(--color-secondary-800)] dark:[--color:var(--color-secondary-400)]', true: 'group-pressed:[--color:var(--color-secondary-700)] dark:group-pressed:[--color:var(--color-secondary-800)] border-[7px] border-(--color) [--color:var(--color-secondary-800)] dark:[--color:var(--color-secondary-500)]', }, isInvalid: { true: 'group-pressed:border-red-800 dark:group-pressed:border-red-700 border-red-700 dark:border-red-600 forced-colors:!border-[Mark]', }, isDisabled: { true: 'border-gray-200 dark:border-zinc-700 forced-colors:!border-[GrayText]', }, }, }); export function Radio(props: RadioProps) { return ( {(renderProps) => ( <>
{props.children as ReactNode} )} ); }