import { Radio } from '@base-ui/react/radio'; import { RadioGroup } from '@base-ui/react/radio-group'; import clsx from 'clsx'; import type { ReactNode } from 'react'; import { twMerge } from 'tailwind-merge'; export interface ImageRadioOption { value: T; label: string; image: ReactNode; disabled?: boolean; } export interface ImageRadioGroupProps { value: T; onChange: (value: T) => void; options: ImageRadioOption[]; 'aria-label': string; className?: string; size?: 'sm' | 'md'; labelPosition?: 'block' | 'inline'; } export default function ImageRadioGroup({ value, onChange, options, 'aria-label': ariaLabel, className, size = 'md', labelPosition = 'block', }: ImageRadioGroupProps) { const boxSize = size === 'sm' ? 8 : 20; return ( onChange(newValue as T)} aria-label={ariaLabel} className={twMerge(clsx('grid auto-rows-min', size === 'sm' && 'gap-2', size === 'md' && 'gap-4'), className)} style={{ gridTemplateColumns: labelPosition === 'block' ? `repeat(auto-fill, minmax(calc(var(--spacing) * ${boxSize}), 1fr))` : 'repeat(auto-fill, minmax(calc(var(--spacing) * 40), 1fr))', }} > {options.map((option) => { const isSelected = value === option.value; const isDisabled = option.disabled; return (
{option.image}
{option.label}
); })}
); }