Toggle.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. interface ToggleProps {
  2. checked: boolean;
  3. onChange: (checked: boolean) => void;
  4. disabled?: boolean;
  5. }
  6. export function Toggle({ checked, onChange, disabled }: ToggleProps) {
  7. const handleClick = (e: React.MouseEvent) => {
  8. e.preventDefault();
  9. e.stopPropagation();
  10. if (!disabled) {
  11. onChange(!checked);
  12. }
  13. };
  14. return (
  15. <button
  16. type="button"
  17. role="switch"
  18. aria-checked={checked}
  19. disabled={disabled}
  20. onClick={handleClick}
  21. className={`relative inline-flex w-11 h-7 md:w-9 md:h-5 rounded-full transition-colors flex-shrink-0 focus:outline-none focus:ring-2 focus:ring-bambu-green focus:ring-offset-2 focus:ring-offset-bambu-dark ${
  22. disabled
  23. ? 'bg-bambu-dark-tertiary/50 cursor-not-allowed opacity-50'
  24. : checked
  25. ? 'bg-bambu-green cursor-pointer'
  26. : 'bg-bambu-dark-tertiary cursor-pointer hover:bg-bambu-dark-tertiary/80'
  27. }`}
  28. >
  29. <span
  30. className={`pointer-events-none absolute top-[3px] md:top-[2px] left-[3px] md:left-[2px] w-5 h-5 md:w-4 md:h-4 bg-white rounded-full shadow transition-transform duration-200 ease-in-out ${
  31. checked ? 'translate-x-4' : 'translate-x-0'
  32. }`}
  33. />
  34. </button>
  35. );
  36. }