import { JSX } from 'solid-js'; type ToggleSize = 'xs' | 'sm' | 'md'; export interface ToggleChangeEvent { currentTarget: { checked: boolean; }; preventDefault: () => void; stopPropagation: () => void; readonly defaultPrevented: boolean; } interface BaseToggleProps { checked: boolean; disabled?: boolean; onToggle?: () => void; onChange?: (event: ToggleChangeEvent) => void; size?: ToggleSize; class?: string; title?: string; ariaLabel?: string; } const sizeConfig: Record = { xs: { track: 'h-4 w-7', knob: 'h-3 w-3', translate: '12px' }, sm: { track: 'h-5 w-9', knob: 'h-4 w-4', translate: '16px' }, md: { track: 'h-6 w-11', knob: 'h-5 w-5', translate: '20px' }, }; export function TogglePrimitive(props: BaseToggleProps): JSX.Element { const size = props.size ?? 'sm'; const config = sizeConfig[size]; const isDisabled = () => Boolean(props.disabled); const checkedClass = 'bg-blue-500 dark:bg-blue-500'; const uncheckedClass = 'bg-gray-300 dark:bg-gray-600'; const disabledClass = 'bg-gray-200 dark:bg-gray-700 cursor-not-allowed opacity-60'; const knobBase = 'bg-white shadow-md'; const handleClick = () => { if (isDisabled()) return; const next = !props.checked; let defaultPrevented = false; const event: ToggleChangeEvent = { currentTarget: { checked: next }, preventDefault() { defaultPrevented = true; }, stopPropagation() { /* noop for synthetic toggle event */ }, get defaultPrevented() { return defaultPrevented; }, }; props.onChange?.(event); if (!event.defaultPrevented) { props.onToggle?.(); } }; return ( ); } interface LabeledToggleProps extends BaseToggleProps { label?: JSX.Element; description?: JSX.Element; containerClass?: string; } export function Toggle(props: LabeledToggleProps) { const size = props.size ?? 'md'; return ( ); } export default Toggle;