mirror of
https://github.com/jamiepine/voicebox.git
synced 2026-09-28 06:35:18 -07:00
49 lines
1.4 KiB
TypeScript
49 lines
1.4 KiB
TypeScript
import * as React from 'react';
|
|
import { cn } from '@/lib/utils/cn';
|
|
|
|
export interface ToggleProps {
|
|
checked?: boolean;
|
|
onCheckedChange?: (checked: boolean) => void;
|
|
disabled?: boolean;
|
|
className?: string;
|
|
id?: string;
|
|
}
|
|
|
|
const Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(
|
|
({ checked = false, onCheckedChange, disabled = false, className, id, ...props }, ref) => {
|
|
return (
|
|
<button
|
|
type="button"
|
|
ref={ref}
|
|
id={id}
|
|
role="switch"
|
|
aria-checked={checked}
|
|
disabled={disabled}
|
|
onClick={() => {
|
|
if (!disabled && onCheckedChange) {
|
|
onCheckedChange(!checked);
|
|
}
|
|
}}
|
|
className={cn(
|
|
'relative inline-flex h-5 w-9 shrink-0 items-center rounded-full transition-colors',
|
|
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
|
|
checked ? 'bg-accent' : 'bg-muted-foreground/25',
|
|
disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer',
|
|
className,
|
|
)}
|
|
{...props}
|
|
>
|
|
<span
|
|
className={cn(
|
|
'pointer-events-none block h-4 w-4 rounded-full bg-white shadow-sm transition-transform',
|
|
checked ? 'translate-x-[18px]' : 'translate-x-[2px]',
|
|
)}
|
|
/>
|
|
</button>
|
|
);
|
|
},
|
|
);
|
|
Toggle.displayName = 'Toggle';
|
|
|
|
export { Toggle };
|